diff --git a/conf/File_input/Beidou/gnss-sdr_BDS_B1C_geb_if20k_fs18m_ibyte.conf b/conf/File_input/Beidou/gnss-sdr_BDS_B1C_geb_if20k_fs18m_ibyte.conf new file mode 100644 index 000000000..23b05a93a --- /dev/null +++ b/conf/File_input/Beidou/gnss-sdr_BDS_B1C_geb_if20k_fs18m_ibyte.conf @@ -0,0 +1,108 @@ +; BeiDou B1C (1D) file-input example (IF = +20 kHz, Fs = 18 MHz, ibyte) +; Test data: https://drive.google.com/drive/folders/1UkjJwOMlKEFZiXYUdK4HKzTASYHXMsHL +; SPDX-License-Identifier: GPL-3.0-or-later + +[GNSS-SDR] + +;######### GLOBAL OPTIONS ################## +GNSS-SDR.internal_fs_sps=18000000 +GNSS-SDR.use_acquisition_resampler=true + +ControlThread.wait_for_flowgraph=false + +;######### SIGNAL_SOURCE CONFIG ############ +SignalSource.implementation=File_Signal_Source +SignalSource.filename=./L1_IF20KHz_FS18MHz.bin +SignalSource.item_type=ibyte +SignalSource.sampling_frequency=18000000 +SignalSource.samples=0 +SignalSource.enable_throttle_control=false + +;######### SIGNAL_CONDITIONER CONFIG ############ +SignalConditioner.implementation=Signal_Conditioner +DataTypeAdapter.implementation=Ibyte_To_Complex +DataTypeAdapter.item_type=ibyte + +;######### INPUT_FILTER CONFIG ############ +InputFilter.implementation=Freq_Xlating_Fir_Filter +InputFilter.input_item_type=gr_complex +InputFilter.output_item_type=gr_complex +InputFilter.taps_item_type=float +InputFilter.number_of_taps=5 +InputFilter.number_of_bands=2 +InputFilter.band1_begin=0.0 +InputFilter.band1_end=0.45 +InputFilter.band2_begin=0.55 +InputFilter.band2_end=1.0 +InputFilter.ampl1_begin=1.0 +InputFilter.ampl1_end=1.0 +InputFilter.ampl2_begin=0.0 +InputFilter.ampl2_end=0.0 +InputFilter.band1_error=1.0 +InputFilter.band2_error=1.0 +InputFilter.filter_type=bandpass +InputFilter.grid_density=16 +InputFilter.sampling_frequency=18000000 +InputFilter.IF=20000 + +Resampler.implementation=Pass_Through + +;######### CHANNELS GLOBAL CONFIG ############ +Channels_1D.count=6 +Channels.in_acquisition=6 + +Channel.signal=1D + +Channel0.satellite=23 +Channel1.satellite=27 +Channel2.satellite=28 +Channel3.satellite=37 +Channel4.satellite=43 +Channel5.satellite=46 + +;######### ACQUISITION GLOBAL CONFIG ############ +Acquisition_1D.implementation=BEIDOU_B1C_PCPS_Ambiguous_Acquisition +Acquisition_1D.item_type=gr_complex +Acquisition_1D.acquire_pilot=true +Acquisition_1D.qmboc=true +Acquisition_1D.pfa=0.005 +Acquisition_1D.doppler_max=5000 +Acquisition_1D.doppler_step=25 + +;######### TRACKING GLOBAL CONFIG ############ +Tracking_1D.implementation=BEIDOU_B1C_DLL_PLL_VEML_Tracking +Tracking_1D.item_type=gr_complex +Tracking_1D.track_pilot=true +Tracking_1D.extend_correlation_symbols=4 +Tracking_1D.bit_synchronization_time_limit_s=90 +Tracking_1D.pull_in_time_s=5 +Tracking_1D.pll_bw_hz=10.0 +Tracking_1D.dll_bw_hz=0.5 +Tracking_1D.pll_bw_narrow_hz=5.0 +Tracking_1D.dll_bw_narrow_hz=0.2 +Tracking_1D.pll_filter_order=2 +Tracking_1D.early_late_space_chips=0.15 +Tracking_1D.very_early_late_space_chips=0.5 +Tracking_1D.cn0_min=20 +Tracking_1D.b1c_secondary_lock_ratio=0.92 + +;######### TELEMETRY DECODER CONFIG ############ +TelemetryDecoder_1D.implementation=BEIDOU_B1C_Telemetry_Decoder +TelemetryDecoder_1D.dump=false + +;######### OBSERVABLES CONFIG ############ +Observables.implementation=Hybrid_Observables + +;######### PVT CONFIG ############ +PVT.implementation=RTKLIB_PVT +PVT.positioning_mode=Single +PVT.output_rate_ms=100 +PVT.display_rate_ms=500 +PVT.iono_model=Broadcast +PVT.trop_model=Saastamoinen +PVT.flag_rtcm_server=false + +PVT.output_enabled=true +PVT.rinex_output_enabled=true +PVT.nmea_output_file_enabled=true +PVT.gpx_output_enabled=true diff --git a/src/algorithms/PVT/adapters/rtklib_pvt.cc b/src/algorithms/PVT/adapters/rtklib_pvt.cc index b8defe256..0b6d2dcf0 100644 --- a/src/algorithms/PVT/adapters/rtklib_pvt.cc +++ b/src/algorithms/PVT/adapters/rtklib_pvt.cc @@ -244,7 +244,7 @@ Rtklib_Pvt::Rtklib_Pvt(const ConfigurationInterface* configuration, int num_bands = 0; - if (signal_enabled_flags.check_any_enabled(GPS_1C, GAL_1B, GLO_1G, BDS_B1, QZS_J1)) + if (signal_enabled_flags.check_any_enabled(GPS_1C, GAL_1B, GLO_1G, BDS_B1, BDS_B1C, QZS_J1)) { num_bands += 1; } @@ -396,7 +396,7 @@ Rtklib_Pvt::Rtklib_Pvt(const ConfigurationInterface* configuration, { nsys += SYS_GLO; } - if (signal_enabled_flags.check_any_enabled(BDS_B1, BDS_B3)) + if (signal_enabled_flags.check_any_enabled(BDS_B1, BDS_B3, BDS_B1C)) { nsys += SYS_BDS; } diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc index 38273f091..e4ba2c62b 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.cc @@ -18,6 +18,10 @@ #include "Galileo_CNAV.h" #include "MATH_CONSTANTS.h" #include "an_packet_printer.h" +#include "beidou_cnav1_ephemeris.h" +#include "beidou_cnav1_iono.h" +#include "beidou_cnav1_navigation_message.h" +#include "beidou_cnav1_utc_model.h" #include "beidou_dnav_almanac.h" #include "beidou_dnav_ephemeris.h" #include "beidou_dnav_iono.h" @@ -166,6 +170,10 @@ rtklib_pvt_gs::rtklib_pvt_gs(uint32_t nchannels, d_beidou_dnav_iono_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), d_beidou_dnav_utc_model_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), d_beidou_dnav_almanac_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), + d_beidou_cnav1_ephemeris_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), + d_beidou_cnav1_iono_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), + d_beidou_cnav1_utc_model_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), + d_beidou_cnav1_page_data_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), d_galileo_has_data_sptr_type_hash_code(typeid(std::shared_ptr).hash_code()), d_rinex_version(conf_.rinex_version), d_rx_time(0.0), @@ -1301,6 +1309,36 @@ rtklib_pvt_gs::~rtklib_pvt_gs() { LOG(INFO) << "Failed to save BeiDou DNAV UTC model parameters, not valid data"; } + + // save BeiDou B-CNAV1 ephemeris to XML file + file_name = d_xml_base_path + "bds_cnav1_ephemeris.xml"; + if (d_internal_pvt_solver->beidou_cnav1_ephemeris_map.empty() == false) + { + std::ofstream ofs; + try + { + ofs.open(file_name.c_str(), std::ofstream::trunc | std::ofstream::out); + boost::archive::xml_oarchive xml(ofs); + xml << boost::serialization::make_nvp("GNSS-SDR_bds_cnav1_ephemeris_map", d_internal_pvt_solver->beidou_cnav1_ephemeris_map); + LOG(INFO) << "Saved BeiDou B-CNAV1 Ephemeris map data"; + } + catch (const boost::archive::archive_exception& e) + { + LOG(WARNING) << e.what(); + } + catch (const std::ofstream::failure& e) + { + LOG(WARNING) << "Problem opening output XML file"; + } + catch (const std::exception& e) + { + LOG(WARNING) << e.what(); + } + } + else + { + LOG(INFO) << "Failed to save BeiDou B-CNAV1 Ephemeris, map is empty"; + } } if (d_log_timetag_file.is_open()) @@ -1779,6 +1817,55 @@ void rtklib_pvt_gs::msg_handler_telemetry(const pmt::pmt_t& msg) } DLOG(INFO) << "New BeiDou DNAV almanac record has arrived"; } + else if (msg_type_hash_code == d_beidou_cnav1_ephemeris_sptr_type_hash_code) + { + const auto bds_cnav1_eph = wht::any_cast>(pmt::any_ref(msg)); + if (d_rinex_output_enabled && d_rp->is_rinex_header_written()) + { + const auto eph_it = d_internal_pvt_solver->beidou_cnav1_ephemeris_map.find(bds_cnav1_eph->PRN); + if (eph_it == d_internal_pvt_solver->beidou_cnav1_ephemeris_map.cend() || eph_it->second.toe != bds_cnav1_eph->toe) + { + d_rp->log_rinex_nav_bds_cnav1({{bds_cnav1_eph->PRN, *bds_cnav1_eph}}); + } + } + d_internal_pvt_solver->beidou_cnav1_ephemeris_map[bds_cnav1_eph->PRN] = *bds_cnav1_eph; + if (d_enable_rx_clock_correction == true) + { + d_user_pvt_solver->beidou_cnav1_ephemeris_map[bds_cnav1_eph->PRN] = *bds_cnav1_eph; + } + DLOG(INFO) << "New BeiDou B-CNAV1 ephemeris record has arrived from SAT ID " << bds_cnav1_eph->PRN; + } + else if (msg_type_hash_code == d_beidou_cnav1_iono_sptr_type_hash_code) + { + const auto bds_cnav1_iono = wht::any_cast>(pmt::any_ref(msg)); + d_internal_pvt_solver->beidou_cnav1_iono = *bds_cnav1_iono; + if (d_enable_rx_clock_correction == true) + { + d_user_pvt_solver->beidou_cnav1_iono = *bds_cnav1_iono; + } + DLOG(INFO) << "New BeiDou B-CNAV1 IONO record has arrived"; + } + else if (msg_type_hash_code == d_beidou_cnav1_utc_model_sptr_type_hash_code) + { + const auto bds_cnav1_utc = wht::any_cast>(pmt::any_ref(msg)); + d_internal_pvt_solver->beidou_cnav1_utc_model = *bds_cnav1_utc; + if (d_enable_rx_clock_correction == true) + { + d_user_pvt_solver->beidou_cnav1_utc_model = *bds_cnav1_utc; + } + DLOG(INFO) << "New BeiDou B-CNAV1 UTC record has arrived"; + } + else if (msg_type_hash_code == d_beidou_cnav1_page_data_sptr_type_hash_code) + { + const auto bds_cnav1_page = wht::any_cast>(pmt::any_ref(msg)); + d_internal_pvt_solver->beidou_cnav1_page_data_map[bds_cnav1_page->PRN] = bds_cnav1_page->page_data; + if (d_enable_rx_clock_correction == true) + { + d_user_pvt_solver->beidou_cnav1_page_data_map[bds_cnav1_page->PRN] = bds_cnav1_page->page_data; + } + DLOG(INFO) << "New BeiDou B-CNAV1 page data record has arrived from SAT ID " << bds_cnav1_page->PRN + << " PageID=" << bds_cnav1_page->page_data.common.page_id; + } else { LOG(WARNING) << "msg_handler_telemetry unknown object type!"; @@ -2237,6 +2324,7 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item const auto tmp_eph_iter_cnav = d_internal_pvt_solver->gps_cnav_ephemeris_map.find(gnss_synchro.PRN); const auto tmp_eph_iter_glo_gnav = d_internal_pvt_solver->glonass_gnav_ephemeris_map.find(gnss_synchro.PRN); const auto tmp_eph_iter_bds_dnav = d_internal_pvt_solver->beidou_dnav_ephemeris_map.find(gnss_synchro.PRN); + const auto tmp_eph_iter_bds_cnav1 = d_internal_pvt_solver->beidou_cnav1_ephemeris_map.find(gnss_synchro.PRN); bool store_valid_observable = false; @@ -2337,6 +2425,14 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item store_valid_observable = true; } } + if (!d_osnma_strict && tmp_eph_iter_bds_cnav1 != d_internal_pvt_solver->beidou_cnav1_ephemeris_map.cend()) + { + const uint32_t prn_aux = tmp_eph_iter_bds_cnav1->second.PRN; + if ((prn_aux == gnss_synchro.PRN) && (std::string(gnss_synchro.Signal, 2) == std::string("1D"))) + { + store_valid_observable = true; + } + } if (std::string(gnss_synchro.Signal, 2) == std::string("E6")) { if (d_osnma_strict) diff --git a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h index d2a7af331..4bda4011d 100644 --- a/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h +++ b/src/algorithms/PVT/gnuradio_blocks/rtklib_pvt_gs.h @@ -85,7 +85,7 @@ rtklib_pvt_gs_sptr rtklib_make_pvt_gs(uint32_t nchannels, class rtklib_pvt_gs : public gr::sync_block { public: - ~rtklib_pvt_gs(); //!< Default destructor + ~rtklib_pvt_gs() override; //!< Default destructor /*! * \brief Get latest set of GPS ephemeris from PVT block @@ -133,7 +133,7 @@ public: time_t* UTC_time) const; int work(int noutput_items, gr_vector_const_void_star& input_items, - gr_vector_void_star& output_items); //!< PVT Signal Processing + gr_vector_void_star& output_items) override; //!< PVT Signal Processing private: friend rtklib_pvt_gs_sptr rtklib_make_pvt_gs(uint32_t nchannels, @@ -241,6 +241,10 @@ private: const size_t d_beidou_dnav_iono_sptr_type_hash_code; const size_t d_beidou_dnav_utc_model_sptr_type_hash_code; const size_t d_beidou_dnav_almanac_sptr_type_hash_code; + const size_t d_beidou_cnav1_ephemeris_sptr_type_hash_code; + const size_t d_beidou_cnav1_iono_sptr_type_hash_code; + const size_t d_beidou_cnav1_utc_model_sptr_type_hash_code; + const size_t d_beidou_cnav1_page_data_sptr_type_hash_code; const size_t d_galileo_has_data_sptr_type_hash_code; const double d_rinex_version; diff --git a/src/algorithms/PVT/libs/rinex_printer.cc b/src/algorithms/PVT/libs/rinex_printer.cc index 32857beb4..5c2121c47 100644 --- a/src/algorithms/PVT/libs/rinex_printer.cc +++ b/src/algorithms/PVT/libs/rinex_printer.cc @@ -18,6 +18,7 @@ #include "rinex_printer.h" #include "GLONASS_L1_L2_CA.h" +#include "beidou_cnav1_ephemeris.h" #include "beidou_dnav_ephemeris.h" #include "beidou_dnav_iono.h" #include "beidou_dnav_utc_model.h" @@ -98,6 +99,8 @@ std::string signal_flag_to_string(signal_flag flag) return "B1"; case BDS_B3: return "B3"; + case BDS_B1C: + return "1D"; case QZS_J1: return "J1"; case QZS_J5: @@ -112,7 +115,7 @@ std::map string_to_signal_flag_map() { std::map convertion_map; - for (const auto flag : {GPS_1C, GPS_2S, GPS_L5, GAL_1B, GAL_E5a, GAL_E5b, GAL_E6, GLO_1G, GLO_2G, BDS_B1, BDS_B3, QZS_J1, QZS_J5}) + for (const auto flag : {GPS_1C, GPS_2S, GPS_L5, GAL_1B, GAL_E5a, GAL_E5b, GAL_E6, GLO_1G, GLO_2G, BDS_B1, BDS_B3, BDS_B1C, QZS_J1, QZS_J5}) { convertion_map[signal_flag_to_string(flag)] = flag; } @@ -132,7 +135,7 @@ std::map> get_constel_signal_flags(const Signal_Enab { std::map> constel_signal_flags; - for (const auto& it : std::map>{{'G', {GPS_1C, GPS_2S, GPS_L5}}, {'E', {GAL_1B, GAL_E5a, GAL_E5b, GAL_E6}}, {'R', {GLO_1G, GLO_2G}}, {'C', {BDS_B1, BDS_B3}}, {'J', {QZS_J1, QZS_J5}}}) + for (const auto& it : std::map>{{'G', {GPS_1C, GPS_2S, GPS_L5}}, {'E', {GAL_1B, GAL_E5a, GAL_E5b, GAL_E6}}, {'R', {GLO_1G, GLO_2G}}, {'C', {BDS_B1, BDS_B3, BDS_B1C}}, {'J', {QZS_J1, QZS_J5}}}) { for (const auto flag : it.second) { @@ -342,6 +345,7 @@ std::map getObservationCodes() {"BEIDOU_B1_I", "1I"}, {"BEIDOU_B1_Q", "1Q"}, {"BEIDOU_B1_IQ", "1X"}, + {"BEIDOU_B1C_D", "1D"}, {"BEIDOU_B3_I", "6I"}, {"BEIDOU_B3_Q", "6Q"}, {"BEIDOU_B3_IQ", "6X"}, @@ -2122,6 +2126,7 @@ void add_obs_sys_obs_type_beidou(std::fstream& out, { const std::map signal_to_code_map = { {BDS_B1, "BEIDOU_B1_I"}, + {BDS_B1C, "BEIDOU_B1C_D"}, {BDS_B3, "BEIDOU_B3_I"}, }; @@ -2492,12 +2497,14 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, const auto gps_cnav_ephemeris_iter = pvt_solver->gps_cnav_ephemeris_map.cbegin(); const auto glonass_gnav_ephemeris_iter = pvt_solver->glonass_gnav_ephemeris_map.cbegin(); const auto beidou_dnav_ephemeris_iter = pvt_solver->beidou_dnav_ephemeris_map.cbegin(); + const auto beidou_cnav1_ephemeris_iter = pvt_solver->beidou_cnav1_ephemeris_map.cbegin(); const bool has_gps_lnav_eph = !pvt_solver->gps_ephemeris_map.empty(); const bool has_gps_cnav_eph = !pvt_solver->gps_cnav_ephemeris_map.empty(); const bool has_galileo_eph = !pvt_solver->galileo_ephemeris_map.empty(); const bool has_glonass_eph = !pvt_solver->glonass_gnav_ephemeris_map.empty(); const bool has_beidou_dnav_eph = !pvt_solver->beidou_dnav_ephemeris_map.empty(); + const bool has_beidou_cnav1_eph = !pvt_solver->beidou_cnav1_ephemeris_map.empty(); // We require at least one ephemeris for an active signal of a constellation // Note: this is currently required because ephemeris are used when creating the headers, @@ -2520,7 +2527,7 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, { return; } - if (d_flags.has_beidou && !has_beidou_dnav_eph) + if (d_flags.has_beidou && !has_beidou_dnav_eph && !has_beidou_cnav1_eph) { return; } @@ -2557,7 +2564,14 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, } else if (d_flags.has_beidou) { - system_time = Rinex_Printer::compute_BDS_time(beidou_dnav_ephemeris_iter->second, rx_time); + if (has_beidou_cnav1_eph) + { + system_time = Rinex_Printer::compute_BDS_time(beidou_cnav1_ephemeris_iter->second, rx_time); + } + else + { + system_time = Rinex_Printer::compute_BDS_time(beidou_dnav_ephemeris_iter->second, rx_time); + } seconds = fmod(rx_time, 60); system_time_str = "BDS"; } @@ -2706,6 +2720,10 @@ void Rinex_Printer::print_rinex_annotation(const Rtklib_Solver* pvt_solver, { log_rinex_nav_bds_dnav(pvt_solver->beidou_dnav_ephemeris_map); } + if (has_beidou_cnav1_eph) + { + log_rinex_nav_bds_cnav1(pvt_solver->beidou_cnav1_ephemeris_map); + } d_rinex_header_written = true; } @@ -3483,6 +3501,39 @@ void Rinex_Printer::log_rinex_nav_bds_dnav(const std::map& new_bds_eph) +{ + auto& out = navFile; + const auto& sys_char = satelliteSystem.at("Beidou"); + + for (const auto& bds_ephemeris_iter : new_bds_eph) + { + const auto& eph = bds_ephemeris_iter.second; + + const boost::posix_time::ptime p_utc_time = Rinex_Printer::compute_BDS_time(eph, eph.toc); + out << get_nav_sv_epoch_svclk_line(p_utc_time, sys_char, eph.PRN, eph.af0, eph.af1, eph.af2) << '\n'; + + const auto iode_d = eph.IODE; + out << get_nav_broadcast_orbit(&iode_d, &eph.Crs, &eph.delta_n, &eph.M_0) << '\n'; + out << get_nav_broadcast_orbit(&eph.Cuc, &eph.ecc, &eph.Cus, &eph.sqrtA) << '\n'; + + const auto toe_d = static_cast(eph.toe); + out << get_nav_broadcast_orbit(&toe_d, &eph.Cic, &eph.OMEGA_0, &eph.Cis) << '\n'; + out << get_nav_broadcast_orbit(&eph.i_0, &eph.Crc, &eph.omega, &eph.OMEGAdot) << '\n'; + + const auto wn_d = static_cast(eph.WN); + out << get_nav_broadcast_orbit(&eph.idot, nullptr, &wn_d, nullptr) << '\n'; + + const double zero_health = 0.0; + out << get_nav_broadcast_orbit(&zero_health, &zero_health, &eph.TGD_B1Cp, &eph.TGD_B2ap) << '\n'; + + const auto tow_d = static_cast(eph.tow); + const auto iodc_d = eph.IODC; + out << get_nav_broadcast_orbit(&tow_d, &iodc_d, nullptr, nullptr) << '\n'; + } +} + + void Rinex_Printer::rinex_nav_header(std::fstream& out, const std::vector& iono_lines, const std::vector& time_corr_lines, @@ -3828,6 +3879,15 @@ boost::posix_time::ptime Rinex_Printer::compute_BDS_time(const Beidou_Dnav_Ephem } +boost::posix_time::ptime Rinex_Printer::compute_BDS_time(const Beidou_Cnav1_Ephemeris& eph, double obs_time) const +{ + const double bds_t = obs_time; + const boost::posix_time::time_duration t = boost::posix_time::milliseconds(static_cast((bds_t + 604800 * static_cast(eph.WN % 8192)) * 1000)); + boost::posix_time::ptime p_time(boost::gregorian::date(2006, 1, 1), t); + return p_time; +} + + boost::posix_time::ptime Rinex_Printer::compute_GPS_time(const Gps_Ephemeris& eph, double obs_time) const { // The RINEX v2.11 v3.00 format uses GPS time for the observations epoch, not UTC time, thus, no leap seconds needed here. diff --git a/src/algorithms/PVT/libs/rinex_printer.h b/src/algorithms/PVT/libs/rinex_printer.h index 36fb752e7..cf8767c52 100644 --- a/src/algorithms/PVT/libs/rinex_printer.h +++ b/src/algorithms/PVT/libs/rinex_printer.h @@ -55,6 +55,7 @@ * \{ */ +class Beidou_Cnav1_Ephemeris; class Beidou_Dnav_Ephemeris; class Beidou_Dnav_Iono; class Beidou_Dnav_Utc_Model; @@ -134,6 +135,11 @@ public: */ void log_rinex_nav_bds_dnav(const std::map& new_bds_eph); + /*! + * \brief Print RINEX annotation for BeiDou B-CNAV1 message + */ + void log_rinex_nav_bds_cnav1(const std::map& new_bds_eph); + /*! * \brief Returns true is the RINEX file headers are already written */ @@ -200,6 +206,7 @@ private: * \param obs_time Observation time in BDT seconds of week */ boost::posix_time::ptime compute_BDS_time(const Beidou_Dnav_Ephemeris& eph, double obs_time) const; + boost::posix_time::ptime compute_BDS_time(const Beidou_Cnav1_Ephemeris& eph, double obs_time) const; /* * Computes the UTC time and returns a boost::posix_time::ptime object diff --git a/src/algorithms/PVT/libs/rtklib_solver.cc b/src/algorithms/PVT/libs/rtklib_solver.cc index fb33810f8..d020f37dd 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.cc +++ b/src/algorithms/PVT/libs/rtklib_solver.cc @@ -73,6 +73,7 @@ Rtklib_Solver::Rtklib_Solver(const rtk_t &rtk, d_rtklib_band_index["1C"] = 0; d_rtklib_band_index["1B"] = 0; d_rtklib_band_index["B1"] = 0; + d_rtklib_band_index["1D"] = 0; d_rtklib_band_index["B3"] = 2; d_rtklib_band_index["2G"] = 1; d_rtklib_band_index["2S"] = 1; @@ -1798,6 +1799,24 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ DLOG(INFO) << "No ephemeris data for SV " << gnss_observables_iter->first; } } + if (sig_ == "1D") + { + const auto cnav1_iter = beidou_cnav1_ephemeris_map.find(gnss_observables_iter->second.PRN); + if (cnav1_iter != beidou_cnav1_ephemeris_map.cend()) + { + eph_data[valid_obs] = eph_to_rtklib(cnav1_iter->second); + obsd_t newobs{}; + d_obs_data[valid_obs + glo_valid_obs] = insert_obs_to_rtklib(newobs, + gnss_observables_iter->second, + cnav1_iter->second.WN + BEIDOU_DNAV_BDT2GPST_WEEK_NUM_OFFSET, + d_rtklib_band_index[sig_]); + valid_obs++; + } + else + { + DLOG(INFO) << "No B-CNAV1 ephemeris data for SV " << gnss_observables_iter->second.PRN; + } + } // BeiDou B3 if (sig_ == "B3") { @@ -1926,6 +1945,18 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ d_nav_data.ion_cmp[6] = beidou_dnav_iono.beta2; d_nav_data.ion_cmp[7] = beidou_dnav_iono.beta3; } + else if (beidou_cnav1_iono.valid) + { + // B-CNAV1 BDGIM parameters mapped to RTKLIB ion_cmp slots (best-effort until BDGIM is native). + d_nav_data.ion_cmp[0] = beidou_cnav1_iono.alpha1; + d_nav_data.ion_cmp[1] = beidou_cnav1_iono.alpha2; + d_nav_data.ion_cmp[2] = beidou_cnav1_iono.alpha3; + d_nav_data.ion_cmp[3] = beidou_cnav1_iono.alpha4; + d_nav_data.ion_cmp[4] = beidou_cnav1_iono.alpha5; + d_nav_data.ion_cmp[5] = beidou_cnav1_iono.alpha6; + d_nav_data.ion_cmp[6] = beidou_cnav1_iono.alpha7; + d_nav_data.ion_cmp[7] = beidou_cnav1_iono.alpha8; + } if (gps_utc_model.valid) { d_nav_data.utc_gps[0] = gps_utc_model.A0; @@ -1979,6 +2010,14 @@ bool Rtklib_Solver::get_PVT(const std::map &gnss_observables_ d_nav_data.utc_cmp[3] = 0.0; // ?? d_nav_data.leaps = beidou_dnav_utc_model.DeltaT_LS; } + else if (beidou_cnav1_utc_model.valid) + { + d_nav_data.utc_cmp[0] = beidou_cnav1_utc_model.A0; + d_nav_data.utc_cmp[1] = beidou_cnav1_utc_model.A1; + d_nav_data.utc_cmp[2] = static_cast(beidou_cnav1_utc_model.tot); + d_nav_data.utc_cmp[3] = static_cast(beidou_cnav1_utc_model.WN_t); + d_nav_data.leaps = beidou_cnav1_utc_model.delta_t_LSF; + } /* update carrier wave length using native function call in RTKlib */ for (int i = 0; i < MAXSAT; i++) diff --git a/src/algorithms/PVT/libs/rtklib_solver.h b/src/algorithms/PVT/libs/rtklib_solver.h index 2a85dafba..06d2a8645 100644 --- a/src/algorithms/PVT/libs/rtklib_solver.h +++ b/src/algorithms/PVT/libs/rtklib_solver.h @@ -35,6 +35,10 @@ #define GNSS_SDR_RTKLIB_SOLVER_H +#include "beidou_cnav1_ephemeris.h" +#include "beidou_cnav1_iono.h" +#include "beidou_cnav1_navigation_message.h" +#include "beidou_cnav1_utc_model.h" #include "beidou_dnav_almanac.h" #include "beidou_dnav_ephemeris.h" #include "beidou_dnav_iono.h" @@ -125,6 +129,7 @@ public: std::map gps_cnav_ephemeris_map; //!< Map storing new GPS_CNAV_Ephemeris std::map glonass_gnav_ephemeris_map; //!< Map storing new GLONASS GNAV Ephemeris std::map beidou_dnav_ephemeris_map; //!< Map storing new BeiDou DNAV Ephmeris + std::map beidou_cnav1_ephemeris_map; //!< Map storing BeiDou B-CNAV1 ephemeris Galileo_Utc_Model galileo_utc_model; Galileo_Iono galileo_iono; @@ -148,7 +153,10 @@ public: Beidou_Dnav_Utc_Model beidou_dnav_utc_model; Beidou_Dnav_Iono beidou_dnav_iono; + Beidou_Cnav1_Iono beidou_cnav1_iono; + Beidou_Cnav1_Utc_Model beidou_cnav1_utc_model; std::map beidou_dnav_almanac_map; + std::map beidou_cnav1_page_data_map; private: friend class GalileoEphemerisSourceTest_E6SlotsFollowRtklibGalileoPolicy_Test; diff --git a/src/algorithms/PVT/libs/signal_enabled_flags.cc b/src/algorithms/PVT/libs/signal_enabled_flags.cc index 2765ac34b..86d85d130 100644 --- a/src/algorithms/PVT/libs/signal_enabled_flags.cc +++ b/src/algorithms/PVT/libs/signal_enabled_flags.cc @@ -36,6 +36,7 @@ uint32_t flags_from_config(const ConfigurationInterface* configuration) {GLO_2G, "Channels_2G.count"}, {BDS_B1, "Channels_B1.count"}, {BDS_B3, "Channels_B3.count"}, + {BDS_B1C, "Channels_1D.count"}, {QZS_J1, "Channels_J1.count"}, {QZS_J5, "Channels_J5.count"}}; @@ -66,7 +67,7 @@ Signal_Enabled_Flags::Signal_Enabled_Flags(uint32_t flags_) has_gps(check_any_enabled(GPS_1C, GPS_2S, GPS_L5)), has_galileo(check_any_enabled(GAL_1B, GAL_E5a, GAL_E5b, GAL_E6)), has_glonass(check_any_enabled(GLO_1G, GLO_2G)), - has_beidou(check_any_enabled(BDS_B1, BDS_B3)), + has_beidou(check_any_enabled(BDS_B1, BDS_B3, BDS_B1C)), has_qzss(check_any_enabled(QZS_J1, QZS_J5)), only_gps(has_gps && !(has_galileo || has_glonass || has_beidou || has_qzss)), only_galileo(has_galileo && !(has_gps || has_glonass || has_beidou || has_qzss)), diff --git a/src/algorithms/acquisition/adapters/CMakeLists.txt b/src/algorithms/acquisition/adapters/CMakeLists.txt index 047a68a0f..01c994c0e 100644 --- a/src/algorithms/acquisition/adapters/CMakeLists.txt +++ b/src/algorithms/acquisition/adapters/CMakeLists.txt @@ -8,11 +8,15 @@ set(ACQ_ADAPTER_SOURCES pcps_acquisition_adapter.cc pcps_acquisition_adapter_custom.cc + base_pcps_acquisition.cc + beidou_b1c_pcps_ambiguous_acquisition.cc ) set(ACQ_ADAPTER_HEADERS pcps_acquisition_adapter.h pcps_acquisition_adapter_custom.h + base_pcps_acquisition.h + beidou_b1c_pcps_ambiguous_acquisition.h ) if(ENABLE_FPGA) diff --git a/src/algorithms/acquisition/adapters/base_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/base_pcps_acquisition.cc new file mode 100644 index 000000000..79befc399 --- /dev/null +++ b/src/algorithms/acquisition/adapters/base_pcps_acquisition.cc @@ -0,0 +1,222 @@ +/*! + * \file base_ca_pcps_acquisition.h + * \brief Adapts a PCPS acquisition block to an AcquisitionInterface + * \authors
    + *
  • Mathieu Favreau, 2025. favreau.mathieu(at)hotmail.com + *
+ * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2025 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "base_pcps_acquisition.h" +#include "acq_conf.h" +#include "configuration_interface.h" +#include "gnss_sdr_flags.h" + +#if USE_GLOG_AND_GFLAGS +#include +#else +#include +#endif + +#if HAS_STD_SPAN +#include +namespace own = std; +#else +#include +namespace own = gsl_lite; +#endif + +namespace +{ +Acq_Conf get_acq_conf(const ConfigurationInterface* configuration, const std::string& role, double chip_rate, double opt_freq, uint32_t ms_per_code) +{ + Acq_Conf acq_parameters; + acq_parameters.ms_per_code = ms_per_code; + acq_parameters.sampled_ms = ms_per_code; // Set as default value + acq_parameters.SetFromConfiguration(configuration, role, chip_rate, opt_freq); + +#if USE_GLOG_AND_GFLAGS + if (FLAGS_doppler_max != 0) + { + acq_parameters.doppler_max = FLAGS_doppler_max; + } + if (FLAGS_doppler_step != 0) + { + acq_parameters.doppler_step = FLAGS_doppler_step; + } +#else + if (absl::GetFlag(FLAGS_doppler_max) != 0) + { + acq_parameters.doppler_max = absl::GetFlag(FLAGS_doppler_max); + } + if (absl::GetFlag(FLAGS_doppler_step) != 0) + { + acq_parameters.doppler_step = absl::GetFlag(FLAGS_doppler_step); + } +#endif + + return acq_parameters; +} +} // namespace + +BasePcpsAcquisition::BasePcpsAcquisition( + const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams, + double chip_rate, + double opt_freq, + double code_length_chips, + uint32_t ms_per_code) : acq_parameters_(get_acq_conf(configuration, role, chip_rate, opt_freq, ms_per_code)), + gnss_synchro_(nullptr), + role_(role), + vector_length_(std::floor(acq_parameters_.sampled_ms * acq_parameters_.samples_per_ms) * (acq_parameters_.bit_transition_flag ? 2.0 : 1.0)), + code_length_(static_cast(std::floor(static_cast(acq_parameters_.resampled_fs) / (chip_rate / code_length_chips)))), + code_(vector_length_), + acquisition_(pcps_make_acquisition(acq_parameters_)) +{ + DLOG(INFO) << "role " << role; + DLOG(INFO) << "acquisition(" << acquisition_->unique_id() << ")"; + + if (acq_parameters_.item_type == "cbyte") + { + cbyte_to_float_x2_ = make_complex_byte_to_float_x2(); + float_to_complex_ = gr::blocks::float_to_complex::make(); + } + + if (in_streams > 1) + { + LOG(ERROR) << "This implementation only supports one input stream"; + } + if (out_streams > 0) + { + LOG(ERROR) << "This implementation does not provide an output stream"; + } +} + + +void BasePcpsAcquisition::stop_acquisition() +{ + acquisition_->set_active(false); +} + + +void BasePcpsAcquisition::set_doppler_center(int doppler_center) +{ + acquisition_->set_doppler_center(doppler_center); +} + + +void BasePcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro) +{ + gnss_synchro_ = gnss_synchro; + acquisition_->set_gnss_synchro(gnss_synchro_); +} + + +signed int BasePcpsAcquisition::mag() +{ + return acquisition_->mag(); +} + + +void BasePcpsAcquisition::reset() +{ + acquisition_->set_active(true); +} + + +void BasePcpsAcquisition::connect(gr::top_block_sptr top_block) +{ + if (acq_parameters_.item_type == "gr_complex" || acq_parameters_.item_type == "cshort") + { + // nothing to connect + } + else if (acq_parameters_.item_type == "cbyte") + { + // Since a byte-based acq implementation is not available, + // we just convert cshorts to gr_complex + top_block->connect(cbyte_to_float_x2_, 0, float_to_complex_, 0); + top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1); + top_block->connect(float_to_complex_, 0, acquisition_, 0); + } + else + { + LOG(WARNING) << acq_parameters_.item_type << " unknown acquisition item type"; + } +} + + +void BasePcpsAcquisition::disconnect(gr::top_block_sptr top_block) +{ + if (acq_parameters_.item_type == "gr_complex" || acq_parameters_.item_type == "cshort") + { + // nothing to disconnect + } + else if (acq_parameters_.item_type == "cbyte") + { + top_block->disconnect(cbyte_to_float_x2_, 0, float_to_complex_, 0); + top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1); + top_block->disconnect(float_to_complex_, 0, acquisition_, 0); + } + else + { + LOG(WARNING) << acq_parameters_.item_type << " unknown acquisition item type"; + } +} + + +gr::basic_block_sptr BasePcpsAcquisition::get_left_block() +{ + if (acq_parameters_.item_type == "gr_complex" || acq_parameters_.item_type == "cshort") + { + return acquisition_; + } + if (acq_parameters_.item_type == "cbyte") + { + return cbyte_to_float_x2_; + } + + LOG(WARNING) << acq_parameters_.item_type << " unknown acquisition item type"; + return nullptr; +} + + +gr::basic_block_sptr BasePcpsAcquisition::get_right_block() +{ + return acquisition_; +} + + +void BasePcpsAcquisition::set_resampler_latency(uint32_t latency_samples) +{ + acquisition_->set_resampler_latency(latency_samples); +} + + +void BasePcpsAcquisition::set_local_code() +{ + volk_gnsssdr::vector> code(code_length_); + + const auto sampling_freq = acq_parameters_.use_automatic_resampler ? acq_parameters_.resampled_fs : acq_parameters_.fs_in; + code_gen_complex_sampled(code, gnss_synchro_->PRN, sampling_freq); + + const auto num_codes = acq_parameters_.sampled_ms / acq_parameters_.ms_per_code; + + own::span code_span(code_.data(), vector_length_); + for (unsigned int i = 0; i < num_codes; i++) + { + std::copy_n(code.data(), code_length_, code_span.subspan(i * code_length_, code_length_).data()); + } + + acquisition_->set_local_code(code_.data()); +} diff --git a/src/algorithms/acquisition/adapters/base_pcps_acquisition.h b/src/algorithms/acquisition/adapters/base_pcps_acquisition.h new file mode 100644 index 000000000..6d4fd5906 --- /dev/null +++ b/src/algorithms/acquisition/adapters/base_pcps_acquisition.h @@ -0,0 +1,146 @@ +/*! + * \file base_ca_pcps_acquisition.h + * \brief Adapts a PCPS acquisition block to an AcquisitionInterface + * \authors
    + *
  • Mathieu Favreau, 2025. favreau.mathieu(at)hotmail.com + *
+ * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2025 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BASE_PCPS_ACQUISITION_H +#define GNSS_SDR_BASE_PCPS_ACQUISITION_H + +#include "acq_conf.h" +#include "channel_fsm.h" +#include "complex_byte_to_float_x2.h" +#include "gnss_synchro.h" +#include "pcps_acquisition.h" +#include +#include + +/** \addtogroup Acquisition + * Classes for GNSS signal acquisition + * \{ */ +/** \addtogroup Acq_adapters acquisition_adapters + * Wrap GNU Radio acquisition blocks with an AcquisitionInterface + * \{ */ + + +class ConfigurationInterface; + +/*! + * \brief This class adapts a PCPS acquisition block to an AcquisitionInterface + */ +class BasePcpsAcquisition : public AcquisitionInterface +{ +public: + BasePcpsAcquisition( + const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams, + double chip_rate, + double opt_freq, + double code_length_chips, + uint32_t ms_per_code); + + ~BasePcpsAcquisition() override = default; + + inline std::string role() override + { + return role_; + } + + inline size_t item_size() override + { + return acq_parameters_.it_size; + } + + void connect(gr::top_block_sptr top_block) override; + void disconnect(gr::top_block_sptr top_block) override; + gr::basic_block_sptr get_left_block() override; + gr::basic_block_sptr get_right_block() override; + + /*! + * \brief Set acquisition/tracking common Gnss_Synchro object pointer + * to efficiently exchange synchronization data between acquisition and + * tracking blocks + */ + void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) override; + + /*! + * \brief Set acquisition channel unique ID + */ + inline void set_channel(unsigned int channel) override + { + acquisition_->set_channel(channel); + } + + /*! + * \brief Set channel fsm associated to this acquisition instance + */ + inline void set_channel_fsm(std::weak_ptr channel_fsm) override + { + acquisition_->set_channel_fsm(std::move(channel_fsm)); + } + + /*! + * \brief Set Doppler center for the grid search + */ + void set_doppler_center(int doppler_center) override; + + /*! + * \brief Returns the maximum peak of grid search + */ + signed int mag() override; + + /*! + * \brief Restart acquisition algorithm + */ + void reset() override; + + /*! + * \brief Stop running acquisition + */ + void stop_acquisition() override; + + /*! + * \brief Sets the resampler latency to account it in the acquisition code delay estimation + */ + void set_resampler_latency(uint32_t latency_samples) override; + + /*! + * \brief Sets local code + */ + void set_local_code() override; + +private: + /*! + * \brief Generate code + */ + virtual void code_gen_complex_sampled(own::span> dest, uint32_t prn, int32_t sampling_freq) = 0; + + const Acq_Conf acq_parameters_; + gr::blocks::float_to_complex::sptr float_to_complex_; + complex_byte_to_float_x2_sptr cbyte_to_float_x2_; + Gnss_Synchro* gnss_synchro_; + const std::string role_; + const unsigned int vector_length_; + const unsigned int code_length_; + volk_gnsssdr::vector> code_; + pcps_acquisition_sptr acquisition_; +}; + + +/** \} */ +/** \} */ +#endif // GNSS_SDR_BASE_PCPS_ACQUISITION_H diff --git a/src/algorithms/acquisition/adapters/beidou_b1c_pcps_ambiguous_acquisition.cc b/src/algorithms/acquisition/adapters/beidou_b1c_pcps_ambiguous_acquisition.cc new file mode 100644 index 000000000..456195c20 --- /dev/null +++ b/src/algorithms/acquisition/adapters/beidou_b1c_pcps_ambiguous_acquisition.cc @@ -0,0 +1,64 @@ +/*! + * \file beidou_b1c_pcps_ambiguous_acquisition.cc + * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for + * BeiDou B1C Signals + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "beidou_b1c_pcps_ambiguous_acquisition.h" +#include "Beidou_B1C.h" +#include "beidou_b1c_signal_replica.h" + +BeidouB1cPcpsAmbiguousAcquisition::BeidouB1cPcpsAmbiguousAcquisition( + const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams) + : BasePcpsAcquisition(configuration, + role, + in_streams, + out_streams, + BEIDOU_B1C_CODE_RATE_CPS, + BEIDOU_B1C_OPT_ACQ_FS_SPS, + BEIDOU_B1C_CODE_LENGTH_CHIPS, + BEIDOU_B1C_CODE_PERIOD_MS), + acquire_pilot_(configuration->property(role + ".acquire_pilot", true)), + qmboc_(configuration->property(role + ".qmboc", true)), + gnss_synchro_(nullptr) +{ +} + + +void BeidouB1cPcpsAmbiguousAcquisition::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) +{ + gnss_synchro_ = p_gnss_synchro; + BasePcpsAcquisition::set_gnss_synchro(p_gnss_synchro); +} + + +void BeidouB1cPcpsAmbiguousAcquisition::code_gen_complex_sampled(own::span> dest, uint32_t prn, int32_t sampling_freq) +{ + if (acquire_pilot_) + { + const std::array pilot_signal = {{'1', 'P', '\0'}}; + beidou_b1c_code_gen_complex_sampled(dest, pilot_signal, qmboc_, prn, sampling_freq, 0, false); + } + else + { + std::array signal_id{}; + signal_id[0] = gnss_synchro_->Signal[0]; + signal_id[1] = gnss_synchro_->Signal[1]; + signal_id[2] = '\0'; + beidou_b1c_code_gen_complex_sampled(dest, signal_id, qmboc_, prn, sampling_freq, 0, false); + } +} diff --git a/src/algorithms/acquisition/adapters/beidou_b1c_pcps_ambiguous_acquisition.h b/src/algorithms/acquisition/adapters/beidou_b1c_pcps_ambiguous_acquisition.h new file mode 100644 index 000000000..5dbde5879 --- /dev/null +++ b/src/algorithms/acquisition/adapters/beidou_b1c_pcps_ambiguous_acquisition.h @@ -0,0 +1,56 @@ +/*! + * \file beidou_b1c_pcps_ambiguous_acquisition.h + * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for + * BeiDou B1C Signals + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BEIDOU_B1C_PCPS_AMBIGUOUS_ACQUISITION_H +#define GNSS_SDR_BEIDOU_B1C_PCPS_AMBIGUOUS_ACQUISITION_H + +#include "base_pcps_acquisition.h" + +/** \addtogroup Acquisition + * \{ */ +/** \addtogroup Acq_adapters + * \{ */ + +class BeidouB1cPcpsAmbiguousAcquisition : public BasePcpsAcquisition +{ +public: + BeidouB1cPcpsAmbiguousAcquisition( + const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams); + + ~BeidouB1cPcpsAmbiguousAcquisition() override = default; + + inline std::string implementation() override + { + return "BEIDOU_B1C_PCPS_Ambiguous_Acquisition"; + } + + void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) override; + +private: + void code_gen_complex_sampled(own::span> dest, uint32_t prn, int32_t sampling_freq) override; + + const bool acquire_pilot_; + const bool qmboc_; + Gnss_Synchro* gnss_synchro_; +}; + +/** \} */ +/** \} */ +#endif // GNSS_SDR_BEIDOU_B1C_PCPS_AMBIGUOUS_ACQUISITION_H diff --git a/src/algorithms/libs/CMakeLists.txt b/src/algorithms/libs/CMakeLists.txt index dc564821a..8f51a823d 100644 --- a/src/algorithms/libs/CMakeLists.txt +++ b/src/algorithms/libs/CMakeLists.txt @@ -9,6 +9,7 @@ add_subdirectory(rtklib) set(GNSS_SPLIBS_SOURCES beidou_b1i_signal_replica.cc + beidou_b1c_signal_replica.cc beidou_b3i_signal_replica.cc galileo_e1_signal_replica.cc galileo_e5_signal_replica.cc @@ -37,6 +38,7 @@ set(GNSS_SPLIBS_SOURCES set(GNSS_SPLIBS_HEADERS beidou_b1i_signal_replica.h + beidou_b1c_signal_replica.h beidou_b3i_signal_replica.h galileo_e1_signal_replica.h galileo_e5_signal_replica.h diff --git a/src/algorithms/libs/beidou_b1c_signal_replica.cc b/src/algorithms/libs/beidou_b1c_signal_replica.cc new file mode 100644 index 000000000..9833b19c7 --- /dev/null +++ b/src/algorithms/libs/beidou_b1c_signal_replica.cc @@ -0,0 +1,246 @@ +/*! + * \file beidou_b1c_signal_replica.cc + * \brief Library for BeiDou B1C signal replica generation + * \author GNSS-SDR contributors + * + * Primary codes loaded from precomputed hex tables (Galileo E1 style). + * Pilot secondary codes from per-PRN binary strings (Galileo E5a-Q style). + * BDS-SIS-ICD-B1C-1.0 §5.2. + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "beidou_b1c_signal_replica.h" +#include "Beidou_B1C.h" +#include "gnss_signal_replica.h" +#include +#include +#include + +namespace +{ +void hex_primary_to_chip_int(own::span dest, const char* hex_code) +{ + int32_t index = 0; + for (size_t i = 0; i < BEIDOU_B1C_PRIMARY_CODE_STR_LENGTH - 1; i++) + { + std::array bipolar{}; + hex_to_binary_converter(bipolar, hex_code[i]); + for (int32_t j = 0; j < 4; j++) + { + dest[index++] = (bipolar[j] == 1) ? 0 : 1; + } + } + std::array last{}; + hex_to_binary_converter(last, hex_code[BEIDOU_B1C_PRIMARY_CODE_STR_LENGTH - 1]); + dest[index++] = (last[0] == 1) ? 0 : 1; + dest[index++] = (last[1] == 1) ? 0 : 1; +} +} // namespace + + +void beidou_b1c_code_gen_int(own::span dest, const std::array& signal_id, int32_t prn) +{ + if (prn < 1 || prn > BEIDOU_B1C_NUMBER_OF_PRNS) + { + return; + } + const int32_t prn_index = prn - 1; + const std::string sig = signal_id.data(); + const char* hex_code = nullptr; + if (sig.rfind("1P") != std::string::npos) + { + hex_code = BEIDOU_B1C_PILOT_PRIMARY_CODE[prn_index]; + } + else + { + hex_code = BEIDOU_B1C_DATA_PRIMARY_CODE[prn_index]; + } + hex_primary_to_chip_int(dest, hex_code); +} + + +void beidou_b1c_sinboc_11_gen_int(own::span dest, own::span prn) +{ + constexpr auto length_in = static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); + const auto period = static_cast(dest.size() / length_in); + for (uint32_t i = 0; i < length_in; i++) + { + for (uint32_t j = 0; j < (period / 2); j++) + { + dest[i * period + j] = prn[i]; + } + for (uint32_t j = (period / 2); j < period; j++) + { + dest[i * period + j] = -prn[i]; + } + } +} + + +void beidou_b1c_sinboc_61_gen_int(own::span dest, own::span prn) +{ + constexpr auto length_in = static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); + const auto period = static_cast(dest.size() / length_in); + for (uint32_t i = 0; i < length_in; i++) + { + for (uint32_t j = 0; j < period; j += 2) + { + dest[i * period + j] = prn[i]; + } + for (uint32_t j = 1; j < period; j += 2) + { + dest[i * period + j] = -prn[i]; + } + } +} + + +void beidou_b1c_qmboc_gen_float(own::span dest, own::span prn, bool pilot) +{ + const auto code_length = dest.size(); + const float alpha = std::sqrt(29.0F / 44.0F); + const float beta = std::sqrt(4.0F / 44.0F); + std::vector sinboc_11(code_length); + std::vector sinboc_61(code_length); + beidou_b1c_sinboc_11_gen_int(sinboc_11, prn); + beidou_b1c_sinboc_61_gen_int(sinboc_61, prn); + if (pilot) + { + for (size_t i = 0; i < code_length; i++) + { + dest[i] = alpha * static_cast(sinboc_11[i]) + beta * static_cast(sinboc_61[i]); + } + } + else + { + for (size_t i = 0; i < code_length; i++) + { + dest[i] = static_cast(sinboc_11[i]); + } + } +} + + +void beidou_b1c_code_gen_sinboc11_float(own::span dest, const std::array& signal_id, uint32_t prn) +{ + std::array primary_code{}; + beidou_b1c_code_gen_int(primary_code, signal_id, static_cast(prn)); + const auto code_length = static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); + for (uint32_t i = 0; i < code_length; i++) + { + const float chip = primary_code[i] == 0 ? 1.0F : -1.0F; + dest[2 * i] = chip; + dest[2 * i + 1] = -chip; + } +} + + +void beidou_b1c_code_gen_float_sampled(own::span dest, const std::array& signal_id, + bool qmboc, uint32_t prn, int32_t sampling_freq, uint32_t chip_shift, bool secondary_flag) +{ + constexpr auto code_freq_basis = static_cast(BEIDOU_B1C_CODE_RATE_CPS); + const int32_t samples_per_chip = qmboc ? 12 : 2; + const uint32_t code_length = samples_per_chip * static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); + const std::string b1c_signal = signal_id.data(); + const bool is_pilot = b1c_signal.rfind("1P") != std::string::npos; + auto samples_per_code = static_cast(static_cast(sampling_freq) / + (static_cast(code_freq_basis) / BEIDOU_B1C_CODE_LENGTH_CHIPS)); + const uint32_t delay = ((static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS) - static_cast(chip_shift)) % + static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS)) * + samples_per_code / static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); + + std::array primary_code{}; + beidou_b1c_code_gen_int(primary_code, signal_id, static_cast(prn)); + + std::array primary_bipolar{}; + for (uint32_t i = 0; i < static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); i++) + { + primary_bipolar[i] = primary_code[i] == 0 ? 1 : -1; + } + + std::vector signal_b1c(code_length); + if (qmboc && is_pilot) + { + beidou_b1c_qmboc_gen_float(signal_b1c, primary_bipolar, true); + } + else + { + std::vector signal_b1c_int(code_length); + beidou_b1c_sinboc_11_gen_int(signal_b1c_int, primary_bipolar); + for (uint32_t ii = 0; ii < code_length; ++ii) + { + signal_b1c[ii] = static_cast(signal_b1c_int[ii]); + } + } + + if (sampling_freq != samples_per_chip * code_freq_basis) + { + std::vector resampled_signal(samples_per_code); + resampler(signal_b1c, resampled_signal, static_cast(samples_per_chip * code_freq_basis), sampling_freq); + signal_b1c = std::move(resampled_signal); + } + else + { + samples_per_code = code_length; + } + + if (is_pilot && secondary_flag) + { + const int32_t prn_index = static_cast(prn) - 1; + const char* sec_code = BEIDOU_B1C_PILOT_SECONDARY_CODE[prn_index]; + + std::vector signal_with_secondary(BEIDOU_B1C_PILOT_SECONDARY_CODE_LENGTH * samples_per_code); + for (int32_t i = 0; i < BEIDOU_B1C_PILOT_SECONDARY_CODE_LENGTH; i++) + { + const float sec_chip = sec_code[i] == '0' ? 1.0F : -1.0F; + for (uint32_t k = 0; k < samples_per_code; k++) + { + signal_with_secondary[static_cast(i) * samples_per_code + k] = signal_b1c[k] * sec_chip; + } + } + samples_per_code *= static_cast(BEIDOU_B1C_PILOT_SECONDARY_CODE_LENGTH); + signal_b1c = std::move(signal_with_secondary); + } + + for (uint32_t i = 0; i < samples_per_code; i++) + { + dest[(i + delay) % samples_per_code] = signal_b1c[i]; + } +} + + +void beidou_b1c_code_gen_complex_sampled(own::span> dest, const std::array& signal_id, + bool qmboc, uint32_t prn, int32_t sampling_freq, uint32_t chip_shift, bool secondary_flag) +{ + const std::string b1c_signal = signal_id.data(); + const bool is_pilot = b1c_signal.rfind("1P") != std::string::npos; + auto samples_per_code = static_cast(static_cast(sampling_freq) / + (BEIDOU_B1C_CODE_RATE_CPS / BEIDOU_B1C_CODE_LENGTH_CHIPS)); + if (is_pilot && secondary_flag) + { + samples_per_code *= static_cast(BEIDOU_B1C_PILOT_SECONDARY_CODE_LENGTH); + } + + std::vector real_code(samples_per_code); + beidou_b1c_code_gen_float_sampled(real_code, signal_id, qmboc, prn, sampling_freq, chip_shift, secondary_flag); + for (uint32_t ii = 0; ii < samples_per_code; ++ii) + { + dest[ii] = std::complex(real_code[ii], 0.0F); + } +} + + +void beidou_b1c_code_gen_complex_sampled(own::span> dest, const std::array& signal_id, + bool qmboc, uint32_t prn, int32_t sampling_freq, uint32_t chip_shift) +{ + beidou_b1c_code_gen_complex_sampled(dest, signal_id, qmboc, prn, sampling_freq, chip_shift, false); +} diff --git a/src/algorithms/libs/beidou_b1c_signal_replica.h b/src/algorithms/libs/beidou_b1c_signal_replica.h new file mode 100644 index 000000000..8ee1ca601 --- /dev/null +++ b/src/algorithms/libs/beidou_b1c_signal_replica.h @@ -0,0 +1,47 @@ +/*! + * \file beidou_b1c_signal_replica.h + * \brief Library for BeiDou B1C signal replica generation + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BEIDOU_B1C_SIGNAL_REPLICA_H +#define GNSS_SDR_BEIDOU_B1C_SIGNAL_REPLICA_H + +#include +#include +#include +#if HAS_STD_SPAN +#include +namespace own = std; +#else +#include +namespace own = gsl_lite; +#endif + +/** \addtogroup Algorithms_Library + * \{ */ +/** \addtogroup Algorithm_libs algorithms_libs + * \{ */ + +void beidou_b1c_code_gen_int(own::span dest, const std::array& signal_id, int32_t prn); +void beidou_b1c_code_gen_sinboc11_float(own::span dest, const std::array& signal_id, uint32_t prn); +void beidou_b1c_code_gen_float_sampled(own::span dest, const std::array& signal_id, + bool qmboc, uint32_t prn, int32_t sampling_freq, uint32_t chip_shift, bool secondary_flag); +void beidou_b1c_code_gen_complex_sampled(own::span> dest, const std::array& signal_id, + bool qmboc, uint32_t prn, int32_t sampling_freq, uint32_t chip_shift, bool secondary_flag); +void beidou_b1c_code_gen_complex_sampled(own::span> dest, const std::array& signal_id, + bool qmboc, uint32_t prn, int32_t sampling_freq, uint32_t chip_shift); + +/** \} */ +/** \} */ +#endif // GNSS_SDR_BEIDOU_B1C_SIGNAL_REPLICA_H diff --git a/src/algorithms/libs/rtklib/rtklib_conversions.cc b/src/algorithms/libs/rtklib/rtklib_conversions.cc index 3857f8421..2776e9c7a 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.cc +++ b/src/algorithms/libs/rtklib/rtklib_conversions.cc @@ -16,6 +16,7 @@ #include "rtklib_conversions.h" #include "MATH_CONSTANTS.h" // for GNSS_PI, TWO_PI +#include "beidou_cnav1_ephemeris.h" // for Beidou_Cnav1_Ephemeris #include "beidou_dnav_ephemeris.h" // for Beidou_Dnav_Ephemeris #include "galileo_almanac.h" // for Galileo_Almanac #include "galileo_ephemeris.h" // for Galileo_Ephemeris @@ -227,6 +228,10 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, { rtklib_obs.code[band] = static_cast(CODE_L6I); } + else if (sig_ == "1D") + { + rtklib_obs.code[band] = static_cast(CODE_L1D); + } break; case 'J': @@ -709,6 +714,70 @@ eph_t eph_to_rtklib(const Beidou_Dnav_Ephemeris& bei_eph) } +eph_t eph_to_rtklib(const Beidou_Cnav1_Ephemeris& bei_eph) +{ + eph_t rtklib_sat = {0, 0, 0, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, {}, {}, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false, 0, 0, 0, 0, 0.0, -1, 0}; + rtklib_sat.sat = bei_eph.PRN + NSATGPS + NSATGLO + NSATGAL + NSATQZS; + rtklib_sat.A = bei_eph.sqrtA * bei_eph.sqrtA; + rtklib_sat.M0 = bei_eph.M_0; + rtklib_sat.deln = bei_eph.delta_n; + rtklib_sat.OMG0 = bei_eph.OMEGA_0; + rtklib_sat.OMGd = bei_eph.OMEGAdot; + rtklib_sat.omg = bei_eph.omega; + rtklib_sat.i0 = bei_eph.i_0; + rtklib_sat.idot = bei_eph.idot; + rtklib_sat.e = bei_eph.ecc; + rtklib_sat.svh = 0; + rtklib_sat.sva = 0; + rtklib_sat.code = bei_eph.sig_type; + rtklib_sat.flag = bei_eph.nav_type; + rtklib_sat.iode = static_cast(bei_eph.IODE); + rtklib_sat.iodc = static_cast(bei_eph.IODC); + rtklib_sat.week = bei_eph.WN; + rtklib_sat.cic = bei_eph.Cic; + rtklib_sat.cis = bei_eph.Cis; + rtklib_sat.cuc = bei_eph.Cuc; + rtklib_sat.cus = bei_eph.Cus; + rtklib_sat.crc = bei_eph.Crc; + rtklib_sat.crs = bei_eph.Crs; + rtklib_sat.f0 = bei_eph.af0; + rtklib_sat.f1 = bei_eph.af1; + rtklib_sat.f2 = bei_eph.af2; + rtklib_sat.tgd[0] = bei_eph.TGD_B1Cp; + rtklib_sat.tgd[1] = bei_eph.TGD_B2ap; + rtklib_sat.tgd[2] = bei_eph.ISC_B1Cd; + rtklib_sat.toes = bei_eph.toe; + rtklib_sat.toe = bdt2gpst(bdt2time(rtklib_sat.week, bei_eph.toe)); + rtklib_sat.toc = bdt2gpst(bdt2time(rtklib_sat.week, bei_eph.toc)); + rtklib_sat.ttr = bdt2gpst(bdt2time(rtklib_sat.week, bei_eph.tow)); + + double tow = time2gpst(rtklib_sat.ttr, &rtklib_sat.week); + const double toc = time2gpst(rtklib_sat.toc, nullptr); + const double toe = time2gpst(rtklib_sat.toe, nullptr); + if (rtklib_sat.toes < tow - 302400.0) + { + rtklib_sat.week++; + tow -= 604800.0; + } + else if (rtklib_sat.toes > tow + 302400.0) + { + rtklib_sat.week--; + tow += 604800.0; + } + rtklib_sat.toe = gpst2time(rtklib_sat.week, toe); + rtklib_sat.toc = gpst2time(rtklib_sat.week, toc); + rtklib_sat.ttr = gpst2time(rtklib_sat.week, tow); + + rtklib_sat.has_orbit_radial_correction_m = 0.0; + rtklib_sat.has_orbit_in_track_correction_m = 0.0; + rtklib_sat.has_orbit_cross_track_correction_m = 0.0; + rtklib_sat.has_clock_correction_m = 0.0; + rtklib_sat.apply_has_corrections = false; + return rtklib_sat; +} + + eph_t eph_to_rtklib(const Gps_CNAV_Ephemeris& gps_cnav_eph) { eph_t rtklib_sat = {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/algorithms/libs/rtklib/rtklib_conversions.h b/src/algorithms/libs/rtklib/rtklib_conversions.h index c39509a1c..73d4026b9 100644 --- a/src/algorithms/libs/rtklib/rtklib_conversions.h +++ b/src/algorithms/libs/rtklib/rtklib_conversions.h @@ -28,6 +28,7 @@ * \{ */ +class Beidou_Cnav1_Ephemeris; class Beidou_Dnav_Ephemeris; class Galileo_Almanac; class Galileo_Ephemeris; @@ -102,6 +103,8 @@ eph_t eph_to_rtklib(const Gps_CNAV_Ephemeris& gps_cnav_eph); eph_t eph_to_rtklib(const Beidou_Dnav_Ephemeris& bei_eph); +eph_t eph_to_rtklib(const Beidou_Cnav1_Ephemeris& bei_eph); + alm_t alm_to_rtklib(const Gps_Almanac& gps_alm); alm_t alm_to_rtklib(const Galileo_Almanac& gal_alm); diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index 025f8fce0..47f08a1f0 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -108,7 +108,7 @@ char obscodes[][3] = { "2W", "2Y", "2M", "2N", "5I", "5Q", "5X", "7I", "7Q", "7X", /* 20-29 */ "6A", "6B", "6C", "6X", "6Z", "6S", "6L", "8L", "8Q", "8X", /* 30-39 */ "2I", "2Q", "6I", "6Q", "3I", "3Q", "3X", "1I", "1Q", "5A", /* 40-49 */ - "5B", "5C", "9A", "9B", "9C", "9X", "", "", "", "" /* 50-59 */ + "5B", "5C", "9A", "9B", "9C", "9X", "1D", "", "", "" /* 50-59 */ }; @@ -119,7 +119,7 @@ unsigned char obsfreqs[] = { 2, 2, 2, 2, 3, 3, 3, 5, 5, 5, /* 20-29 */ 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, /* 30-39 */ 2, 2, 4, 4, 3, 3, 3, 1, 1, 3, /* 40-49 */ - 3, 3, 7, 7, 7, 7, 0, 0, 0, 0 /* 50-59 */ + 3, 3, 7, 7, 7, 7, 1, 0, 0, 0 /* 50-59 */ }; diff --git a/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt b/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt index bd198243e..71e1d30a3 100644 --- a/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt +++ b/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt @@ -7,10 +7,14 @@ set(TELEMETRY_DECODER_ADAPTER_SOURCES telemetry_decoder_adapter.cc + telemetry_decoder_adapter_base.cc + beidou_b1c_telemetry_decoder.cc ) set(TELEMETRY_DECODER_ADAPTER_HEADERS telemetry_decoder_adapter.h + telemetry_decoder_adapter_base.h + beidou_b1c_telemetry_decoder.h ) list(SORT TELEMETRY_DECODER_ADAPTER_HEADERS) diff --git a/src/algorithms/telemetry_decoder/adapters/beidou_b1c_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/beidou_b1c_telemetry_decoder.cc new file mode 100644 index 000000000..fd6c9336f --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/beidou_b1c_telemetry_decoder.cc @@ -0,0 +1,17 @@ +/*! + * \file beidou_b1c_telemetry_decoder.cc + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "beidou_b1c_telemetry_decoder.h" +#include "beidou_b1c_telemetry_decoder_gs.h" + +BeidouB1cTelemetryDecoder::BeidouB1cTelemetryDecoder( + const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams) + : TelemetryDecoderAdapterBase(configuration, role, in_streams, out_streams) +{ + InitializeDecoder(beidou_b1c_make_telemetry_decoder_gs(satellite(), tlm_parameters_)); +} diff --git a/src/algorithms/telemetry_decoder/adapters/beidou_b1c_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/beidou_b1c_telemetry_decoder.h new file mode 100644 index 000000000..9e81b5536 --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/beidou_b1c_telemetry_decoder.h @@ -0,0 +1,25 @@ +/*! + * \file beidou_b1c_telemetry_decoder.h + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_B1C_TELEMETRY_DECODER_H +#define GNSS_SDR_BEIDOU_B1C_TELEMETRY_DECODER_H + +#include "telemetry_decoder_adapter_base.h" + +class BeidouB1cTelemetryDecoder : public TelemetryDecoderAdapterBase +{ +public: + BeidouB1cTelemetryDecoder(const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams); + + inline std::string implementation() override + { + return "BEIDOU_B1C_Telemetry_Decoder"; + } +}; + +#endif diff --git a/src/algorithms/telemetry_decoder/adapters/telemetry_decoder_adapter_base.cc b/src/algorithms/telemetry_decoder/adapters/telemetry_decoder_adapter_base.cc new file mode 100644 index 000000000..1832efd86 --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/telemetry_decoder_adapter_base.cc @@ -0,0 +1,135 @@ +/*! + * \file telemetry_decoder_adapter_base.cc + * \brief Common functionality for telemetry decoder adapters + * \author Carles Fernandez-Prades, 2025 cfernandez@cttc.es + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2025 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + + +#include "telemetry_decoder_adapter_base.h" +#include + +#if USE_GLOG_AND_GFLAGS +#include +#else +#include +#endif + + +TelemetryDecoderAdapterBase::TelemetryDecoderAdapterBase(const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams) : role_(role), + in_streams_(in_streams), + out_streams_(out_streams) +{ + DLOG(INFO) << "role " << role_; + if (configuration != nullptr) + { + tlm_parameters_.SetFromConfiguration(configuration, role_); + } + if (in_streams_ > 1) + { + LOG(ERROR) << "This implementation only supports one input stream (" + << in_streams_ << " provided)"; + } + if (out_streams_ > 1) + { + LOG(ERROR) << "This implementation only supports one output stream (" + << out_streams_ << " provided)"; + } +} + + +void TelemetryDecoderAdapterBase::InitializeDecoder(telemetry_impl_interface_sptr decoder) +{ + telemetry_decoder_ = std::move(decoder); + DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")"; +} + + +void TelemetryDecoderAdapterBase::connect(gr::top_block_sptr top_block) +{ + if (top_block) + { + /* top_block is not null */ + } + DLOG(INFO) << "nothing to connect internally"; +} + + +void TelemetryDecoderAdapterBase::disconnect(gr::top_block_sptr top_block) +{ + if (top_block) + { + /* top_block is not null */ + } +} + + +gr::basic_block_sptr TelemetryDecoderAdapterBase::get_left_block() +{ + return telemetry_decoder_; +} + + +gr::basic_block_sptr TelemetryDecoderAdapterBase::get_right_block() +{ + return telemetry_decoder_; +} + + +void TelemetryDecoderAdapterBase::set_satellite(const Gnss_Satellite& satellite) +{ + satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); + if (telemetry_decoder_) + { + telemetry_decoder_->set_satellite(satellite_); + DLOG(INFO) << "TELEMETRY DECODER: satellite set to " << satellite_; + } +} + + +std::string TelemetryDecoderAdapterBase::role() +{ + return role_; +} + + +void TelemetryDecoderAdapterBase::set_channel(int channel) +{ + if (telemetry_decoder_) + { + telemetry_decoder_->set_channel(channel); + } +} + + +void TelemetryDecoderAdapterBase::reset() +{ + if (telemetry_decoder_) + { + telemetry_decoder_->reset(); + } +} + + +size_t TelemetryDecoderAdapterBase::item_size() +{ + return sizeof(Gnss_Synchro); +} + + +const Gnss_Satellite& TelemetryDecoderAdapterBase::satellite() const +{ + return satellite_; +} \ No newline at end of file diff --git a/src/algorithms/telemetry_decoder/adapters/telemetry_decoder_adapter_base.h b/src/algorithms/telemetry_decoder/adapters/telemetry_decoder_adapter_base.h new file mode 100644 index 000000000..20edfad7f --- /dev/null +++ b/src/algorithms/telemetry_decoder/adapters/telemetry_decoder_adapter_base.h @@ -0,0 +1,88 @@ +/*! + * \file telemetry_decoder_adapter_base.h + * \brief Common functionality for telemetry decoder adapters + * \author Carles Fernandez-Prades, 2025 cfernandez@cttc.es + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2025 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_TELEMETRY_DECODER_ADAPTER_BASE_CLASS_H +#define GNSS_SDR_TELEMETRY_DECODER_ADAPTER_BASE_CLASS_H + +#include "configuration_interface.h" +#include "gnss_satellite.h" +#include "gnss_synchro.h" +#include "telemetry_decoder_interface.h" +#include "telemetry_impl_interface.h" +#include "tlm_conf.h" +#include +#include +#include + +class ConfigurationInterface; + +/** \addtogroup Telemetry_Decoder + * \{ + */ +/** \addtogroup Telemetry_Decoder_adapters + * \{ + */ + +/*! + * \brief Base class for Telemetry Decoder adapters + */ +class TelemetryDecoderAdapterBase : public TelemetryDecoderInterface +{ +public: + TelemetryDecoderAdapterBase(const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams); + + ~TelemetryDecoderAdapterBase() override = default; + + void connect(gr::top_block_sptr top_block) override; + + void disconnect(gr::top_block_sptr top_block) override; + + gr::basic_block_sptr get_left_block() override; + + gr::basic_block_sptr get_right_block() override; + + void set_satellite(const Gnss_Satellite& satellite) override; + + std::string role() override; + + void set_channel(int channel) override; + + void reset() override; + + size_t item_size() override; + +protected: + void InitializeDecoder(telemetry_impl_interface_sptr decoder); + + const Gnss_Satellite& satellite() const; + + Tlm_Conf tlm_parameters_; + +private: + telemetry_impl_interface_sptr telemetry_decoder_; + Gnss_Satellite satellite_; + std::string role_; + unsigned int in_streams_ = 0; + unsigned int out_streams_ = 0; +}; + +/** \} */ +/** \} */ + +#endif // GNSS_SDR_TELEMETRY_DECODER_ADAPTER_BASE_CLASS_H diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt index e668b8d0c..7fda8f107 100644 --- a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt @@ -14,6 +14,7 @@ set(TELEMETRY_DECODER_GR_BLOCKS_SOURCES glonass_gnav_telemetry_decoder_gs.cc galileo_telemetry_decoder_gs.cc beidou_dnav_telemetry_decoder_gs.cc + beidou_b1c_telemetry_decoder_gs.cc ) set(TELEMETRY_DECODER_GR_BLOCKS_HEADERS @@ -25,6 +26,7 @@ set(TELEMETRY_DECODER_GR_BLOCKS_HEADERS glonass_gnav_telemetry_decoder_gs.h galileo_telemetry_decoder_gs.h beidou_dnav_telemetry_decoder_gs.h + beidou_b1c_telemetry_decoder_gs.h ) list(SORT TELEMETRY_DECODER_GR_BLOCKS_HEADERS) diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1c_telemetry_decoder_gs.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1c_telemetry_decoder_gs.cc new file mode 100644 index 000000000..76c62b889 --- /dev/null +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1c_telemetry_decoder_gs.cc @@ -0,0 +1,719 @@ +/*! + * \file beidou_b1c_telemetry_decoder_gs.cc + * \brief BeiDou B1C B-CNAV1 telemetry decoder block + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "beidou_b1c_telemetry_decoder_gs.h" +#include "Beidou_B1C.h" +#include "Beidou_B1C_codes.h" +#include "Beidou_CNAV1.h" +#include "Beidou_DNAV.h" +#include "MATH_CONSTANTS.h" +#include "beidou_cnav1_ephemeris.h" +#include "beidou_cnav1_iono.h" +#include "beidou_cnav1_utc_model.h" +#include "display.h" +#include "gnss_sdr_make_unique.h" +#include "gnss_synchro.h" +#include "tlm_crc_stats.h" +#include "tlm_utils.h" +#include "tow_to_trk.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#if USE_GLOG_AND_GFLAGS +#include +#else +#include +#endif + +#define CRC_ERROR_LIMIT 8 + +namespace +{ +// SOH/HOW in CNAV1 refers to the start of the 1800-symbol frame in the decode buffer. +// Current symbol is the newest entry (index BEIDOU_CNAV1_FRAME_SYMBOLS - 1), matching +// BeiDou B1I (preamble + required_symbols) and Galileo INAV (preamble + page offset) TOW tagging. +int32_t resolve_b1c_frame_soh_offset(int32_t matched_offset, int32_t prev_candidate_offset) +{ + if (matched_offset >= 0) + { + return matched_offset; + } + if (matched_offset == -2 && prev_candidate_offset >= 0) + { + return prev_candidate_offset; + } + return 0; +} + + +uint32_t compute_b1c_tow_ms_at_current_symbol( + double tow_soh_bdt_s, + int32_t frame_soh_offset, + int32_t symbol_duration_ms) +{ + const int32_t clamped_offset = std::max(0, std::min(frame_soh_offset, BEIDOU_CNAV1_FRAME_SYMBOLS - 1)); + const int32_t symbols_since_soh = (BEIDOU_CNAV1_FRAME_SYMBOLS - 1) - clamped_offset; + const double tow_gpst_s = tow_soh_bdt_s + static_cast(BEIDOU_DNAV_BDT2GPST_LEAP_SEC_OFFSET) + + static_cast(symbols_since_soh) * static_cast(symbol_duration_ms) / 1000.0; + const double tow_ms = std::fmod(tow_gpst_s * 1000.0, 604800000.0); + if (tow_ms < 0.0) + { + return static_cast(tow_ms + 604800000.0); + } + return static_cast(tow_ms); +} +} // namespace + +beidou_b1c_telemetry_decoder_gs_sptr beidou_b1c_make_telemetry_decoder_gs( + const Gnss_Satellite& satellite, + const Tlm_Conf& conf) +{ + return beidou_b1c_telemetry_decoder_gs_sptr(new beidou_b1c_telemetry_decoder_gs(satellite, conf)); +} + + +beidou_b1c_telemetry_decoder_gs::beidou_b1c_telemetry_decoder_gs( + const Gnss_Satellite& satellite, + const Tlm_Conf& conf) + : telemetry_impl_interface("beidou_b1c_telemetry_decoder_gs", + gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)), + gr::io_signature::make(1, 1, sizeof(Gnss_Synchro))), + d_dump_filename(conf.dump_filename), + + d_symbol_duration_ms(BEIDOU_B1C_CODE_PERIOD_MS), + d_dump(conf.dump), + d_dump_mat(conf.dump_mat), + d_remove_dat(conf.remove_dat), + d_enable_navdata_monitor(conf.enable_navdata_monitor), + d_dump_crc_stats(conf.dump_crc_stats), + d_tow_to_trk(conf.tow_to_trk) +{ + configure_basic_outputs(); + d_symbol_history.set_capacity(BEIDOU_CNAV1_FRAME_SYMBOLS); + d_symbol_history_q.set_capacity(BEIDOU_CNAV1_FRAME_SYMBOLS); + d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); + DLOG(INFO) << "Initializing BeiDou B1C B-CNAV1 telemetry decoder for satellite " << d_satellite; + if (d_enable_navdata_monitor) + { + message_port_register_out(pmt::mp("Nav_msg_from_TLM")); + d_nav_msg_packet.system = std::string("C"); + d_nav_msg_packet.signal = std::string("1D"); + } + configure_dump_file(d_channel, d_dump, d_dump_filename, d_dump_file); + configure_crc_stats_channel(d_channel, d_dump_crc_stats, d_Tlm_CRC_Stats); +} + + +beidou_b1c_telemetry_decoder_gs::~beidou_b1c_telemetry_decoder_gs() +{ + if (d_dump_file.is_open()) + { + d_dump_file.close(); + } +} + + +void beidou_b1c_telemetry_decoder_gs::set_satellite(const Gnss_Satellite& satellite) +{ + d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN()); + DLOG(INFO) << "BeiDou B1C telemetry decoder set to satellite " << d_satellite; +} + + +void beidou_b1c_telemetry_decoder_gs::set_channel(int channel) +{ + d_channel = channel; + DLOG(INFO) << "BeiDou B1C B-CNAV1 telemetry channel set to " << channel; + configure_dump_file(d_channel, d_dump, d_dump_filename, d_dump_file); + configure_crc_stats_channel(d_channel, d_dump_crc_stats, d_Tlm_CRC_Stats); +} + + +void beidou_b1c_telemetry_decoder_gs::reset() +{ + d_sample_counter = 0; + d_frame_sync_index = 0; + d_TOW_at_current_symbol_ms = 0; + d_flag_valid_word = false; + d_flag_frame_sync = false; + d_flag_PLL_180_deg_phase_locked = false; + d_stat = 0; + d_CRC_error_counter = 0; + d_symbol_history.clear(); + d_symbol_history_q.clear(); + d_prev_candidate_frame.clear(); + d_prev_candidate_offset = -1; + d_have_prev_candidate_frame = false; + d_prev_valid_symbol_output = false; + d_await_post_lock_frame_decode = false; + d_post_lock_valid_symbols = 0U; + d_nav.clear_flags(); + DLOG(INFO) << "BeiDou B1C telemetry decoder reset for satellite " << d_satellite; +} + + +bool beidou_b1c_telemetry_decoder_gs::decode_frame_from_history(bool invert) +{ + std::vector frame(d_symbol_history.begin(), d_symbol_history.end()); + if (invert) + { + for (auto& sample : frame) + { + sample = -sample; + } + } + return d_nav.decode_frame_symbols(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, d_satellite.get_PRN()); +} + + +bool beidou_b1c_telemetry_decoder_gs::decode_frame_from_history_with_offset(int32_t start_offset, bool invert) +{ + std::vector history(d_symbol_history.begin(), d_symbol_history.end()); + if (history.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + { + return false; + } + std::vector frame(BEIDOU_CNAV1_FRAME_SYMBOLS); + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + for (int32_t i = 0; i < n; i++) + { + float sample = history[static_cast((start_offset + i) % n)]; + if (invert) + { + sample = -sample; + } + frame[static_cast(i)] = sample; + } + return d_nav.decode_frame_symbols(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, d_satellite.get_PRN()); +} + + +bool beidou_b1c_telemetry_decoder_gs::probe_frame_from_history_with_offset(int32_t start_offset, bool invert) const +{ + std::vector history(d_symbol_history.begin(), d_symbol_history.end()); + if (history.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + { + return false; + } + std::vector frame(BEIDOU_CNAV1_FRAME_SYMBOLS); + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + for (int32_t i = 0; i < n; i++) + { + float sample = history[static_cast((start_offset + i) % n)]; + if (invert) + { + sample = -sample; + } + frame[static_cast(i)] = sample; + } + return d_nav.probe_subframe1_prn(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, d_satellite.get_PRN()); +} + + +namespace +{ +bool decode_frame_from_buffer_with_offset( + const boost::circular_buffer& symbol_history, + Beidou_Cnav1_Navigation_Message& nav, + int32_t expected_prn, + int32_t start_offset, + bool invert, + float cn0_db_hz, + int32_t* fail_stage = nullptr) +{ + std::vector history(symbol_history.begin(), symbol_history.end()); + if (history.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + { + return false; + } + std::vector frame(BEIDOU_CNAV1_FRAME_SYMBOLS); + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + for (int32_t i = 0; i < n; i++) + { + float sample = history[static_cast((start_offset + i) % n)]; + if (invert) + { + sample = -sample; + } + frame[static_cast(i)] = sample; + } + + // LLR calibration: normalize by frame RMS and scale by CN0-derived symbol SNR. + double rms_acc = 0.0; + for (const float v : frame) + { + rms_acc += static_cast(v) * static_cast(v); + } + const double rms = std::sqrt(rms_acc / static_cast(n)) + 1e-6; + const double cn0_linear = std::pow(10.0, static_cast(cn0_db_hz) / 10.0); + const double snr_sym = std::max(cn0_linear * (BEIDOU_B1C_CODE_PERIOD_MS * 1e-3), 1e-4); + const double llr_scale = std::min(std::max(std::sqrt(snr_sym) / rms, 0.05), 50.0); + for (auto& v : frame) + { + v = static_cast(static_cast(v) * llr_scale); + } + return nav.decode_frame_symbols(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, expected_prn, fail_stage); +} + +bool build_frame_from_buffer_with_offset( + const boost::circular_buffer& symbol_history, + int32_t start_offset, + bool invert, + std::vector& frame_out) +{ + std::vector history(symbol_history.begin(), symbol_history.end()); + if (history.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + { + return false; + } + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + frame_out.resize(static_cast(n)); + for (int32_t i = 0; i < n; i++) + { + float sample = history[static_cast((start_offset + i) % n)]; + if (invert) + { + sample = -sample; + } + frame_out[static_cast(i)] = sample; + } + return true; +} + +bool probe_frame_from_buffer_with_offset( + const boost::circular_buffer& symbol_history, + const Beidou_Cnav1_Navigation_Message& nav, + int32_t expected_prn, + int32_t start_offset, + bool invert) +{ + std::vector history(symbol_history.begin(), symbol_history.end()); + if (history.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + { + return false; + } + std::vector frame(BEIDOU_CNAV1_FRAME_SYMBOLS); + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + for (int32_t i = 0; i < n; i++) + { + float sample = history[static_cast((start_offset + i) % n)]; + if (invert) + { + sample = -sample; + } + frame[static_cast(i)] = sample; + } + return nav.probe_subframe1_prn(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, expected_prn); +} + +std::pair> find_secondary_code_candidates( + const boost::circular_buffer& pilot_symbol_history, + int32_t prn) +{ + std::vector history(pilot_symbol_history.begin(), pilot_symbol_history.end()); + if (history.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS) || + prn < 1 || prn > static_cast(BEIDOU_B1C_NUMBER_OF_PRNS)) + { + return {0, {}}; + } + + const char* sec_code = BEIDOU_B1C_PILOT_SECONDARY_CODE[static_cast(prn - 1)]; + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + int32_t best_corr = 0; + int32_t best_lag = 0; + std::vector candidates; + for (int32_t lag = 0; lag < n; lag++) + { + int32_t corr = 0; + for (int32_t i = 0; i < n; i++) + { + const float sym = history[static_cast((lag + i) % n)]; + const int32_t sym_sign = (sym >= 0.0F) ? 1 : -1; + const int32_t sec_sign = (sec_code[static_cast(i)] == '0') ? 1 : -1; + corr += sym_sign * sec_sign; + } + if (std::abs(corr) > std::abs(best_corr)) + { + best_corr = corr; + best_lag = lag; + } + if (std::abs(corr) >= 1799) + { + candidates.push_back(lag); + } + } + + if (candidates.empty() && std::abs(best_corr) >= 1650) + { + candidates.push_back(best_lag); + } + return {best_corr, candidates}; +} + +bool build_rotated_bpsk_frame_from_iq( + const boost::circular_buffer& symbol_history_i, + const boost::circular_buffer& symbol_history_q, + int32_t start_offset, + bool invert, + std::vector& frame_out) +{ + std::vector history_i(symbol_history_i.begin(), symbol_history_i.end()); + std::vector history_q(symbol_history_q.begin(), symbol_history_q.end()); + if (history_i.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS) || + history_q.size() < static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + { + return false; + } + + const int32_t n = BEIDOU_CNAV1_FRAME_SYMBOLS; + std::vector> z(static_cast(n)); + std::complex sum_z2(0.0F, 0.0F); + for (int32_t i = 0; i < n; i++) + { + const auto idx = static_cast((start_offset + i) % n); + const std::complex zi(history_i[idx], history_q[idx]); + z[static_cast(i)] = zi; + sum_z2 += zi * zi; + } + + const float theta = 0.5F * std::arg(sum_z2); + const std::complex rot(std::cos(theta), -std::sin(theta)); + frame_out.resize(static_cast(n)); + for (int32_t i = 0; i < n; i++) + { + float sample = (z[static_cast(i)] * rot).real(); + if (invert) + { + sample = -sample; + } + frame_out[static_cast(i)] = sample; + } + return true; +} + +bool probe_frame_from_iq_buffers_with_offset( + const boost::circular_buffer& symbol_history_i, + const boost::circular_buffer& symbol_history_q, + const Beidou_Cnav1_Navigation_Message& nav, + int32_t expected_prn, + int32_t start_offset, + bool invert) +{ + std::vector frame; + if (!build_rotated_bpsk_frame_from_iq(symbol_history_i, symbol_history_q, start_offset, invert, frame)) + { + return false; + } + return nav.probe_subframe1_prn(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, expected_prn); +} + +bool decode_frame_from_iq_buffers_with_offset( + const boost::circular_buffer& symbol_history_i, + const boost::circular_buffer& symbol_history_q, + Beidou_Cnav1_Navigation_Message& nav, + int32_t expected_prn, + int32_t start_offset, + bool invert, + float cn0_db_hz, + int32_t* fail_stage = nullptr) +{ + std::vector frame; + if (!build_rotated_bpsk_frame_from_iq(symbol_history_i, symbol_history_q, start_offset, invert, frame)) + { + return false; + } + double rms_acc = 0.0; + for (const float v : frame) + { + rms_acc += static_cast(v) * static_cast(v); + } + const double rms = std::sqrt(rms_acc / static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS)) + 1e-6; + const double cn0_linear = std::pow(10.0, static_cast(cn0_db_hz) / 10.0); + const double snr_sym = std::max(cn0_linear * (BEIDOU_B1C_CODE_PERIOD_MS * 1e-3), 1e-4); + const double llr_scale = std::min(std::max(std::sqrt(snr_sym) / rms, 0.05), 50.0); + for (auto& v : frame) + { + v = static_cast(static_cast(v) * llr_scale); + } + return nav.decode_frame_symbols(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, expected_prn, fail_stage); +} +} // namespace + + +void beidou_b1c_telemetry_decoder_gs::publish_navigation(double cn0_db_hz) +{ + if (d_nav.have_new_ephemeris()) + { + auto eph = std::make_shared(d_nav.get_ephemeris()); + eph->PRN = d_satellite.get_PRN(); + message_port_pub(pmt::mp("telemetry"), pmt::make_any(eph)); +#if __cplusplus == 201103L + const int default_precision = std::cout.precision(); +#else + const auto default_precision{std::cout.precision()}; +#endif + std::cout << TEXT_BLUE << "New BeiDou B-CNAV1 ephemeris in channel " << d_channel + << " from satellite " << d_satellite + << " with CN0=" << std::setprecision(2) << cn0_db_hz << std::setprecision(default_precision) + << " dB-Hz" << TEXT_RESET << std::endl; + LOG(INFO) << "New BeiDou B-CNAV1 ephemeris from PRN " << d_satellite.get_PRN() + << " in channel " << d_channel << " with CN0=" << cn0_db_hz << " dB-Hz"; + } + if (d_nav.have_new_iono()) + { + auto iono = std::make_shared(d_nav.get_iono()); + iono->valid = true; + message_port_pub(pmt::mp("telemetry"), pmt::make_any(iono)); + DLOG(INFO) << "New BeiDou B-CNAV1 iono model from PRN " << d_satellite.get_PRN() + << " in channel " << d_channel; + } + if (d_nav.have_new_utc_model()) + { + auto utc = std::make_shared(d_nav.get_utc_model()); + utc->valid = true; + message_port_pub(pmt::mp("telemetry"), pmt::make_any(utc)); + DLOG(INFO) << "New BeiDou B-CNAV1 UTC model from PRN " << d_satellite.get_PRN() + << " in channel " << d_channel; + } + if (d_nav.have_new_page_data()) + { + Beidou_Cnav1_PageData_Message page_msg{}; + page_msg.PRN = d_satellite.get_PRN(); + page_msg.page_data = d_nav.get_page_data(); + message_port_pub(pmt::mp("telemetry"), pmt::make_any(std::make_shared(page_msg))); + DLOG(INFO) << "New BeiDou B-CNAV1 page data from PRN " << d_satellite.get_PRN() + << " in channel " << d_channel + << " PageID=" << d_nav.get_page_data().common.page_id; + } + d_nav.clear_flags(); + d_prev_candidate_frame.clear(); + d_prev_candidate_offset = -1; + d_have_prev_candidate_frame = false; +} + + +int beidou_b1c_telemetry_decoder_gs::general_work( + int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + const auto* in = reinterpret_cast(input_items[0]); + auto* out = reinterpret_cast(output_items[0]); + if (ninput_items[0] <= 0 || noutput_items <= 0) + { + return 0; + } + + Gnss_Synchro current_symbol = in[0]; + current_symbol.PRN = d_satellite.get_PRN(); + d_sample_counter++; + consume_each(1); + d_symbol_history.push_back(current_symbol.Prompt_I); + d_symbol_history_q.push_back(current_symbol.Prompt_Q); + const bool just_locked_event = current_symbol.Flag_valid_symbol_output && !d_prev_valid_symbol_output; + d_prev_valid_symbol_output = current_symbol.Flag_valid_symbol_output; + + if (current_symbol.Flag_valid_symbol_output && d_await_post_lock_frame_decode && !just_locked_event) + { + d_post_lock_valid_symbols++; + } + + // After pilot-secondary lock (first valid symbol): decode once if 18 s history is ready. + // While tracking: only decode on 18 s frame boundaries (no periodic LDPC polling). + const bool at_frame_boundary = + d_flag_frame_sync && + (d_sample_counter > d_frame_sync_index) && + ((d_sample_counter - d_frame_sync_index) % static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS) == 0U); + const bool post_lock_frame_ready = + d_await_post_lock_frame_decode && + d_post_lock_valid_symbols >= static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS); + bool frame_decoded = false; + if (static_cast(d_symbol_history.size()) >= BEIDOU_CNAV1_FRAME_SYMBOLS) + { + const bool should_try_decode = + current_symbol.Flag_valid_symbol_output && + ((d_stat == 0 && just_locked_event) || + (d_stat == 0 && post_lock_frame_ready && !just_locked_event) || + (d_stat == 2 && at_frame_boundary && + d_sample_counter >= d_frame_sync_index + static_cast(BEIDOU_CNAV1_FRAME_SYMBOLS))); + + if (should_try_decode) + { + bool invert = false; + int32_t matched_offset = -1; + if (d_stat == 0 && just_locked_event) + { + // One-shot sync-decode on pilot-secondary lock (no periodic LDPC polling). + const int32_t expected_prn_scan = d_satellite.get_PRN(); + const auto sec_candidates = + find_secondary_code_candidates(d_symbol_history_q, expected_prn_scan); + const auto& candidate_offsets = sec_candidates.second; + constexpr int32_t local_offset_span = 32; + const auto cn0_db_hz = static_cast(current_symbol.CN0_dB_hz); + + if (!candidate_offsets.empty()) + { + for (const int32_t candidate_offset : candidate_offsets) + { + for (int32_t delta = -local_offset_span; delta <= local_offset_span; delta++) + { + const int32_t start_offset = + (candidate_offset + delta + BEIDOU_CNAV1_FRAME_SYMBOLS) % BEIDOU_CNAV1_FRAME_SYMBOLS; + for (const bool inv : {false, true}) + { + if (!probe_frame_from_iq_buffers_with_offset( + d_symbol_history, d_symbol_history_q, d_nav, expected_prn_scan, start_offset, inv)) + { + continue; + } + int32_t fail_stage = -1; + if (decode_frame_from_iq_buffers_with_offset( + d_symbol_history, d_symbol_history_q, d_nav, expected_prn_scan, start_offset, inv, + cn0_db_hz, &fail_stage)) + { + frame_decoded = true; + invert = inv; + matched_offset = start_offset; + break; + } + } + if (frame_decoded) + { + break; + } + } + if (frame_decoded) + { + break; + } + } + } + + if (frame_decoded) + { + d_await_post_lock_frame_decode = false; + d_post_lock_valid_symbols = 0U; + } + else + { + d_await_post_lock_frame_decode = true; + d_post_lock_valid_symbols = 1U; + } + } + else if (d_stat == 0 && post_lock_frame_ready) + { + frame_decoded = decode_frame_from_history(false); + if (!frame_decoded) + { + frame_decoded = decode_frame_from_history(true); + } + if (frame_decoded) + { + d_await_post_lock_frame_decode = false; + d_post_lock_valid_symbols = 0U; + } + } + else + { + frame_decoded = decode_frame_from_history(false); + if (!frame_decoded) + { + frame_decoded = decode_frame_from_history(true); + invert = frame_decoded; + } + } + + if (frame_decoded) + { + d_CRC_error_counter = 0; + d_flag_PLL_180_deg_phase_locked = invert; + d_frame_sync_index = d_sample_counter; + const int32_t frame_soh_offset = resolve_b1c_frame_soh_offset(matched_offset, d_prev_candidate_offset); + d_TOW_at_current_symbol_ms = compute_b1c_tow_ms_at_current_symbol( + d_nav.get_tow_s(), frame_soh_offset, d_symbol_duration_ms); + d_flag_valid_word = true; + publish_navigation(current_symbol.CN0_dB_hz); + + if (!d_flag_frame_sync) + { + d_flag_frame_sync = true; + d_stat = 2; + LOG(INFO) << "Successful frame synchronization in channel " << d_channel + << " for satellite " << d_satellite + << " with CN0=" << current_symbol.CN0_dB_hz << " dB-Hz"; +#if __cplusplus == 201103L + const int default_precision = std::cout.precision(); +#else + const auto default_precision{std::cout.precision()}; +#endif + std::cout << TEXT_GREEN << "B-CNAV1 frame sync on channel " << d_channel + << ", satellite " << d_satellite + << ", TOW=" << std::setprecision(3) << d_nav.get_tow_s() + << std::setprecision(default_precision) << " s" << TEXT_RESET << std::endl; + } + } + else if (d_stat == 2) + { + d_CRC_error_counter++; + if (d_CRC_error_counter > CRC_ERROR_LIMIT) + { + DLOG(INFO) << "B-CNAV1 frame sync lost for satellite " << d_satellite + << " in channel " << d_channel; + d_flag_frame_sync = false; + d_flag_valid_word = false; + d_stat = 0; + d_CRC_error_counter = 0; + } + } + } + } + + if (d_flag_valid_word && !frame_decoded) + { + d_TOW_at_current_symbol_ms += d_symbol_duration_ms; + if (!current_symbol.Flag_valid_symbol_output) + { + d_flag_valid_word = false; + } + } + + if (d_flag_PLL_180_deg_phase_locked) + { + current_symbol.Carrier_phase_rads += GNSS_PI; + current_symbol.Flag_PLL_180_deg_phase_locked = true; + } + else + { + current_symbol.Flag_PLL_180_deg_phase_locked = false; + } + + if (d_flag_valid_word) + { + current_symbol.TOW_at_current_symbol_ms = d_TOW_at_current_symbol_ms; + current_symbol.Flag_valid_word = true; + if (d_tow_to_trk) + { + const auto tow_obj = std::make_shared(TOW_to_trk( + std::string(current_symbol.Signal), + d_channel, + d_TOW_at_current_symbol_ms, + current_symbol.Tracking_sample_counter, + d_nav.get_ephemeris().WN, + d_satellite.get_PRN())); + message_port_pub(pmt::mp("telemetry_to_trk"), pmt::make_any(tow_obj)); + } + out[0] = std::move(current_symbol); + return 1; + } + return 0; +} diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1c_telemetry_decoder_gs.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1c_telemetry_decoder_gs.h new file mode 100644 index 000000000..6415ec0a0 --- /dev/null +++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/beidou_b1c_telemetry_decoder_gs.h @@ -0,0 +1,76 @@ +/*! + * \file beidou_b1c_telemetry_decoder_gs.h + * \brief BeiDou B1C B-CNAV1 telemetry decoder block + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_B1C_TELEMETRY_DECODER_GS_H +#define GNSS_SDR_BEIDOU_B1C_TELEMETRY_DECODER_GS_H + +#include "beidou_cnav1_navigation_message.h" +#include "nav_message_packet.h" +#include "telemetry_impl_interface.h" +#include "tlm_conf.h" +#include +#include + +class beidou_b1c_telemetry_decoder_gs; +using beidou_b1c_telemetry_decoder_gs_sptr = gnss_shared_ptr; + +beidou_b1c_telemetry_decoder_gs_sptr beidou_b1c_make_telemetry_decoder_gs( + const Gnss_Satellite& satellite, + const Tlm_Conf& conf); + +class beidou_b1c_telemetry_decoder_gs : public telemetry_impl_interface +{ +public: + ~beidou_b1c_telemetry_decoder_gs() override; + void set_satellite(const Gnss_Satellite& satellite) override; + void set_channel(int channel) override; + void reset() override; + int general_work(int noutput_items, gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, gr_vector_void_star& output_items) override; + +private: + friend beidou_b1c_telemetry_decoder_gs_sptr beidou_b1c_make_telemetry_decoder_gs( + const Gnss_Satellite& satellite, const Tlm_Conf& conf); + + beidou_b1c_telemetry_decoder_gs(const Gnss_Satellite& satellite, const Tlm_Conf& conf); + bool decode_frame_from_history(bool invert); + bool decode_frame_from_history_with_offset(int32_t start_offset, bool invert); + bool probe_frame_from_history_with_offset(int32_t start_offset, bool invert) const; + void publish_navigation(double cn0_db_hz); + + Beidou_Cnav1_Navigation_Message d_nav; + Nav_Message_Packet d_nav_msg_packet; + Gnss_Satellite d_satellite; + boost::circular_buffer d_symbol_history; + boost::circular_buffer d_symbol_history_q; + std::string d_dump_filename; + std::ofstream d_dump_file; + std::unique_ptr d_Tlm_CRC_Stats; + uint64_t d_sample_counter{}; + uint64_t d_frame_sync_index{}; + int32_t d_channel{}; + int32_t d_stat{}; + int32_t d_CRC_error_counter{}; + uint32_t d_TOW_at_current_symbol_ms{}; + uint32_t d_symbol_duration_ms{}; + bool d_flag_valid_word{false}; + bool d_flag_frame_sync{false}; + bool d_flag_PLL_180_deg_phase_locked{false}; + bool d_dump{false}; + bool d_dump_mat{false}; + bool d_remove_dat{false}; + bool d_enable_navdata_monitor{false}; + bool d_dump_crc_stats{false}; + bool d_tow_to_trk{false}; + bool d_prev_valid_symbol_output{false}; + bool d_await_post_lock_frame_decode{false}; + uint32_t d_post_lock_valid_symbols{0U}; + std::vector d_prev_candidate_frame; + int32_t d_prev_candidate_offset{-1}; + bool d_have_prev_candidate_frame{false}; +}; + +#endif diff --git a/src/algorithms/tracking/adapters/CMakeLists.txt b/src/algorithms/tracking/adapters/CMakeLists.txt index 97ee94048..449dc723b 100644 --- a/src/algorithms/tracking/adapters/CMakeLists.txt +++ b/src/algorithms/tracking/adapters/CMakeLists.txt @@ -28,6 +28,8 @@ endif() set(TRACKING_ADAPTER_SOURCES dll_pll_tracking_adapter.cc + base_dll_pll_tracking.cc + beidou_b1c_dll_pll_veml_tracking.cc galileo_e1_tcp_connector_tracking.cc gps_l1_ca_tcp_connector_tracking.cc gps_l1_ca_gaussian_tracking.cc @@ -37,6 +39,8 @@ set(TRACKING_ADAPTER_SOURCES set(TRACKING_ADAPTER_HEADERS dll_pll_tracking_adapter.h + base_dll_pll_tracking.h + beidou_b1c_dll_pll_veml_tracking.h galileo_e1_tcp_connector_tracking.h gps_l1_ca_tcp_connector_tracking.h gps_l1_ca_gaussian_tracking.h diff --git a/src/algorithms/tracking/adapters/base_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/base_dll_pll_tracking.cc new file mode 100644 index 000000000..957d3b968 --- /dev/null +++ b/src/algorithms/tracking/adapters/base_dll_pll_tracking.cc @@ -0,0 +1,98 @@ +/*! + * \file base_dll_pll_tracking.cc + * \brief Base class providing shared logic for DLL+PLL VEML tracking adapters. + * \authors Carles Fernandez, 2025. carles.fernandez(at)cttc.cat + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2025 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "base_dll_pll_tracking.h" +#include "configuration_interface.h" + +#if USE_GLOG_AND_GFLAGS +#include +#else +#include +#endif + +BaseDllPllTracking::BaseDllPllTracking( + const ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams) + : role_(std::move(role)), + item_size_(sizeof(gr_complex)) +{ + trk_params_.SetFromConfiguration(configuration, role_); + + if (in_streams > 1) + { + LOG(ERROR) << "Only one input stream is supported."; + } + if (out_streams > 1) + { + LOG(ERROR) << "Only one output stream is supported."; + } + + DLOG(INFO) << "role " << role_; +} + + +void BaseDllPllTracking::connect(gr::top_block_sptr top_block) +{ + if (top_block) + { /* no connection needed */ + } +} + + +void BaseDllPllTracking::disconnect(gr::top_block_sptr top_block) +{ + if (top_block) + { /* no disconnection needed */ + } +} + + +gr::basic_block_sptr BaseDllPllTracking::get_left_block() +{ + return tracking_sptr_; +} + + +gr::basic_block_sptr BaseDllPllTracking::get_right_block() +{ + return tracking_sptr_; +} + + +void BaseDllPllTracking::set_channel(unsigned int channel) +{ + tracking_sptr_->set_channel(channel); +} + + +void BaseDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) +{ + tracking_sptr_->set_gnss_synchro(p_gnss_synchro); +} + + +void BaseDllPllTracking::start_tracking() +{ + tracking_sptr_->start_tracking(); +} + + +void BaseDllPllTracking::stop_tracking() +{ + tracking_sptr_->stop_tracking(); +} diff --git a/src/algorithms/tracking/adapters/base_dll_pll_tracking.h b/src/algorithms/tracking/adapters/base_dll_pll_tracking.h new file mode 100644 index 000000000..f7890ed5a --- /dev/null +++ b/src/algorithms/tracking/adapters/base_dll_pll_tracking.h @@ -0,0 +1,126 @@ +/*! + * \file base_dll_pll_tracking.h + * \brief Base class providing shared logic for DLL+PLL VEML tracking adapters. + * \authors Carles Fernandez, 2025. carles.fernandez(at)cttc.cat + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2025 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BASE_DLL_PLL_TRACKING_H +#define GNSS_SDR_BASE_DLL_PLL_TRACKING_H + +#include "dll_pll_conf.h" +#include "dll_pll_veml_tracking.h" +#include "tracking_interface.h" +#include +#include + +/** \addtogroup Tracking + * Classes for GNSS signal tracking. + * \{ */ +/** \addtogroup Tracking_adapters tracking_adapters + * Wrap GNU Radio blocks for GNSS signal tracking with a TrackingInterface + * \{ */ + +class ConfigurationInterface; + +/*! + * \brief Base class providing shared logic for DLL+PLL tracking loop adapters + * for GNSS signals. + */ +class BaseDllPllTracking : public TrackingInterface +{ +public: + /*! + * \brief Base constructor of a Tracking block adapter + */ + explicit BaseDllPllTracking(const ConfigurationInterface* configuration, + std::string role, + unsigned int in_streams, + unsigned int out_streams); + + /*! + * \brief Default destructor of the Tracking block adapter + */ + ~BaseDllPllTracking() override = default; + + /*! + * \brief Get role from the Tracking block adapter + */ + inline std::string role() final { return role_; } + + /*! + * \brief Get item_size from the Tracking block adapter + */ + inline size_t item_size() final { return item_size_; } + + /*! + * \brief Connect the Tracking block adapter + */ + void connect(gr::top_block_sptr top_block) final; + + /*! + * \brief Disconnect the sTracking block adapter + */ + void disconnect(gr::top_block_sptr top_block) final; + + /*! + * \brief Get left block from the Tracking block adapter + */ + gr::basic_block_sptr get_left_block() final; + + /*! + * \brief Get right block from the Tracking block adapter + */ + gr::basic_block_sptr get_right_block() final; + + /*! + * \brief Set tracking channel unique ID + */ + void set_channel(unsigned int channel) final; + + /*! + * \brief Set acquisition Gnss_Synchro object pointer + * to exchange synchronization data between acquisition and tracking blocks + */ + void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro) final; + + /*! + * \brief Start the Tracking block + */ + void start_tracking() final; + + /*! + * \brief Stop the Tracking block + */ + void stop_tracking() final; + +protected: + // Can be used by each derived class + inline Dll_Pll_Conf& config_params() { return trk_params_; } + inline const Dll_Pll_Conf& config_params() const { return trk_params_; } + inline void set_item_size(size_t item_size) { item_size_ = item_size; } + + // Must be implemented / filled by each derived class + virtual void configure_tracking_parameters(const ConfigurationInterface* configuration) = 0; + virtual void create_tracking_block() = 0; + dll_pll_veml_tracking_sptr tracking_sptr_; + +private: + // Managed by the base class + Dll_Pll_Conf trk_params_; + const std::string role_; + size_t item_size_; +}; + +/** \} */ +/** \} */ +#endif // GNSS_SDR_BASE_DLL_PLL_TRACKING_H diff --git a/src/algorithms/tracking/adapters/beidou_b1c_dll_pll_veml_tracking.cc b/src/algorithms/tracking/adapters/beidou_b1c_dll_pll_veml_tracking.cc new file mode 100644 index 000000000..5cfc8f362 --- /dev/null +++ b/src/algorithms/tracking/adapters/beidou_b1c_dll_pll_veml_tracking.cc @@ -0,0 +1,101 @@ +/*! + * \file beidou_b1c_dll_pll_veml_tracking.cc + * \brief Adapts a DLL+PLL VEML tracking loop block to a TrackingInterface + * for BeiDou B1C signals + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "beidou_b1c_dll_pll_veml_tracking.h" +#include "Beidou_B1C.h" +#include "configuration_interface.h" +#include "display.h" +#include +#include + +#if USE_GLOG_AND_GFLAGS +#include +#else +#include +#endif + +BeidouB1cDllPllVemlTracking::BeidouB1cDllPllVemlTracking( + const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams) + : BaseDllPllTracking(configuration, role, in_streams, out_streams) +{ + configure_tracking_parameters(configuration); + create_tracking_block(); +} + + +void BeidouB1cDllPllVemlTracking::configure_tracking_parameters( + const ConfigurationInterface* configuration [[maybe_unused]]) +{ + config_params().vector_length = static_cast(std::round( + config_params().fs_in / (BEIDOU_B1C_CODE_RATE_CPS / BEIDOU_B1C_CODE_LENGTH_CHIPS))); + config_params().system = 'C'; + const std::array sig{'1', 'D', '\0'}; + std::copy_n(sig.data(), 3, config_params().signal); + const bool acq_qmboc = configuration->property("Acquisition_1D.qmboc", config_params().b1c_qmboc_tracking); + // Keep tracking-side local replica modulation aligned with acquisition by default. + config_params().b1c_qmboc_tracking = configuration->property(role() + ".b1c_qmboc_tracking", acq_qmboc); + + if (config_params().extend_correlation_symbols < 1) + { + config_params().extend_correlation_symbols = 1; + std::cout << TEXT_RED << "WARNING: BeiDou B1C. extend_correlation_symbols must be bigger than 0. Coherent integration has been set to 1 symbol (10 ms)" << TEXT_RESET << '\n'; + } + else if (!config_params().track_pilot && config_params().extend_correlation_symbols > 1) + { + config_params().extend_correlation_symbols = 1; + std::cout << TEXT_RED << "WARNING: BeiDou B1C. Extended coherent integration is not allowed when tracking the data component. Coherent integration has been set to 10 ms (1 symbol)" << TEXT_RESET << '\n'; + } + + // B1C pilot: 1800-chip secondary sync spans one B-CNAV1 frame (18 s). + // Keep coherent integration at 1 symbol (10 ms); extended correlator is not used. + if (config_params().track_pilot) + { + config_params().extend_correlation_symbols = 1; + const auto min_bit_sync_limit_s = static_cast( + BEIDOU_B1C_FRAME_PERIOD_S + 30); + if (config_params().bit_synchronization_time_limit_s < min_bit_sync_limit_s) + { + config_params().bit_synchronization_time_limit_s = min_bit_sync_limit_s; + } + } + + if ((config_params().extend_correlation_symbols > 1) && + (config_params().pll_bw_narrow_hz > config_params().pll_bw_hz || + config_params().dll_bw_narrow_hz > config_params().dll_bw_hz)) + { + std::cout << TEXT_RED << "WARNING: BeiDou B1C. PLL or DLL narrow tracking bandwidth is higher than wide tracking one" << TEXT_RESET << '\n'; + } +} + + +void BeidouB1cDllPllVemlTracking::create_tracking_block() +{ + if (config_params().item_type == "gr_complex") + { + tracking_sptr_ = dll_pll_veml_make_tracking(config_params()); + DLOG(INFO) << "tracking(" << tracking_sptr_->unique_id() << ")"; + } + else + { + set_item_size(0); + tracking_sptr_ = nullptr; + LOG(WARNING) << config_params().item_type << " unknown tracking item type."; + } +} diff --git a/src/algorithms/tracking/adapters/beidou_b1c_dll_pll_veml_tracking.h b/src/algorithms/tracking/adapters/beidou_b1c_dll_pll_veml_tracking.h new file mode 100644 index 000000000..144abc335 --- /dev/null +++ b/src/algorithms/tracking/adapters/beidou_b1c_dll_pll_veml_tracking.h @@ -0,0 +1,41 @@ +/*! + * \file beidou_b1c_dll_pll_veml_tracking.h + * \brief Adapts a DLL+PLL VEML tracking loop block to a TrackingInterface + * for BeiDou B1C signals + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BEIDOU_B1C_DLL_PLL_VEML_TRACKING_H +#define GNSS_SDR_BEIDOU_B1C_DLL_PLL_VEML_TRACKING_H + +#include "base_dll_pll_tracking.h" + +class BeidouB1cDllPllVemlTracking : public BaseDllPllTracking +{ +public: + BeidouB1cDllPllVemlTracking(const ConfigurationInterface* configuration, + const std::string& role, + unsigned int in_streams, + unsigned int out_streams); + + inline std::string implementation() override + { + return "BEIDOU_B1C_DLL_PLL_VEML_Tracking"; + } + +private: + void configure_tracking_parameters(const ConfigurationInterface* configuration) override; + void create_tracking_block() override; +}; + +#endif // GNSS_SDR_BEIDOU_B1C_DLL_PLL_VEML_TRACKING_H diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc index bb02503b0..f492598ab 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.cc @@ -22,6 +22,7 @@ */ #include "dll_pll_veml_tracking.h" +#include "Beidou_B1C.h" #include "Beidou_B1I.h" #include "Beidou_B3I.h" #include "GLONASS_L1_L2_CA.h" @@ -33,6 +34,7 @@ #include "Galileo_E5b.h" #include "Galileo_E6.h" #include "MATH_CONSTANTS.h" +#include "beidou_b1c_signal_replica.h" #include "beidou_b1i_signal_replica.h" #include "beidou_b3i_signal_replica.h" #include "galileo_e1_signal_replica.h" @@ -180,6 +182,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) map_signal_pretty_name["7X"] = "E5b"; map_signal_pretty_name["L5"] = "L5"; map_signal_pretty_name["B1"] = "B1I"; + map_signal_pretty_name["1D"] = "B1C"; map_signal_pretty_name["B3"] = "B3I"; map_signal_pretty_name["E6"] = "E6"; map_signal_pretty_name["J1"] = "L1 C/A"; @@ -449,6 +452,31 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) d_data_secondary_code_length = static_cast(BEIDOU_B3I_SECONDARY_CODE_LENGTH); d_data_secondary_code_string = BEIDOU_B3I_SECONDARY_CODE_STR; } + else if (d_signal_type == "1D") + { + d_signal_carrier_freq = BEIDOU_B1C_FREQ_HZ; + d_code_period = BEIDOU_B1C_CODE_PERIOD_S; + d_code_chip_rate = BEIDOU_B1C_CODE_RATE_CPS; + d_code_length_chips = static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS); + d_symbols_per_bit = BEIDOU_B1C_SYMBOLS_PER_BIT; + d_correlation_length_ms = static_cast(BEIDOU_B1C_CODE_PERIOD_MS); + d_code_samples_per_chip = d_trk_parameters.b1c_qmboc_tracking ? 12 : 2; + d_veml = true; + d_trk_parameters.spc = d_trk_parameters.early_late_space_chips; + d_trk_parameters.slope = static_cast(-CalculateSlopeAbs(&SinBocCorrelationFunction<1, 1>, d_trk_parameters.spc)); + d_trk_parameters.y_intercept = static_cast(GetYInterceptAbs(&SinBocCorrelationFunction<1, 1>, d_trk_parameters.spc)); + if (d_trk_parameters.track_pilot) + { + d_secondary = true; + d_secondary_code_length = static_cast(BEIDOU_B1C_PILOT_SECONDARY_CODE_LENGTH); + d_signal_pretty_name = d_signal_pretty_name + "P"; + } + else + { + d_secondary = false; + d_signal_pretty_name = d_signal_pretty_name + "D"; + } + } else { LOG(WARNING) << "Invalid Signal argument when instantiating tracking blocks"; @@ -609,8 +637,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) d_carrier_loop_filter.set_params(d_trk_parameters.fll_bw_hz, d_trk_parameters.pll_bw_hz, d_trk_parameters.pll_filter_order); // Initialization of local code replica - // Get space for a vector with the sinboc(1,1) replica sampled 2x/chip - d_tracking_code.resize(2 * d_code_length_chips, 0.0); + d_tracking_code.resize(static_cast(d_code_samples_per_chip) * static_cast(d_code_length_chips), 0.0); // correlator outputs (scalar) if (d_veml) { @@ -668,7 +695,7 @@ dll_pll_veml_tracking::dll_pll_veml_tracking(const Dll_Pll_Conf &conf_) // Enable Data component prompt correlator (slave to Pilot prompt) if tracking uses Pilot signal if (d_trk_parameters.track_pilot) { - d_data_code.resize(2 * d_code_length_chips, 0.0); + d_data_code.resize(static_cast(d_code_samples_per_chip) * static_cast(d_code_length_chips), 0.0); } // --- Initializations --- @@ -806,6 +833,7 @@ void dll_pll_veml_tracking::start_tracking() d_carrier_doppler_hz = d_acq_carrier_doppler_hz; d_carrier_phase_step_rad = TWO_PI * d_carrier_doppler_hz / d_trk_parameters.fs_in; d_carrier_phase_rate_step_rad = 0.0; + d_b1c_prelock_output_pending = false; d_carr_ph_history.clear(); d_code_ph_history.clear(); std::array Signal_{}; @@ -950,6 +978,32 @@ void dll_pll_veml_tracking::start_tracking() d_Prompt_circular_buffer.set_capacity(d_secondary_code_length); } } + else if (d_systemName == "Beidou" && d_signal_type == "1D") + { + const int32_t prn_index = static_cast(d_acquisition_gnss_synchro->PRN) - 1; + const auto b1c_replica_fs = static_cast(d_code_samples_per_chip * BEIDOU_B1C_CODE_RATE_CPS); + if (d_trk_parameters.track_pilot) + { + const std::array pilot_signal = {{'1', 'P', '\0'}}; + beidou_b1c_code_gen_float_sampled( + d_tracking_code, pilot_signal, d_trk_parameters.b1c_qmboc_tracking, + d_acquisition_gnss_synchro->PRN, b1c_replica_fs, 0, false); + // Data component remains BOC(1,1) even when pilot is QMBOC. + beidou_b1c_code_gen_float_sampled( + d_data_code, Signal_, d_trk_parameters.b1c_qmboc_tracking, + d_acquisition_gnss_synchro->PRN, b1c_replica_fs, 0, false); + d_Prompt_Data[0] = gr_complex(0.0, 0.0); + d_multicorrelator_cpu.set_data_code_and_prompt_tap( + d_code_samples_per_chip * d_code_length_chips, d_data_code.data(), d_prompt_data_shift); + d_secondary_code_string = BEIDOU_B1C_PILOT_SECONDARY_CODE[prn_index]; + } + else + { + beidou_b1c_code_gen_float_sampled( + d_tracking_code, Signal_, d_trk_parameters.b1c_qmboc_tracking, + d_acquisition_gnss_synchro->PRN, b1c_replica_fs, 0, false); + } + } else if (d_systemName == "Beidou" && d_signal_type == "B3") { @@ -1170,7 +1224,15 @@ bool dll_pll_veml_tracking::acquire_secondary() } } - if (abs(corr_value) == static_cast(d_secondary_code_length)) + auto lock_threshold = static_cast(d_secondary_code_length); + if (d_systemName == "Beidou" && d_signal_type == "1D") + { + const float ratio = std::min(std::max(d_trk_parameters.b1c_secondary_lock_ratio, 0.5F), 1.0F); + lock_threshold = std::max(1, static_cast(std::lround( + ratio * static_cast(d_secondary_code_length)))); + } + + if (abs(corr_value) >= lock_threshold) { if (corr_value < 0) { @@ -1397,6 +1459,7 @@ void dll_pll_veml_tracking::clear_tracking_vars() d_code_error_filt_chips = 0.0; d_current_symbol = 0; d_current_data_symbol = 0; + d_b1c_prelock_output_pending = false; d_Prompt_circular_buffer.clear(); d_carrier_phase_rate_step_rad = 0.0; d_code_phase_rate_step_chips = 0.0; @@ -1628,6 +1691,61 @@ void dll_pll_veml_tracking::save_correlation_results() } +void dll_pll_veml_tracking::map_correlator_to_iq(const gr_complex &c, float &out_i, float &out_q) const +{ + if (d_interchange_iq) + { + out_i = c.imag(); + out_q = c.real(); + } + else + { + out_i = c.real(); + out_q = c.imag(); + } +} + + +void dll_pll_veml_tracking::assign_correlators_to_synchro(Gnss_Synchro &synchro) const +{ + if (d_systemName == "Beidou" && d_signal_type == "1D" && d_trk_parameters.track_pilot) + { + const gr_complex pilot_raw = *d_Prompt; + gr_complex pilot_ref = (d_state == 2) ? pilot_raw : d_P_accu; + // Do not apply pilot-secondary sign during pre-lock (phase unknown until acquire_secondary()). + + const float pilot_abs = std::abs(pilot_ref); + gr_complex data_aligned = d_P_data_accu; + if (pilot_abs > 1e-6F) + { + data_aligned = d_P_data_accu * std::conj(pilot_ref) / pilot_abs; + } + + float data_prompt = d_trk_parameters.b1c_prompt_use_data_q ? data_aligned.imag() : data_aligned.real(); + float pilot_i_for_sync = 0.0F; + float pilot_q_unused = 0.0F; + map_correlator_to_iq(pilot_raw, pilot_i_for_sync, pilot_q_unused); + float pilot_prompt = pilot_i_for_sync; + if (d_trk_parameters.b1c_prompt_normalize_power) + { + data_prompt *= d_trk_parameters.b1c_data_prompt_scale; + pilot_prompt *= d_trk_parameters.b1c_pilot_prompt_scale; + } + synchro.Prompt_I = static_cast(data_prompt); + synchro.Prompt_Q = static_cast(pilot_prompt); + return; + } + + float prompt_i = 0.0F; + float prompt_q = 0.0F; + + map_correlator_to_iq(d_P_data_accu, prompt_i, prompt_q); + + synchro.Prompt_I = static_cast(prompt_i); + synchro.Prompt_Q = static_cast(prompt_q); +} + + void dll_pll_veml_tracking::log_data() { if (d_dump) @@ -2055,6 +2173,29 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) // enable write dump file this cycle (valid DLL/PLL cycle) log_data(); + // Feed 10 ms B1C data symbols to telemetry while secondary lock is pending, + // so telemetry can build a rolling 18 s frame history before the first valid symbol. + if (d_systemName == "Beidou" && d_signal_type == "1D" && d_trk_parameters.track_pilot && + !d_pull_in_transitory && d_current_data_symbol == 0) + { + // State 2 does not update d_P_data_accu in save_correlation_results(). + // Use the instantaneous 10 ms data prompt and assign_correlators_to_synchro() + // to publish data (Prompt_I) and pilot (Prompt_Q) to telemetry. + d_P_data_accu = d_Prompt_Data[0]; + current_synchro_data = *d_acquisition_gnss_synchro; + assign_correlators_to_synchro(current_synchro_data); + current_synchro_data.Code_phase_samples = d_rem_code_phase_samples; + current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; + current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; + current_synchro_data.CN0_dB_hz = d_CN0_SNV_dB_Hz; + current_synchro_data.correlation_length_ms = d_correlation_length_ms; + // Cache pre-lock symbols for telemetry history, but mark them invalid so + // telemetry can avoid running BCH/LDPC before secondary alignment is confirmed. + current_synchro_data.Flag_valid_symbol_output = false; + d_b1c_prelock_output_pending = true; + d_P_data_accu = gr_complex(0.0, 0.0); + } + if (!d_pull_in_transitory) { if (d_secondary) @@ -2203,16 +2344,7 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) // ########### Output the tracking results to Telemetry block ########## // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; - if (d_interchange_iq) - { - current_synchro_data.Prompt_I = static_cast(d_P_data_accu.imag()); - current_synchro_data.Prompt_Q = static_cast(d_P_data_accu.real()); - } - else - { - current_synchro_data.Prompt_I = static_cast(d_P_data_accu.real()); - current_synchro_data.Prompt_Q = static_cast(d_P_data_accu.imag()); - } + assign_correlators_to_synchro(current_synchro_data); current_synchro_data.Code_phase_samples = d_rem_code_phase_samples; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; @@ -2255,16 +2387,7 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) // ########### Output the tracking results to Telemetry block ########## // Fill the acquisition data current_synchro_data = *d_acquisition_gnss_synchro; - if (d_interchange_iq) - { - current_synchro_data.Prompt_I = static_cast(d_P_data_accu.imag()); - current_synchro_data.Prompt_Q = static_cast(d_P_data_accu.real()); - } - else - { - current_synchro_data.Prompt_I = static_cast(d_P_data_accu.real()); - current_synchro_data.Prompt_Q = static_cast(d_P_data_accu.imag()); - } + assign_correlators_to_synchro(current_synchro_data); current_synchro_data.Code_phase_samples = d_rem_code_phase_samples; current_synchro_data.Carrier_phase_rads = d_acc_carrier_phase_rad; current_synchro_data.Carrier_Doppler_hz = d_carrier_doppler_hz; @@ -2322,11 +2445,24 @@ int dll_pll_veml_tracking::general_work(int noutput_items __attribute__((unused) consume_each(d_current_prn_length_samples); // d_sample_counter += static_cast(d_current_prn_length_samples); - if (current_synchro_data.Flag_valid_symbol_output || loss_of_lock) + if (current_synchro_data.Flag_valid_symbol_output || loss_of_lock || d_b1c_prelock_output_pending) { current_synchro_data.fs = static_cast(d_trk_parameters.fs_in); current_synchro_data.Tracking_sample_counter = this->nitems_read(0); - current_synchro_data.Flag_valid_symbol_output = !loss_of_lock; + if (loss_of_lock) + { + current_synchro_data.Flag_valid_symbol_output = false; + d_b1c_prelock_output_pending = false; + } + else if (d_b1c_prelock_output_pending) + { + current_synchro_data.Flag_valid_symbol_output = false; + d_b1c_prelock_output_pending = false; + } + else + { + current_synchro_data.Flag_valid_symbol_output = true; + } current_synchro_data.Flag_PLL_180_deg_phase_locked = d_Flag_PLL_180_deg_phase_locked; // generate new tag associated with gnss-synchro object diff --git a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h index af5135e1c..086fb0035 100644 --- a/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h +++ b/src/algorithms/tracking/gnuradio_blocks/dll_pll_veml_tracking.h @@ -85,6 +85,8 @@ private: void clear_tracking_vars(); void save_correlation_results(); void log_data(); + void map_correlator_to_iq(const gr_complex &c, float &out_i, float &out_q) const; + void assign_correlators_to_synchro(Gnss_Synchro &synchro) const; void configure_bit_synchronizer(); bool cn0_and_tracking_lock_status(double coh_integration_time_s); bool acquire_secondary(); @@ -219,6 +221,7 @@ private: bool d_Flag_PLL_180_deg_phase_locked; bool d_use_histogram_bit_sync; bool d_wait_for_bit_edge{false}; + bool d_b1c_prelock_output_pending{false}; }; diff --git a/src/algorithms/tracking/libs/dll_pll_conf.cc b/src/algorithms/tracking/libs/dll_pll_conf.cc index ea4aa01a8..96e49cffe 100644 --- a/src/algorithms/tracking/libs/dll_pll_conf.cc +++ b/src/algorithms/tracking/libs/dll_pll_conf.cc @@ -159,4 +159,11 @@ void Dll_Pll_Conf::SetFromConfiguration(const ConfigurationInterface *configurat bs_transition_window_epochs = configuration->property(role + ".bs_transition_window_epochs", bs_transition_window_epochs); bs_tentative_events_required = configuration->property(role + ".bs_tentative_events_required", bs_tentative_events_required); bs_use_phase_dot_detector = configuration->property(role + ".bs_use_phase_dot_detector", bs_use_phase_dot_detector); + + b1c_qmboc_tracking = configuration->property(role + ".b1c_qmboc_tracking", b1c_qmboc_tracking); + b1c_prompt_use_data_q = configuration->property(role + ".b1c_prompt_use_data_q", b1c_prompt_use_data_q); + b1c_prompt_normalize_power = configuration->property(role + ".b1c_prompt_normalize_power", b1c_prompt_normalize_power); + b1c_data_prompt_scale = configuration->property(role + ".b1c_data_prompt_scale", b1c_data_prompt_scale); + b1c_pilot_prompt_scale = configuration->property(role + ".b1c_pilot_prompt_scale", b1c_pilot_prompt_scale); + b1c_secondary_lock_ratio = configuration->property(role + ".b1c_secondary_lock_ratio", b1c_secondary_lock_ratio); } diff --git a/src/algorithms/tracking/libs/dll_pll_conf.h b/src/algorithms/tracking/libs/dll_pll_conf.h index e81b6856e..cf147698e 100644 --- a/src/algorithms/tracking/libs/dll_pll_conf.h +++ b/src/algorithms/tracking/libs/dll_pll_conf.h @@ -90,6 +90,13 @@ public: bool dump_mat{true}; bool tow_to_trk{false}; bool bs_use_phase_dot_detector{true}; + // BeiDou B1C-specific options. + bool b1c_qmboc_tracking{true}; + bool b1c_prompt_use_data_q{true}; + bool b1c_prompt_normalize_power{true}; + float b1c_data_prompt_scale{1.7320508F}; // sqrt(3), compensates 1:3 data:pilot power. + float b1c_pilot_prompt_scale{1.0F}; + float b1c_secondary_lock_ratio{0.88F}; }; diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index 0007974f4..c2c83c81e 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -28,6 +28,10 @@ #include "acquisition_interface.h" #include "array_signal_conditioner.h" #include "beamformer_filter.h" +#include "beidou_b1c_dll_pll_veml_tracking.h" +#include "beidou_b1c_pcps_ambiguous_acquisition.h" +#include "beidou_b1c_telemetry_decoder.h" +#include "beidou_b1c_telemetry_decoder_gs.h" #include "beidou_dnav_telemetry_decoder_gs.h" #include "byte_to_short.h" #include "channel.h" @@ -209,6 +213,7 @@ const auto signal_mapping = std::vector>{ {"1G", "GLONASS L1 C/A"}, {"2G", "GLONASS L2 C/A"}, {"B1", "BEIDOU B1I"}, + {"1D", "BEIDOU B1C"}, {"B3", "BEIDOU B3I"}, {"7X", "GALILEO E5b I (I/NAV OS)"}, {"J1", "QZSS L1 C/A"}, @@ -492,6 +497,10 @@ std::unique_ptr get_acq_block( { return std::make_unique(configuration, role, implementation, in_streams, out_streams, BDS_B1); } + else if (implementation == "BEIDOU_B1C_PCPS_Ambiguous_Acquisition") + { + return std::make_unique(configuration, role, in_streams, out_streams); + } else if (implementation == "BEIDOU_B3I_PCPS_Acquisition") { return std::make_unique(configuration, role, implementation, in_streams, out_streams, BDS_B3); @@ -604,6 +613,10 @@ std::unique_ptr get_trk_block( { return std::make_unique(configuration, role, implementation, in_streams, out_streams, BDS_B1); } + else if (implementation == "BEIDOU_B1C_DLL_PLL_VEML_Tracking") + { + return std::make_unique(configuration, role, in_streams, out_streams); + } else if (implementation == "BEIDOU_B3I_DLL_PLL_Tracking") { return std::make_unique(configuration, role, implementation, in_streams, out_streams, BDS_B3); @@ -683,6 +696,11 @@ std::unique_ptr get_tlm_block( unsigned int in_streams, unsigned int out_streams) { + if (implementation == "BEIDOU_B1C_Telemetry_Decoder") + { + return std::make_unique(configuration, role, in_streams, out_streams); + } + telemetry_impl_interface_sptr telemetry; if (implementation == "GPS_L1_CA_Telemetry_Decoder") diff --git a/src/core/receiver/gnss_flowgraph.cc b/src/core/receiver/gnss_flowgraph.cc index e02397a45..47d630c4c 100644 --- a/src/core/receiver/gnss_flowgraph.cc +++ b/src/core/receiver/gnss_flowgraph.cc @@ -20,6 +20,7 @@ */ #include "gnss_flowgraph.h" +#include "Beidou_B1C.h" #include "Beidou_B1I.h" #include "GLONASS_L1_L2_CA.h" #include "GPS_L1_CA.h" @@ -91,6 +92,7 @@ const auto signal_mapping = std::unordered_map= 1U && prn <= 5U) || (prn >= 59U && prn <= 63U)) + { + continue; // GEO satellites do not broadcast B1C (ICD section 3.1) + } + } if (signal_str == "J5" && prn > QZSS_L5_MAX_PRN) { // QZSS L1 C/B PRNs (203-206) do not transmit an L5 signal diff --git a/src/core/receiver/gnss_flowgraph.h b/src/core/receiver/gnss_flowgraph.h index 5bc6cf8a9..3127699ef 100644 --- a/src/core/receiver/gnss_flowgraph.h +++ b/src/core/receiver/gnss_flowgraph.h @@ -264,6 +264,7 @@ private: evGLO_1G, evGLO_2G, evBDS_B1, + evBDS_B1C, evBDS_B3, evQZS_J1, evQZS_J5 diff --git a/src/core/system_parameters/Beidou_B1C.h b/src/core/system_parameters/Beidou_B1C.h new file mode 100644 index 000000000..1cc241ea1 --- /dev/null +++ b/src/core/system_parameters/Beidou_B1C.h @@ -0,0 +1,46 @@ +/*! + * \file Beidou_B1C.h + * \brief Defines system parameters for BeiDou B1C open service signal + * \author GNSS-SDR contributors + * + * Parameter values from BDS-SIS-ICD-B1C-1.0 (2017-12). + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BEIDOU_B1C_H +#define GNSS_SDR_BEIDOU_B1C_H + +#include "Beidou_B1C_codes.h" +#include "gnss_frequencies.h" +#include + +/** \addtogroup Core + * \{ */ +/** \addtogroup System_Parameters + * \{ */ + +constexpr double BEIDOU_B1C_FREQ_HZ = FREQ1; //!< §4.2.2, Table 4-1 [Hz] +constexpr double BEIDOU_B1C_CODE_RATE_CPS = 1.023e6; //!< §5.2.1 [chips/s] +constexpr double BEIDOU_B1C_CODE_LENGTH_CHIPS = 10230.0; //!< §5.2.1 [chips] +constexpr double BEIDOU_B1C_CODE_PERIOD_S = 0.01; //!< §5.2.1, 10 ms [s] +constexpr uint32_t BEIDOU_B1C_CODE_PERIOD_MS = 10; //!< §5.2.1 [ms] +constexpr uint32_t BEIDOU_B1C_OPT_ACQ_FS_SPS = 2000000; //!< 2 samples/chip at 1.023 Mcps +constexpr int32_t BEIDOU_B1C_PILOT_SECONDARY_CODE_LENGTH = 1800; //!< §5.2.2 [chips] +constexpr int32_t BEIDOU_B1C_TELEMETRY_RATE_SPS = 100; //!< §6.2 [symbols/s] +constexpr int32_t BEIDOU_B1C_SYMBOLS_PER_BIT = 1; //!< 100 sps, 10 ms/code period +constexpr int32_t BEIDOU_B1C_FRAME_LENGTH_SYMBOLS = 1800; //!< §6.2 [symbols] +constexpr int32_t BEIDOU_B1C_FRAME_PERIOD_S = 18; //!< §6.2 [s] +constexpr int32_t BEIDOU_B1C_NUMBER_OF_PRNS = 63; //!< §5.2.1 + +/** \} */ +/** \} */ +#endif // GNSS_SDR_BEIDOU_B1C_H diff --git a/src/core/system_parameters/Beidou_B1C_codes.h b/src/core/system_parameters/Beidou_B1C_codes.h new file mode 100644 index 000000000..c2d81b6d9 --- /dev/null +++ b/src/core/system_parameters/Beidou_B1C_codes.h @@ -0,0 +1,5815 @@ +/* Auto-generated by generate_beidou_b1c_codes.py. Do not edit manually. */ +#ifndef GNSS_SDR_BEIDOU_B1C_CODES_H +#define GNSS_SDR_BEIDOU_B1C_CODES_H + +#include + +constexpr size_t BEIDOU_B1C_PRIMARY_CODE_STR_LENGTH = 2558; +constexpr size_t BEIDOU_B1C_PILOT_SECONDARY_CODE_STR_LENGTH = 1800; + +constexpr char BEIDOU_B1C_DATA_PRIMARY_CODE[63][2559] = { + "AFF64E556160BF8C46A5CA931707BDF053D739633BC7AFFD5CBD58E13B9E8A42AFC140E8C2EF" + "77DF3A527D88C0BDD3FB648C57E544C7B1D2CE2C0121A9B22C069BC66440727BB2D2C3E58CAE" + "10FF1C2B43AF2252C476A541F6F63E78D42A6177F82CE5FD05ADE8BC903352A135D5B6EE2FE2" + "BA1A03E1A7E38A6722857CC8960F23F73BAC11857C359B8EE9C3B241BF395C2EF913066E2E51" + "0C989560A19BA20C83D75954E72FF9C0FE1DFDCB78842F6D5D4E1F8FBE4D633A80742229AEA5" + "A10BC62A82480B0D788F2DEDFF32BE9388E17F84D0024779CFB8D00B665EE99239E5E20E04ED" + "2E099AAFD664B7DE2677D05D955BBE87941B7D8A4AE7282312D0BC5BC6445949A2A702EA3215" + "60810E260E33EFBEC9F212CE9272F178B8EC4449EEE2446E8FBDDDFD75440D2AA1D449F0BFCF" + "4FA0470A9138BE2194AB5D13AF7EEF2D537AD4C85DC8C85EAB0FA20790F03385F792567171F9" + "5EC5F24859211ED82AB2A15552D29051161421A6744755099A06766A639A3DC1B000E01F2C28" + "952958A22461891146A52A450D3E01C00360EF1671959B9816642AB88B99610A1A228252D2AA" + "A1535506DE21268493E8DEA7E3A39A927BE87303C278117C355E84C4EE84CAD7B2AD3DDFBD72" + "2EB54A611F47225438817CBCFF43E48AE1552C08ABAFEEEF7C5D8891DDE4888DC747A3D3925C" + "D213E4DF7DF31C191C2041AA1315D0395164A68898F68F42D2310539D4946FB60A785F76AA6E" + "82FB991EFB499AFD56641D2DC81C11E9E71265DE99B402C77CE7B89002C87FA1C4725F533FED" + "ED3C47AC3404905518F421695D65110B805731AC9F7C7E1CAEADBD0847B4EFEE1FC0E7FD39CA" + "A6BAF04C11766141AA464C229D1D983227DD0EA73F609370E5DC766B0FA8620D773BF13C1A44" + "CFA851399471F961F0161751FD1DDB6AEB2152B3024F45ED682FE9CD07FBA1950AC79F1BDBE0" + "A95B88D2913D70B50E3FC21D4C69F0D2D37793808998F6580D136561200D1CD2E378C8A9FA8C" + "49B7F2EF40C46F92973EFBBDD0C5C0A0FD50945E7721C6AF4EAFFD78F731A73AF283EF783A32" + "54E9588C7F41A1AA9C9BFD6763EB93A2D17D2CBDC34198C76A79D8A9213808EABB1DDD70445A" + "9C4B9CC46AFF5B4DDFF81828B7A2CE3FB86A36C438B346996BBEE329B4F36855943BFBE91CB4" + "8D62BEB9787CB115F409B2A51DF12BD681DD3641F3D82C92EAC40DBA59A1B59D1207C7F166D7" + "A46D2DC6AFC871902441912C990BE97FD6D8795A0D360A906044EFDE9EC9853E3AB730EE8071" + "13EDEE3721A8F0DDD37E4503AE76A7E1C4FA394452D477D3885E611CD560E7C776AF25087519" + "0DB14E52F630A732983239569C54D8577B68BE6449FC5AD077C00B6922642C231B1799904C75" + "2F343D3C36329E9043B1A46FB0E1E9AC3E030D408FBC95F1645F1ADF72A64AB7D9067BD71FC7" + "1FC75EF304DF6A932A77DAC7D1347D49EF88158603E1ACBC386FB12C6E104BCA6361E5E167A5" + "71904CCF46C621A13224B6801F705AD1FC9133E8B6F750D951CB54E260CA6728637A53946D84" + "C5708527AB771F383559C433D08E5F715A5114E2F91C3F2B73AE0513F65DD878AC2763BDBE44" + "700BB8676AE3E50C9BCBDFB910304A836582D4F0DB5FF4BE84C9A44C11204C709FAB1DA5B12F" + "5B347F1F0245CD6C2CD2ED811ABA49E0DE7C1365DC0B5EA47DC52A6C817D4469F0F4EBEA3589" + "69C4BEFEE14D50B6796CA63BEEB4CB1668E11B62B0EFE39A2F68A0C0FFDD96D7FAB119CE91CA" + "D11075DDC6EAB880E424A8DCF2B718CC161DE9A5F45A2E4EBC", + "693AE1CF01B3496EB32DB3ADFACC374483C06DB0F6D8513CDA573CDC12D18089F896670D571C" + "F5EAED629A5372ECD837208CC200ADFD6E06D4C05C655FE4C2237C12602013FEF5D846D630A9" + "6FE8691C9AF2DDEE6B75AF85C07ECC3329432EB5B30F43ED34A842C7F4B31651B91C08E5FCF0" + "3680546DBBC763127C63EEBD617B467BBA976A105FC3B8F1F2A3EB59A1CFFCFBA48BA8BEE94F" + "7FEE1A0B3058D681C3F0FCE87575F89B68824767115BC76C49ECD665B1099A742738ABB704FA" + "93FC49D88318D5992A7884F8313C82DB32678FC3BB7361AB9EDE29AAB0608A5705B0D4B54E92" + "10622CC4B875500159E5D01A8CD27D3DEE89C5852508269663FFC6696410A4A1A39177BCBE4B" + "31580BA79A800AAE1D233446084972AD2B0DA0EA51060D55947B79D586CEDDC3F1E64CDB413C" + "8C1F211E5499AB18C11B923FC95F20EDD51CE42E59908DA66B379236E3DA88E6E24116D91FAE" + "AE173F0FC3816B1A0CD05877FEF2977D15D125DF3FF3859AD7C54F8F1DC3FA0856E95DDE62DE" + "86BD77C63E48C6E3DDB62A016C0F3FA710389D8A68CD2FE342152CB7C2F0CDAD74C294CC337E" + "03A1F5AED677BB4F59389617F6950C6B621BAF7FC80406483EC44327FAA63A032B6076BFB500" + "433104EC1B374ECA5946B757AF38EAB0E6691F91018B483B3CEA5B3C8A1B6F0DB603C122EC33" + "5FB5CDB4CD7692CD80F3875C969B8A518DE4A40C39D24F09D479D0C6CDB6A2FFA50229B29275" + "2848D6383F4E6BF118577E1CEA2C1CA95E9EBAA7C9B1105722E4209F0020AC50634A5AE6ED58" + "A4E5E8E53D3DDCDBADB2A0A0F75384EAB6AD4B950E11660FE6CF73387293BEB3BE8659483EE4" + "247F8405A2A48FAC53A90BC3B6354189646B766044B308F3E2A381CDBC5C6F1B1791C39836FB" + "9FBF0DD446C047263C17A3E8A1BAC07C629BC2A039541E1E02F3D921243A35E067F92197A5B5" + "3FB0CF92DC2A885C67399F0FE37F6C90E1D1E1AFC31F8282F156456ECEFFCD1E41798771670C" + "97C99613D30A8271EC6156B9FCB576F8281599B1285D6E506C22618E152EFE7FF65098BFF146" + "0E797CECF2A44FF7B652285EFCB0C525AB8A7ED6C476B8A70847E3A5D314A76CF78B4CBDC56C" + "B15AC2D4AE8068C6825C9C80851CE0F059E26A441448AA854BC8025A80F2E3D7017BF5F3AE1E" + "7742F257D4CDB71CDD0712E6F81C10C277A689E9CD70C6199DEC90AFAD67B79D407DD0938E43" + "B9F394A7E5A4C2021E0B7D49F87DEAE445D6CD1F166D7444EAF7C3F257DA0F080864B4FCA539" + "F3B84E392177C0573DBCD6BEA126F7330C61D672F22CBDC8610703ECE91C17671DB6657D49E8" + "5DCF0EB9F5FBD01D78E9E02B48027A542AA245044AC8F341E0E714202727482C62C02EA5686B" + "51A6D477A65A3DE6DCA51974B8FC421CA3ADC46D6FCA3AB49461A7EF42894DBDFE44A9E6E7D3" + "CE0C51FFA3214DFFCFEE950E30C886C14ED74291B3350283EDD5A7F3AD50C6F1C82A19790D32" + "7D261CD1DC33D04F167FEE6ED44D51E8283F187EB0F170E126DFD8FE1F339CC7422A87693E61" + "BF95B4BD3093FCC0F58B84909379E80F0F055380A87B28C7C06BB0A2F8BD078C9C406C45761F" + "BF3BED8338713D1B1EC747B67038A8F9E219A440CDDAC4D230558DB87A12B946BE24A8B4043F" + "C484EF82534C2FB9AFB929C399DE6CFC0CD10E153A56ADAAE4395DE0A0A9B6BB67779794E2F4" + "E4A356ECEB4A58C146A0801F2084E89D4111B27CABAF2F52A7068AE70FDD4311FACE5F838D62" + "4295C929B28814BFE8ADB66C6173C5721E49738604A4F63148", + "3F37CBFFEB6C65DF7DDACB8F182531D4719FAEF72491AB94A27BA07571CFFBD4AD67A4979431" + "6E316F3A07F86DEFC047540E9F2EC8FD7E56CCBD1593B95F3D6EDC02E8971528F85A0C662E78" + "09E3D60AFBBE8DF6212B21A2819C91CC4E943FC3154A7E2A3E978ADD9199FF9F2A9718443492" + "08223271BE5B9EF5AE2C382F678BB537055B8F9142CAF725D0A880F915A2DEFA470606754ECE" + "07A02B85E12BF3F26165D9A7C428FF2134DF905B1B73624BE7A471A40C163D57898BCD1275F0" + "8B43741FFC109983CAD7EBCF35AA9159F64CEC69B0805FE7AEE8734177090CF29E04150C49F3" + "DC4D0C56BCDEC517DB506179CB19A1CB27970BF13F8A4B81BBCD2BA05D94D978F7134F14F6A9" + "6EFF8EB588FA3551557C96F0AA3283A788E78964807829D4C5C0A6AE5DFA2048C8B2175ED279" + "488FE2253C96F5D09A262408BF74EACA074657283C024D23CE23CB8298AA1ED27D551558BE23" + "5AE3FEED2ADE51E591DE3D3653740BA967BB03A4A3F91FA3D3C9A70B31A73D0C15B7D146F67A" + "D46164779F24615040F29E6121DD059C2EEBCFF4021B2C6E64DF3512AB59E7AFD6A78332107F" + "F05D85A21F5C9167A323D578D0604B1C4BCFA48D9DB1B413F65909FE2847CB374D0C9F9FA90F" + "43A80BC0E6E55CC0C1C4BEF68B513E022A1749DEA68513E3B541D95BA3CDE83868EB5EF3B4FB" + "1C98882092584431D2A9F3FF331376A3D2F8A8FCA55187F852E4671273028B09A908DF62FBBE" + "A0D78F203CE8CC60B43E2951D22E8076ED79F53B93517A66D4FD7E26E9F2E055C407EF6C3FC0" + "B9ED18ED1853D24BCD6A57BFE71D5C0BBC8A53AB1249DEEBF31C57194831E3A6B77DF74C6DAF" + "FFA7D9F8AD3895320C836DAE53732A793A4354695E6DCD0138A00B220CBFE0EDBECB989D828E" + "BDB35DE00F35C9301C36A647E73D42127D854D0165C06C739070AC0154F6EFC7CB7B56CF7001" + "E07B2718016A376A54A62EB2193239751C95A9F682926A40DE8B1A6896F417026C239704A804" + "41FC3CC25A7AF40E4A72196D7335C853698CA312AA556A9DD03430B7F20CC00509A828A875EF" + "73FCCC2CA0D5B986649E52BBBDDBC292638E1174E3FD2E731702537B4B1A26DE59656BA5AC13" + "12E75F6051D9902A04E700787A563A941442EF7169D4843D7760075DB3A386ECCD576791D73D" + "AB6605919756A5FCEAB5F9AAEA10953F0E2622B42E87606CEF18938DC31FF2A17D6DF68A0C78" + "9F365CF96EA9ADD191D2D76C1FE7BACC0044573BD5CE32DE16077653EF492B16FBB008A67BDB" + "480C8CE83AA7B3E37A3765C30436D93CC46D8F53278E43438D4340AAEC6A238E0BC7F8F41C71" + "158DD540B0AC70B09C7932BC6D88CF26DB0830E9BB17B1F3795705CC4C04B6F799440377DA35" + "24BDF29BB81A1ED31CEAF73A88800CD779FE0DBAD2E262ED655DA7CE9B3E478C145BEDAFA153" + "FE30EC72463DCD81B85D0B51191C3F2A4215D567EB55CFE95ABA626819B56F3AE279BAACCDD8" + "71736EB801BBAF084AE5A3BDD08A0A571A97878039C8150266E281BEB9D2320D6975A9A69ED9" + "1634B7B2903A339D2FF1CBA21C719250F6EF77529E4998676AC14D0CCFF3BDEB854505642800" + "CC13FB430B02EE55AA9552314C65B284EB33ADA613949C0BD79690CF0FE08805483A710D903A" + "0BDA4596345EC09592505BE56A4E2BA71326135D194A95BB15A006393781E003BCDAB7B4F8FD" + "DBCAA00D4382738D80E9A02CA86F9210AF39F8995B0E0324EB3C01EEB36F5C506E4674DF6DC1" + "FF4C11340147202CED9EA58AB097279533B29D6DB04C132A44", + "86D34C3DE46D99FB5F62F6CA4106DA5267BA2516AE41AD737440ECB1FCA97F6C3745F5C53A41" + "4A317741776AB36F471BEA2288936B23F95258CD439CB3BBC55914B527CE502145C9D88D9EE7" + "00C37E6D56CB67F2A2CFE8D5B38199CAFA50959ED9D1B4C69C9FA29715D5147E99D95D11AB98" + "0BF6FB87FEF54C23176BB84CA4767A5852EA7D38CC3619C1C77C15AD4B5821D3E07BAEE85E74" + "F92C39E1D6DED0FB1FC272CB9062EA178BAFCA006823E6582837A58D95785E6B67B8456DC9A0" + "8DAE6EE7C924B171DDFCD798E0E4D039FDF0A30AAECE48BDE34BA1138D8DD70B7BDADC95E06A" + "1A75FFF98ADB17938A6F0996D9532EE3F09EB3477764A34FC8CEAF8792997B83EA987EE7BA02" + "DD8C4C2BAA4FA9DE04F215D87677E7BC3619B8D941109976708072150140B0B5C7C41DB01276" + "A33522707E05B07F1C0754FCA366C227D25F221B3629F95701C7F06D03F07225662B72406DC1" + "1F1D686814054270087374C84414D8ECC361EF3F7370DD427903DCAF92AEA1918DDA02EF3BF0" + "CABE0EF4CA4F0FAB989F96293777166BC87E3BA654DB4C87B28E4F46DA8CFFFD72C2B03D49DA" + "DEF6875D8D8E442E963DE8939BAA86287DFCE0593838CF59FDDC7469249F3BB3AD882C9DB510" + "EF36B3D0F54D8D2F60A0D33E20B0029FAE8F42BA304E9A721FC6F85BDB5C3CE1A4F973D0BBAE" + "F03E5C20D695AD41F71C1CC36198E5F2BA50D2F3712990EEB74621957BFF0EFB7E80CEAC45D4" + "DCCBF1455D474A2FC9CB196C5CDBCD4852FA9CCC0E6D58BF9A2A7F369B55B3F618073BCD88DC" + "9D1420539F256944D51EEE69CE1598D254FE26B6488A22BEC717B66AB7741774629412E51D7D" + "1761B7F4A9FC69B8117675AC13AB4522EF3252DB04129B7A37D6FCCDB13DE1965B0CDA863C6A" + "040B901B1A36E3F0BA462EC35E302FAD3400E89B6CCEAD5088956A560F260B4CC1A25A762F7B" + "01E3378C9B40C2C675EB689CF8F6B7169811C8E8EBA0800BDBECBD6C21734B0A6602161112F1" + "A3B946E0F587428C95971DA9687FC04A3372176384FBC50C01F5B0E131AB052AFA1CFDD7982A" + "41E7A3E94206E79AF65F73426194AEB4486F32F3509244E68AEF4594EE8BE2C85AA805CB3400" + "B023E693BE8DD39AEBD227FB4675A743347B3802E25FEA9891277116E2BC3A353BBFE5EBE7B5" + "B258F69AF2A6BA198E2EAA5E1972DE111771FF0D110249B48A0041DC663E025A014B6096D830" + "DE64B4160836E4792343988D508B797D733BF23CF65C39E3A7FFC0475FE40ECDDD140267A11E" + "9C39365E08260FCFB44E3FB8A45F5A8CB3059A799DA0C240B688C9D7FE19366DA284F05DD6BE" + "2A245BCA6B2924444C03FDBFC032222494D653DA24547D6BBA0F2145B66C987FEB93116D0243" + "05B99E59A0CD315AFA251DFC722DF3F064107A6C9C397885E6402CBBB37027FAE203FFE5C79C" + "3A6F3C4FDCCEBE9ED10AB119C2C49E276C10682D267B0C1B6906D2805A407C663B8200512D92" + "4088B0FF8EE8887B4E987A557471985D654F596F1A4DADE7D7A7FDDCAC5C3D47688EE4891957" + "FA47401CDE2CC2E5AE62DFE44BD759CBB17DC967C40D002CD3A0155A1347D17729A2F7516722" + "490ACF4CF6122D75298642CEFA6F59E7604297C5E7825419EBBF385F54A0D58C870DAF8030A3" + "DF21C6E84ECC5203FE1695B8E9A93142E1AF07629DC58F488868406650D2CE8436BD37DBD001" + "05D71713881968ED6F1F3916D7AE634302D931ECC780DEF46E5A458332D064F06A56A9110AB5" + "7336D917002CB5F40C7AC374625D0FC76C58D809D020563C60", + "3D0A5CC5D4A5A21E744E0CD71892C47465F871C0C398AB8E4391B229A86CA1A2476A7FFEDF53" + "CA3B598BD7EA722B9E71D57E9BA4737298F105A591D9B0EC7BE69D239907F757A69C5617E8E9" + "338B317E05E4133597984CE0BFDADA9B8DAE72095F3837C36B1442B74580779993D45D715AB5" + "A212B7F0685CB88FBB2D0C80597B1347DEB93BE8779825E18C31FAEEA9F9A6C44272D6D96A48" + "FA1765E245A2ABB5E4B654603F604DA5725B691B248752DC8336F629E6335036B4022C49384D" + "7D62217E641798042F3D440427165E3AB6924C09AFA9F08267362B1DADEF9668DC060A435DA5" + "A2ED971263D4A1FA27EF162500909FCEAC0A03CB364139C1C6D807C8B9A12B7C20F7838CBFCD" + "63E6AB819A351B7F58D923040AC2F7C5E9029717D8FABB72FB3A711759B8314D1B0522B5A184" + "8819CC8FA4332226612F899CC0890C2D6A2506C59460ECD74472E6FA76EAF8DF474A04BD1F7A" + "1A810624D8D7F6C562CC0EAB3E359FE98E0F7821F6A42CE89F00DB1C1CE413669E0281AB9FC8" + "48052347BF22FC295E32474DBA2D2DD6128301D8B34FBDADC6A36732087CAFAC81924B6AE3D3" + "47210115E7A100CF4133F42235F590E491A2016B6056633CA37B6609DA570926C4B6D2752D90" + "37E03153693D6EAA2D123D3742F892B4DB5A72111B2CFCABBAFC618C3D20CF70BEE4EBDF1646" + "F4D00985A6EF88E9D0B07F6A422D6AD475D15E4CCF700D176A1146B61F60E7D48273AD8ECADA" + "DFE83990CF4D66413D03F4668E64B8BF4351CB2F577F04CE25CB3EF1B86CDC4D2D0478CA7671" + "2ECBF55C73CEA272BF5E8CD6E29E57DBFFF2B7122C29B0ACA26C4E138EA8CE181C70FD31711A" + "48C759839173C22D295D19D285E12F7FD0E66E65177DEFD5DD23E56D06F7A8296951DD751DB9" + "8F5EF810DB37E2E5D3A45E058E8FFA1A756D8C1FDE18FAE5B35285063C7123C613E27A128DF6" + "A07346E77715C5F0D9B13213240F808F181B8F98C8BF3045A7837324517305F5D728AE6B6CAA" + "C92FF1F33A6211020E0F5BF3302B6C8AB491129D577ED5FD79A9C3350D029DB34CA5E3A3511A" + "7863805024C0226AD7BF9917F7AB61F9FD502ADE0CDD45C6A5BF2B466D0759D59E144DD54B8D" + "49E7B5AAF32FE005D91B5F80A8D149290B432DFB4DBBA3EC554B56BC01E9552D199D5F6FB931" + "D576603F5BAED749458B34C8E176FFF16FA09F7D0E033A1EA28386A1ADAB6640355FAC003BE0" + "5BFA5B090986DEA0D401D01808181AB85C53E359DAEE36D03DB5688B1960C38012C76AF72286" + "26C4F3B261FC5EC7DBE1BC959F0C42A807939B7CA2173D3A7530DD08C567E87E613A9B25C5CE" + "E7E773A3A4D95C867E17E6A310BB0CAE5CBCE8453ED9C9E0154230F9A93D87DBE37A3F864DCF" + "23646144EF56E34801C30698D116ADBC0B6C775B9AC7CA3A1D581810180B802B057B619090DA" + "5FDA07DC0035FAAC0266D5B58561C145785CC070BEF905F68FFF6E87132CD1A292EB75DAFC06" + "6EAB8C9DF6FAB998B4AA97803D6AD2AA37C5DDB2DFB4C2D094928B1501FAD89BA007F4CF55AD" + "E792B1D2ABB22879AB9AE0B662D4FDA563A2BB307B540ABF9F86D5EFE899FDEB564403240A01" + "C61E588AC5C7A532CDB940B0ACC3959EBFAB7EEAB948892D5136D40CCFDAF0704088465CCF8F" + "F4935536D67514EBAFA0CE8A248EC1E5A20CFD1319F1D818F101F024C84C8D9B0FA3A8EEE762" + "CE056FB1485E47C863C48E3C60A14ACDA75F187BF831B6AE585FF171A07A25CBA747ECDB081F" + "7AF19DB8AEBB8A969415EF60B6A7C4BBABF7BEE8A676670BFC", + "11596579F4DBFC04B67CA662283F4AE1AB7D5797B733DFA50949E74AAC28C9C45C051C9B4B18" + "4A50F2909EBAA7CCE5E68A85C4A50617D62610BB472D50AE38BF29854B2B3FD099809D90F445" + "E6AC7A2FA14927DB59D79B90D9EBD3077628483CBDB10648216EBE8531E85F07C4E69E7A75A5" + "E4C318C396A6C9BD188105568E41E59140C7DEF53B8B2465191B9B14C214F324D6069894455A" + "ACD2F19EC6B378CBC087CFFE886EF5BAE91C3EAFF5528A523D8AA4AB26A70C728EDE595C3688" + "610620771C6EEB8398BDE83F82AE5E1E39821B689EABF846C290193D96C52407ABA20B6A99CA" + "2F4131B6A9F73FEB4088EC7269A409D561AABB9A666A3A4DE2A1FC2B218445D61414855C3392" + "3768BC16679E258DCCA460D2387F2D556A8C2C9B4AB9AA9645C5BF06DCE050E4A5BD8A66DFB3" + "BACF9AEE6FDB328DED29385039DB07ED1D134AACEA96C9A18AB555A7F0E25831299D8D23CF33" + "41E8B7624E61D50941435D110C26A1FC2A3D92E2B332CEEAAC355C812CB271B88816BFE77CAB" + "6C6417A29CCAB6822EAF01251B4DE4C04A1B10FEABC8B6C20CE3C3D3AA0FE0BDE8CE0EBBB1C7" + "702304308B61D4D3DB8A71872B26A92A8DE2528A557FABE1C4BAED5BB08BFF9F081E98F66B1B" + "CC7A59AAD51148CB03592679421946CEC4C531268EE57BDF18144D3C138B550408C5EC9B2B4E" + "18C6193D2D72F3CB391F07D0BC650BEBB42093046DE9E090A377065EBCD84ECF5CD6DF24942F" + "A2F1AB3D11784DC80CC85FE6A6950CA7E8E3A855A716E843235F4305291D0A8B3D399F2AEBC8" + "4A785290C696C9C501D11C98A1AA973C94852FDE676F4F55F6AC3A97E0A23329F36901FED97C" + "F534D44391F12430FD442CF7E08E5925E60EA3F146380E0AAEBE418E3A2D04703786755C4B87" + "F4370C428105EA77B3E9DDF71D7AA2B2E53FB1DCFB307BECDD5F298894CF2613E98228FD4FCF" + "2FA91CD00CD101A29BF2CCDDB7D3150846E9674A66FE0217C54BAA209427D4387F4FFF28DFE3" + "1970A19BA6FDCC73A033FC825DDC74FFF187ACBC6D3B124DFE96A726459BB743EA42BD32191E" + "C774697F154975B97BA05A1E511153FEEE8EF7645EF4774AB55B32FD5A2C9AA99FC0B3E4C923" + "F1DA212C8435D8641F46340178B034208A867320BA341AFBF8B541E8ACE48C74763AAA9EBB58" + "DC6E2B3413E79BD2E4CC416F78D62E6977EDEA08A156D9648D745D5C8B9F747C87614F26A80A" + "B89A19169DB0E2A2BEE67825A627B836DC2981B23D2837C693D7730646DB712BAD4F835B8C25" + "2C0188BCEB50BB8C27826CED8F7960CB672FE6FDD2898E987E971A1BAA538CE4488241122731" + "CA55D858E97E1971914BBF67F4E6D3069EF1B73641E431DD0AD73D118034A431DAC1F2B5D48E" + "DB6260CEEBC963EC14BC4D81943B6C1DE465A41E677D45470DB96898591D501564F286E13E2E" + "F9D13ABA2EB1269B6A851057B7EE96746B1EF68233274BD9E7C82CD4763B1ADD79555C6E2E31" + "27351782AD1FDF582C5D04CE6151042C0D1E802C62F8261BAC2134845B8FC49327CD03F99559" + "345ABF4CDAAD52EE2F7A26EF71777FCA888A785A05DE9DAE92A8FE962EE378984CBD4257C2ED" + "D9A264E5697FB248DCB63D35E18FFF2E3BBA413FCC05CE33BF65D9850E98C7FB14FFF2FE1C2B" + "E4290455D2A3E8407F6652E6976210A8CBEDBB334FD945808B300B3895F4F3F2BF144197C864" + "F3291194FABB37DE0CDF3B8DFCA74D455EB8EFBB97CDEE57A0814230EC2FE1D23AAE61EC0E20" + "B45C71827D7550701C628FC57067A49A7107EF3422BF0C248C", + "E3671D96D798BF64F92221F53B0AEF6A0C4664C87A6D1ACD12493FD2DEA95AC3E47518AD2B70" + "27E98185F1C8C9F592F2B4A62A0EDE3CE02A1C3C4D586015FDC5F0376D75806EDA19003C1C6A" + "57978FCFFF3251E7A68EA2DF5EA09B37C859EF11858EFEBE48E650BE572B6B2F7B3B324C1DE2" + "EC1143D2F36F9F81B8C9CE6BE26A3DBBC57191990722B43923B7AA624A77C44BF018EB70EBD8" + "3BD30E90E3CA820F596D8258A8F5BB94CF7A0A11E53FE154B95D3D5C3431C13F8A264853883E" + "BF9084C7CB43F92004395BD7CA6ED53FB009DA964BEE54D07BA1B95AC09E1E8A53327E22A7A7" + "5318F053EECAD3C571F60071EC31DA6230413FF130C80AAA483F22426664EB6942A2678216F7" + "48BC26858C4639506BA58BC867499E6D847D99BD27CB5618136B640C3569F25ECCFF10DB3CC9" + "7309E8D2EB054E3118D0B21E8977B420F322A14B6B933321227E092AA8098647FE4106232DC6" + "1BC70037C751E5A9BBE5078C6572F2A23F266528BC3C81AD4EC2EF05953BE934ADC806FE55BB" + "29F5ED4E10024FE169F19084FEBE08E5093228FE41C6161D5E5D4E9543FE53C4282F7994EED7" + "8A8D20DB4D7820A9E384B865EE0DEB876B8C07E911F729232AF6E24E16A2704CC4C751EEDE2B" + "23EB39C98EC0FCFB67A5E1441BA3DC19266E6F7A6B6A753E8533893EBFB8D0C47BCD09F66C82" + "BD7DA2B8B2F3C5267FF9F8F4F52B1C1E004C2DBB00D75B7607D1DFD4030D591E1C2A039E3DB8" + "2A3296A7A4D7C989C7D0C0CBF2076A5A8C5713E1AD4ABDA5FE492459AC5B2F099331182B7BA8" + "6E57C2224F937E8CF5B4DC7363E970E40514726E0712680FE1960146F89188226A980DB7684D" + "91357B325AFFC061AA3A94CB53E37FE76ABCA1462DABE86C2008B0C18A48933280333BC040B0" + "34CBAE8F8450F07A813EFA9BB8F0DD5803D4E7939EF849DB8DDDF23618A2E4DCFA9DC94D2D6F" + "FA473F2F1AF5B267433C15B441A67D35EB0FC3A399E3E99885D33DB53CB4BDD849A5F9229095" + "3768B696A4CBA4C74FA30FE2D6924D463FB22E57AF59D964D6BF738BB6EE816C56E208904841" + "970BBECEF10EBE12536D7C13CC1724A633535F1F4288A6B64218E262222F23B98D500480D194" + "82F0188A1B158C356F874B3214EF7D6527DA48624E4D746A7513848DFCFA28AD70C5017CB866" + "F1CF599FDBE05B837E50CB95932ED018D7573F98E42EE4BC5D1EBE0F3E93E44BEBC899A72C66" + "F94DEC06AB30233CEADF7748B47ED6231156DEE9FD2C33C46D612EAF12838D25F5B7FF9F1EDC" + "52A2A7C21F847B7A8D3C6A9BEDC84B0AE04E310908C720750D213B7D9563CB15EDE21F843E54" + "54A3B78F9FFEDAFA4B1C148F57486B623CC34BF977B6A88C46B7E2D12EEFB573CC40CD56037B" + "29F6634E59913D7D227C97CF07D78BA3D27742719FCEAEB180B74C9A9D30A7EC1DA07DBF99AF" + "38F661D3E80A30EB5145F3FB121C8AE562EB27246125BE4A6BEF7284CD2E1F6AC31A8D851180" + "F41298B01200AB19DC4F444464718426D651142F8FACACC6524E833C83EB6CA487D708F737DD" + "0E982120910476A3681776DD1CEFD6B269B9AF5EA744DFC62B2496B47F0C5F2E325D325696D1" + "6ECA909449FA5921BBD2D3CADBCCBA11997C799C5C3F0D7ACBE65822DA83CC2E64DAF58F4FCE" + "25FF6B4B293B95F3B2745186C4FBBB1DB921F79C9E72BC01ABB0F1DD95F7C815E0F0A21F175D" + "32C0D0203DCCC014CC91251830D10043617D5B462853D56E7FEC7CAD3295C558603FF5A4CDEA" + "C89B216EDB019564411891F62806987F01648E0764E28A0270", + "3B82259F1D9D6077388E290241B6DD139AC456E9A9B752A989E232A9A89981AF870004E5A4E0" + "A4D2A270367E8EA2F529063AA727DA657BE98EB3B2CE005FB898EE0B6C7AFE0DF6DD142C88AC" + "8BC25C893A7CFD0C5A7F7D3831F685BFC268CD463E9BA0DC1AE5EBF557684768536FB11D25E1" + "3C5815F194A58FA9AD7782FFA6F3A919BB0B2B1E865AC0AA6F27F51D0F17F410887FF0EEB042" + "E129DDFEC2906744A00767787AC4A2CB53B18FFFBD686C1335E59AF463CE4DD18F1B298AD5B3" + "43904EFC61E862D2A22AE44CDAD0202E97A0E5DD6EA893D79D0CEA0616B3F1048C03BC5A8EC1" + "23A4DF9FD9E641A1F7060DB914561B37A5E3DF978E1AB9A2D0A4E519070E676F20F0ABDC302E" + "955CA35A5EBE506367925A14E54A590B3D8AB3B442A0B0359D5D88934CFB6BAA0B3E004383D2" + "DE62FA5E0634ED765538047F5D3295FCDE8E2F67F529975FC403954DD6E58C0F4BE8CF697838" + "400F9A0ABADBE6592237573581A0A845B9AA379A134A54E50B493CD8C14FAF4B58A7552E8187" + "7AA1E09EDCCE1C1314E4A168B3AB0E3D3F78F4BD9B0D4513B60C1DF0B04CF37F3F64B8906E2B" + "47B8062411F9AD0C0AE6173D7922AED774E0BD2E80816B6644EA88A968C2F0C7EE413859B56A" + "329B1E31764E78C5EB34F59906C2D7BFFE31B95A68A46BC3DCDC00A45CC1286FF77290E841AE" + "E1FFC22105FD1E1715FC9ECAA06B4C2F1A9A1BB312B9ECBFE83DD6B2BE34A531F5034790F497" + "11BED942DC42DD55FAF4EB0760BB2F8C5662C87FB42DF18397DFCB4617E7CB9227487A26A226" + "85176DF60FEBC6DA0EE323BF400E69B9AE32FBD4CB7C9CAF8C1295E8AE2FCD81C8A964A0E4B4" + "E4001C3EB03322B2A988F232A95DB2B2ED446B39176DB048128E239DC0D7371F34883B8F2C34" + "BE7AF11A8CC15200DDDAE48DCE724ED98F3F018F740F7B460DB4DBCA1B404DA588BE7D04AD96" + "1905CCC9C2E03C7F96D16B7F2D9A1B0CF1BF2BA24932FF5AAAC1EFBACA9370DD2F9F52C70B5A" + "1000C90F0F1D12BD9AA01A83FAD19DC521DFC184E37DA11ECF34135065F38F498A8CF3966461" + "E2981465A6CE1741904C11A04473B6C8B66A70734DE602A495EDF790563955B20536BBE2AFFC" + "BC05EFB847F63D570B9BF35A7A2EC2734D23C60CA2564FB4DC1CB23C0F0A0B9685B157B0B359" + "952A7E69D0386C269C6ABE18C047A5618ABCA60ED14ADD113821B4B76EDFC530FE497A1A68B6" + "1A376263519C088C7A2FA8C202022E81A41CB7AED5607CF7F87AE6BE949006949ED3AAE6D5B7" + "A80CEB651CE7DCF3EB0E6A3DDD96B771B3AD865B81F6AF406A36313FE2ADA89610A5A7BF6B78" + "DF87B00B3193CABAA24570B8743A8915754F2633403787EC7B5BF7969421A456D51FF231B158" + "0BD5BE076986D7363BB5A6EEF159C35F3CEF9CE29B5CC057B6AD9D572DE4A58024A5F59D787F" + "BCF81AADD7B4E09605D101010C57D178C440E62B191BB161B459617A49FC328FEDDBB4B61072" + "22ED4A2DC194F5461A97880C61F558E590D8702E59F952A66B3437AA3685A74143C0F134E0EC" + "B7C9A914C18F12CB390DD1796B3F6743AAF1BF8877DE80F4FFD51F75B28136AA71A827BEDEA4" + "95019ECB383959B44DB738881620C8260BA1CD9698A0651E1899A73CC5464BC73E982B20B3CD" + "E216FB1C860FEE128EE62D7F05601566F522E3C3C24C00216B438D2BE7D2EC3B254D77DE0D55" + "6BFD32491753F63CC36166D3FB5A2DA7F8F01D0E4CCE8261A6D482F9F44696C80B614F6CB6C1" + "8B7BC0BBC603F3C66DC939CEC49D6EEC012A0CC5623D79F4B0", + "68B4B3D4EC9BE531E7F5F52D026DD979555B60279DB24DF86C96D1F62E62ECC5B8B2A6F9A84A" + "775138502D6B249E90BFF2E104145F8A7496C730EA638BBF0C5827046420FFB562EB3252FD15" + "467B3B4559E57BC031FD92B2729E52E43477E98E51EF8273D48FD312FB2BA2F6541D030FDF2E" + "FCCDAD438E3A809A703C45CAB159F771913DE8B8F6BD57831439E0567F066A7BD7EB0BEF0678" + "E419BD51C9D7E9B2B48FD0A20335960720A163A5981D6F4F13F770DBD10355909806274D23B4" + "F492075F960425CE65D32781309C119876E2CEF90B27B09FF1C1B63A10B0A84613CCC34E5869" + "FF873E4AA4B169D222DABE7EC0C15ED674283C99E3F9291D74F2DF7F06DB290B3798C782E706" + "7EBA6AF748809A7459FB0C1B24561F69AC863F9B81A78348013A9403DB6B660F624EF762EE71" + "CFACF12BD69371C0EEDD33D890039BFECE7CF28A05A58B2AC35C1CFF111DE9334C58BF377DD8" + "F0ADBDB85939514ABDAD4E3FFF0E11A59D87828C1CA5B279A463E56914966FBDA6BB2A03A15C" + "476DB88EA1701537596F7D9A4A25A9F1896793694E0C50786E69621C3FFF1CAD6F54A2A72687" + "6F6D43C6EFBB3F468CB325EE223FCE0EB0D53469681453CF9CDFF6700246F32EDDC0E3B25AF5" + "23CD7CE39DD1BBDC91BC19B5B6F00A572004B07960767F184D65BE1A89360C37E68B964044BB" + "D5975F9839D078C67B342536D83FBED3CBAE2527F1E64F050B9ADEA0C0DF9F56D112E5A34954" + "9F387FE5869CB0CCF218854342171B60E3FE43793427DCD1DB86620E43207932E99CE9081A7E" + "B8124BCB712CB91806426AB022F6C3BBF23CBDAE066971A141381A6B301142FC4B5365FAE4E2" + "AF6609C7983DF435FAF795983F9A81E70A307AAF5BC745EF2263BBE6A354E88F039640571C70" + "AD6CCFDD3EFC302E0A9BD17537D232FC4AF3907DE29C65FB8B09D29E5393526FE300F7A9E6A8" + "B73798AA2FD29335D1AB7FC1098839068C3F747195C338DA4B947E8A0821D3FF425E4935AD02" + "8722BB948567D9534768CDD19D1BE2DA4D87EC936E7901B6AAA7A6ED902D2BEBF9E329F64DCA" + "F34B459C9AA3B68E0CB4186D11060A6A59C392C4AEF7B891315CF06DFA87ED0236AE868DB9BA" + "FB1E36DAF4BAD5906F24BBA0BB6155120C832F019B29796E206EDAD287230B1EB3F8DF905A61" + "88BB021B893D6C7E53B1EBFBDFDFF8DCC8F077D0D4B19C96FE23C0E9539266CA68652275FEC4" + "E514622C019CF5D58E2E55298BF57A235B55F8F75D87A194CB74404699CED81D6FB9952ADF80" + "AD72EA2DB15F88E3181EB6C6A0618D633966C0A9C86DC4A8F88C4ABE04861E0D1CC0D190688A" + "9259148640979057CA42005A2DA5645B8539054843F5E33DB302B3643AA2B12E277B2B46C6B6" + "B853DFBDBE975404E8CE3CE0830D33B38A924C0134DD44450CA4F28AF06362FA0E174382FA36" + "307A8A7929851115D96401924A8E6E65860839E398B901574BEDEFDE50EB6B1B16A6F723A46A" + "2AE1366A066DE63D7E109504E50ED1352DA2D002129F504F48130944D24A88B04C5819C583C3" + "0903EA9188F8A91DB09CA81B34E6358C302B1B6BC0C6388FD46DA2BA75A80FDAA56CEFB5C0DB" + "9CCB101176994C2F0DD778FD56D622F57E8CA553A38D5D79CC01A23145391BFD722530B29B32" + "4E54B81E23FB49CC69585F707899D8FFDFDEFEBC6E53F1B5E48EC206E88C32D04FD8FE6BC686" + "270A5ADBB023B4F4A6CC07A60982455436E82EE927B04D5AE97ADB63C6FAECED8B0BAB6205BF" + "0AFDB079D46448EF7BA91A4E1CD2B2830445B0C169838B6E28", + "56340D923120AB912EDF8B108FA30F3BD7F41A88635E24B95728247CFB575D46EAA41E2C225D" + "13930ED40C5A5724591116BD76770A3F57410F501D6B00B7ECBF7BD5DA9B094DA0C8C2C221BE" + "43A19015195BD1D19F6A906ED2DEF8E97F5AD5617CE36B7EFD54B01D1FB04C8F36EF79578E24" + "CD6B5091680679E6BC43D77E5D8425E20751D6966E4BCA22C8BE539391346AB3EC9088444374" + "2F820976CA4896C26C0555DEBD89BA0D0478A988A0EB633BC34568BAC22B80FC915DDB9A1D3B" + "D6F2F3111070944224C953754153335FF74A4C0031662A694FC3389D8C0D6311DCA57178D931" + "0EFE99984F4ED81913B8D9EDFA017557E4E612AE0F9113E0EA90CE4FD55D00BF6F363B913036" + "E5E43332FEE119363D1D4A77118D6063723987E52CA8CD180064A5DFF59995055D9526488452" + "1C11119E9ED7B970B3B775127E03A8869A2D4587B98DAE0A232A3C4160BB237AF755406C86D2" + "24A6DD2083E85D844422126F9AAC59139394FA2688A7A4ECD2D715C08F484374FDD7847ACF3C" + "C02D1215AD6648E3D53DEED9E2641BF1701A557EFDAD8E7D0D56B5FD2E3EF696EC12ADF31717" + "B53150130B84FB088686260B6521B2B757BDFA6FDA01AD7015E105D5F8A1DCDD7AD1113449D4" + "B46056E19391748868F04AAEC575D5BE7C4829D53A48F58C22B05FD7B9E18BE211A3F6E913AA" + "0918936058D41EBF41031F50BF99C33976F83859793F4C2AD73FB402F188C2841EAC637D7B25" + "31A4B41E7CB19072B50E76BA3C284314197AF51154C08495387A24C0895BAB6210F885B90673" + "02B26E9CDAE72CF30F9259B4D189A4239385FFE95379964D9FB7ADB7A4E4BC858FBF5E6347A8" + "EA2928E2CA05659AC7CB1069AB60A9F176A950D1B95DFDFC29BD97DB17D604D98FDD216282E2" + "53CBBBC7DA3F4582C5D214C2DAED9CB40EE69312ED3DAA7044B599C45B97E961470C3D46591E" + "95503DFAA602036E3FEFC08CBB987D822BAF5858C875DD83D44BF628B6432EBEB7C883146ACE" + "582717A5FAB915F3CB2BFFAF30EA9DD41046BA82BB5E9BDAC107F464BB17C960C908F5581EA3" + "CC8AEB1C5325A31A176958D1C14F250766B8604D72EEAD31D9217329874361A8841EB5D78D26" + "22FF49900FA6AF7CB63837A0B03ACF46F7EF59D9DA6E24CBC18ED91135B34FA6FF69A400033B" + "18BB950B7E5873DC778D855A69E81E3744D6582360FCC7B7ED18796413EEEAA2BF43536FEB94" + "3559F9F6A2FA3C53AB7E0ADE56C65272D39298DA9ED41FB5728F17D15BE7E6AB0A75FDB2B0BF" + "5155DDF209A7862DFB78CFC1B1069AC8BB1E05E596A86C7B8EF3869FB42A77463730000965BF" + "D97CB36B2226DC60F4C91D96E6E6BDFBD8BCD703417B071B4FBD597C0264BFD1192C7AEB5E08" + "4561B0B86533A126E32D5DD3AC818759B8293CA0E2C6A5BA163169328E35D44CF15E06ABC424" + "C1A4FA37498BF820D6F65EB7505758820AEE55C33D7FF534F3EA2757E97A39069CD58A3044FB" + "5F5D309B451BF48AF06EEB84C686BD75106F86774C40FDFF1DB0101957EF02AA5E2698AF0C38" + "A1A5FA7688E66B4883956F2DD23259DC0B4E6DD6D0CA12E8D068BF16F8F774F291D051A12EFC" + "66C81AFA36FA6F650FEFEEA762C2A55BA3E541B5658234F8D669A814D1C52515C578B19EBF7C" + "684F49C97B6D7B7E6C9A67B2A5FFE87271096462CB66927C33CD39D6CE5D93503398276847C2" + "11B576A440C917872A4840CAA22BD7A60A30850F175B9C2B5382634F9E0B49632937AFB18D5E" + "0850C463D00B7F3AD50CBF27A68707DBA730E67F42BE3020BC", + "6793F0E16478CBCDB636FAD15E26C5D33AF158D8F4C13536822C0D991D36F63A27625233FC04" + "E4D72366F2F7445A802B7901CCE07070EE129E252DF234E320B3BFB5F65E73F8330F2B40E20C" + "17EE830585D36B72B91BB08C426E7776BB83C4534B66F0A5378274E323323E857441006CACD6" + "AF098A2B611EC196F945CC599D6D55FC3BE4CAC336B8B41B74528DDCA350D9B1B798931BEC8C" + "6255A4C035342A55677F386D32A5F175C326B7AE835C804DA5CF0D5906595AE13EC8F4C067C5" + "2A9B893F4C3D2C6C194EFB353E7B8AA7460010AE6EB991AF1EFD8427BD8068FE251295EB58E0" + "D2142FE485AC5B473DC86F2C9B1EFA03A8FB4E1B7B3D6775106AD6BF2C8598CAF5CE858BD6F3" + "43AE9BB2D4695979CC9EE028425B420396D8AAAC86B1733E9230AC3E8B1DF081916E4517A90E" + "C0A70A0809DC81FFE745C7271D173FFC09DC808287281B84AF4513B44C087DC68BE1A8624BE6" + "746B09AAA8DB4E0216D210A03BC99CF4D4B15A6ECBAE167B5E8D0B9D7A98CD09A7EB5AB04577" + "35E6F6C396F8AE02FBC6C9A7B09DE716D1AD093FA1425838D6BD4A4523F8B00DEF210DFBC7AC" + "4CEBB3A84003172A8EF3E566FB9CC1B1A5E197E48ECAA51F3019789BE43AD4D304D5879D2D90" + "09D60BAF6B261D747D2A65B0E7F73552A16560192D523189BEC648CF6C6CD85629DD8A5176C1" + "68EB661A993EE1FD55B5CCD19D14FB4C1BC436A28C87AB59A9B00411750BE2662639720F6528" + "7B3696511E0EEB7773B211886EC4EA76B65D0D060BBF41823816A78660FE73D37D6FEE682639" + "627DA523CA43B87070399C04F6A00AD1177A7B3627593901FE62523722E37B65C4CD81A20B65" + "641978D8D47AE65D1B23D45AFB636D9E98F134387E4F373925A04E1A7C4F241D98B084985FC2" + "509EB628BAD376AE79FE6E9B9EC313FCA56AEDBE09D04EA22B51A9D38CFCF35D13F23085430E" + "A22297CE87B2E56C291B51999B21D2FC113B12F709C229C774D8858B9BF9F36ADF96534C99F0" + "43E87B3EB5B5971B4F9A2266B3C54C21662F30ABE38B5FF32AA459CC8F88871DA433B67D34A3" + "00FF4EA7FF96AD90EB985A9FC698E03FFEF4C800DDB108F262818CFD70FCBF85EC269F2BAE14" + "29B83BDFD4996D614E2A0D76B6E58E17B8293157DE0257B1EDD4A3DF333B6CE6C7AB1D7FC23A" + "5FD2B22C4311A7DFDB79CC244A0B3068D2EA5BC37EA44E523DC9D42A1331CAEA8F169E238E8C" + "B1086C55AE37D418C4333A2CF15A728400191482026DD35188BAF2FE90E57799F301704182AE" + "6E07802797BE16ECD4133EE83AFEFAFBC789BE073FAB1C42A1900F83F16180274A33E93FA24D" + "F900D711C1008388EB009FB245FC97CC52E401868FC1F009854238D5FCE07D91E3DF5F7F5C17" + "7CC82B37687DE9E401E0767541820E80CF99EEA7097F4F5D118ACBB64041289800214E5A8F34" + "5CCC23182BEC75AA36108D3171C47968F157538CC8542B93BC4A72257EC3DA574B160CD05224" + "339EDBFBE588C2344D4BFA5C43FEB8D5E36736DCCCFBC52BB78DEA407BEA8C941DE871A76D6E" + "B0547286B6992BFBDC1D942875D4F96437A1FD3F0EBF3181464F108DBB00132F7FFC071963F9" + "5A19D709B569FFE572FF00C52CBE6DCC25B8E111F1339A2554CFFAD1C7D50CF4668432A3CD66" + "4459F2D8E9ADAD7CDE17C20F9932CA69FB56CF9FD9D1A11B2EE3944390EF48DC883F4B84D999" + "8AD89436A74DE173E9444570C2A10C4FC8BACF3F31CB958AD445720B907DB756A53FC8C379D9" + "767F9E756ECB5D146D790A43FA19210D19B824F23E587205A4", + "5708B72D5C04F873B0F3B7B16265A26726F094734ABF0DA0464F48F14066F8DAD858304E622A" + "1A19E5EA5266E24D6D60D54C1BDC3584DE885017AC230CA073345E2FF6BABFE0D78A6492811D" + "7612D25DFEEEBBCCAD14011657874D85894453350281513426E349648532CC74AE580B83DDAF" + "6625D7344436226A6796903F4A2A675C2C1E63C32DC800EB596AFA11F131EF0ED44163AA7F88" + "C06AD0BAA76D7D068E57905A2020C17F901D9517EEB40CEB88C06979010FFA4F1CBDAB77EAB5" + "1F5BA80875252B3C43F29C4EA6CBA2D36BFA7DEED3F04579F6F27810686B96B6C2B74B723889" + "AF134696CF8E1EB3556D3FB57246FF2E19D8FBDB25E39248EE6317BD167847BF29A210015025" + "626CD105439435A0B89E81A64A80230C1C4342297203F5A7DD65324B75FCA97C5FF6C2829B7C" + "59A7E5C98A55A7F886FC5307882D67504B428FE4F854672907E0EBE4A7BF078F6F98EFBBE4B2" + "9B19525545274881E2E7191A858B35F49D0568B52E04E380620CB3DDEFA480B00340497DEEF3" + "4C118071C81D2B45A82E4BEB3468562639D1E044B928AA92A6365349F77DC67DBC783F7949F5" + "C1F825398A87C9FC50B482B9AD0478328FD847F96A9464E9F9668FB65050DBFE8FA54FEBB493" + "29AEF96BF013A510B08E0C31005499605E47416B0A70A822CD91A902A00211653F78879A2F7A" + "319DC49271E936F7C6E61D3FD893AB7F2DAAB35E1C7CDA58B23D644713B4BB50DB5A75858207" + "93DBE7A883F2DDEF97F5B2D174D95C8E53F08F35292B840576BE2B55FBB56F4E3C97FC2027A5" + "80C475CC0B5DFA2A6E027FA0C10116827A9C582FADB95742D580C47F9571A08ADC3DE323E217" + "D5A6B5C004ED30F19E0D0EB99514BF025A7995911B088B3AE919BD6EF074069D4B8CD32849A4" + "B1D90B22A0502B3288A4686CB87A9A200A2D4CF75DDFEE92D21BAE205249947AC1FF575BFD1E" + "8B33814C310D7A02845EC86B0EF60CAAC1ADAC91D99295E9E61615119C832686D6C7D980A3C4" + "BC98816C3F54B38A43D939916991A37B73C37387C80EAD3B443AA9B315C3D87263B5AA765D2A" + "647E2971A5186D41C4B20756F8066E72A7ECB9A93E3D9C1125D5A3B82A9AC40A447DC11B07A7" + "30C731FE3C5385E7CF7EC30AE5EDAC67977A7745DAA712F8562072023C7126E5F8939F2BB842" + "AD0F1F1F8481C4652F94843F0E68CDC9E36A63629EA6368513A326261E43F7B9936593148B6E" + "6996CECA0E3F17F52110C2951A5D4E12B6E5AB2571760DD68D5F7D755A545AD4045229CAD12C" + "63465BFF76488FB89BC81187CDBD6F0AADB5360097EAAEFF2AE9817E59AFEFFFB7CEEE7051EE" + "AC0F3B70BA9AB1C7BBC86F4D34A9BC2E23DEA3832B30707D65EE10FAFA3633FD97803E4BF8CA" + "7F24FBD28309A31ACCF7FFA698889670B2FB1A779241B6D9D9CD259CDCDB6C124F72C6FA6873" + "4888CB2FFF799AC62C860A5EF927F298FE93E00F4DFE6362FAF843BD35F07066A60E2BDE23A1" + "ECA96597B09EEF1C6ACAE876E781ABBC5073BB9F6FFFBFACD3F40CBAA7FBAABF4803656DAA87" + "B5ED9F0C409EC8EF889377FED31631A45A9CA251015AD152D575F7D58B5D83747526AD3B6A43" + "95D2C54A1844257F47E3829B9B4CB3B689464D364CEF7E13C323262E450B632BCA3632B63C9D" + "98B387E1094FA5311C090FC7C785AA10EEA7CE48FD3B2471E202702350FA472ADD1772F74F31" + "ADBD3A861BF79F3D0E51E3FC6718672F06C41DF112811ACAA0EE2D5D2441CDE3E4ACE9BF2A73" + "B300FB5702691C15B0C52C74A3F132A5D372AD6E3270DE1D44", + "D78A2C70D3BBABCD1378A054FA14D0301355E6CEF5F170C7CCBE13B2AAB4EA370743DA27FD35" + "5FE80C333AA23D10425758778A43DA7A0F027D61EE7247C9C2EBE7BFF5598054D85B7F9CF9C3" + "F06B3729F9FB53F9F484B7FC64410F4EA31A5A9E6FBB38E704C91ED0435C6FD168191D00E4D6" + "4B169B1596D4F3B96837C9888A82FE1B78018AE1166ABCDC99D90C673D22FEAED8F83E499467" + "E32CF1309DD2893A56612D9DB3801F75B5F729D3DEC22E8F4558C624D081674CC2549B7E9112" + "C7BFD9F1372FE95231A4F0D2403DD523D2BE94293E466395405B7D1D9B73AA44B2667AE05E60" + "F8009AD647DCA7C57B8DAE4D0411484325E3EE00A4E5CEDC3E152A342D6927AFFE44AF9C2C47" + "6AACF662F737D88BEA4FB353C02813451A4DAB45AC2824C9940CE860D62E6D4CA0E7B3646D2D" + "0122AE1331429C91CE13CF21CE24E50A3321D51202D2D89B379C14CAD9D1AC185CC0A64C9050" + "D68B56C9628B20500F2B37C95F446FB3BD19BCD55B88D0E7D489FFD7925AD0B152A1F0EDCE9C" + "9401DF1E93084A2082C9D6C77A8F94EF89AD64007C19E81D79993489573B66E2FB680AA71989" + "F250A5F52F12AEF0092C3C96312A5FD3B23E6FF78D2225FB64A90CCB9A042C918C6A8BC5D10D" + "6F2E53BEB6BBE00736E6D219A972452EE4323CD31F98A649F07C6DD5FD12F398C26E64ECF559" + "A21D46007B61FD0544464FB05A773CADA6A365A349AC9C02E2605A2FD8EB082DE24C839C7377" + "D9E5696315CBC20898FFB484BE7F2B7E7E53B3583F0E7CE7FB686CA8066ABFF79F5D0E4F8939" + "DE1AF903C1796F0947B86BA90822F1157330C05FEAB2FF916F0B83B15CB5553721F4CF8C3A3E" + "BDCD9EAB20302CA17CA8147B22CF57772C38D147AFA4AB3B1A83B1218BFB184E18673BD177C0" + "08FFB1CF982A831F7BD20D3B53DE456BE3CFCBBF8B4967DC80D14E7893DEECC75FF10FE5948C" + "7705E424D165A82C9098950CA688ABE42E43076CA846E3FC7A5476423E779589ECE0F6BDAD79" + "024F03F655F9A75CD13FA3E5018F987A3F5AD021EA70B48DDDD7994918E8AEC20A9FC9F0377D" + "1A1E914F954A7BB90C376E0D43E57C1F5F2888C89D5736A60DAE981696843AE2216A189B6023" + "7C0CE9263E3DE47E8AE48129D5AF95E09EA8978F728EBE5AC11CC499B8C01B85C323647AEC21" + "D4345EDB1C82704939644088C6B0E214A1C06293B02139B73DA87C98D404867AD30551EEF94A" + "C79DCAACDF2DFD8F8ABA853CC8B618CAA883494C518116629FC7D9FC36107A685CDFDFAFD706" + "928F49DA0559F3786E06F6E4D14193F593C54575E61390F71750551E5E2769C7936F4BF1D8F6" + "D295A44F5D7912D4A5B78DC7E97B64F1CB723D3C5505747784E433D75151E4D7E4C14593B7B0" + "3B0F67CD502DC978A4B075FAFDFD9D0B2F04361FCDF1FCA33440C51949608AA98C36899E50AE" + "A8F8DFDA7D9AA9DCF1A94FBBC55065AF3090158C9F0ADE76CE4206E4A301C2942386B1888113" + "4E4907209C6DBD1615C21BAF136261D0EC018ECC919C41AD3EB8A778F48ABC83D4FAD5CA4093" + "A8BF13DE3E324B981F62036C8C2B4223AE10B4B40CBAD832B6755C89888A7D7C1F53E1583B76" + "184EEF2954F944BC2C5F7607C9FCA821BA8B8C494CF5DDD896872BC205AD7E2F0CF8C053E2FE" + "459D72CFD537E079204F5ADEB7839BC8D4F73E2137152F1FE3B10A9B70613A13EA88B298548C" + "849A0AD3459213D0771894D3F847FD719BBDE48F3945809DF34968FEE9F9E3EB513DE56E5825" + "EF7C60AA0CF9C6FF8801F745EE730C390C6FE8C246E0AC6E68", + "5380F8D742304B1F4520FBF4B900AD920E92CA2768A240C5FD1DC5B69619A48A201F8BDF0D60" + "CA2F3FB373EBCA14ED1277ACCCED535C6116BD9FFB90BE7FF0B517936547F7B64188B76DCBC0" + "10450C3DF54F4ABE766B344519E30AFEF1B820A719EBA82AFCB10513067F3DC83DB17C22D2A1" + "1A7C00A76BB4B28B0D3A02DD14E40FB7AB872CC59F1C1FCE96D8DCCB4CDA4EADC43D190C7E55" + "DDCE04837EF79BB7BD8C5CCD4B216D39C9BF5E7E5CAC6674BBE77B1F2161C1C4580625CBCBAF" + "078F757BCF0EB0430CDE4C2F134F9BB6BD9F501FA29E0D7EB4009A3839DF3A8D158731250763" + "00565D35E4B7A18FC951D76990AB05B4EC245CE57C583F021C29380661B7B80B61E27AFCDDB4" + "53FCC04BE367ECA94293385650C996DC8DE48BE152ED5B194896397B8EFD5727BF3CC54058AD" + "C933A286D2A82123120A2E3326FDABA94207A5C26E8687F97B45B876009ECB5C1945F88A0FFB" + "A8FC6452F119E51E910EB5C225E29E623D2898FC577FC1447E8A60EB4DE401B8768B7A7F8585" + "D90E97810A5756FD9331D141231210552D8517324ED4680A8CF3F793AAFDC77A71A44A636ADD" + "2A1F449EC4EDA64C29A873250A54DF9B1F480CFF28B6ECFD791E1B4077B619807250E103F068" + "FA9CE890DCB68354265BAE2A4FC617B49EB2E9A8031B82923386A2C573EE70716400B5FAC1E5" + "17E02BE6F5B767CB23D0C9ECC30835C3CF7ABBC783D74F4E9180688E0E1A13E37B9F74B998D4" + "E9F9EBF64E72DA134ACCE8C6F7B767BDFB0481CEEEA9F8C262F08ED5C96CCB4CEC6DA5CFE0E3" + "E68CD38757B7C09CA2ED0172C34534B75B9400F962152D10FA36F04EF3F983228234FD50575E" + "639410763DFD431E6288B359B9F54BCABEF0C288200F4EDBB44609B7BF8A9B27A2B43FF9F427" + "7FE6F5A218EB2ADCCCD7B922DCA14F5F3B37F3D14C1AC3EF47E011449661A5B68EE2FE8C0914" + "5B914D25C126D40274BF7C128BE348310BAC7C072B354D2ED19240C035327927346EBB8D56FE" + "BFBC9B54F7623952FA4EC889DDA28E2619734036B718A2D6A5AF917B60B0457EE5259F37572B" + "5CD651822999525EE21FAEBB09B17AC3D7DD0B735B5E0B7A9C5FFDCDCEE47874BE50E6550B9B" + "962174FF665C9BC372911293F0ABAD06F58EC2AAB12E5772745E1384365A3A12A65173E2B383" + "8D175286521A78260F70DC2D28750FB6A74D8ACD399C9E4422A2555199EE4587808D86713865" + "2899406736A08D1608B7267924529E935B0966287CEA94E8730EEADB27B8A37BAB6784964F41" + "25DC9C51153368153E34D99630539C2323C759DD199D1D0ADE2F9B4F700F90EC0007E3F97FE0" + "3162D7581D24B884A0AD9105B1D8592064B98EC7F691F110CFA11177F99E317673E2114F9F4F" + "64F0D049DDC9058793797CF94423E737463CCFF74442F98447C4B7F1B8CE93824D0DC6D044DA" + "82908E925C0D75A34603FF4FE3F0001B84F807796CFA3DA85C5CCC5DCD71E2621CE50634CD96" + "3E540B6654451C9DD241793490F36AEF628EF26DABB8670B94AB9F0A33486D64BCA5124F3276" + "88345882B673014C8A530E4730D880F0D13BCCC55522A2113C9CCE59A8D972B6F8570A5A1D87" + "78320F2C2530A57458E0E6A3E74532A42E2D3610E43D1727753A46AAA1B8D7B05AEA87E4A444" + "A761EC9D337F974234ECE85533853E970F13B9D9DFFD1CAF683D6D67685DF5E1AF46C86EBAFC" + "23BD254CCA20C5359D6A75767CD253BF5106836F44FAD2B5A28C76B601674C3238A2DDC889B9" + "2FA54E2377956C9EFEBFB558EEBB16724F2656018124C5BA58", + "EA0B2E5A9CA0E2ED8ECB229FD94951386081BE0D5219C4A11AE5C0E27F144111E7B86DA74B42" + "B2AC4D65FB0EC7F65D39197D792B0C07399129D35B1321931A5ED57F793A0E31488C48CCA352" + "1173F2630863A24C8B0352344C631D70500782E09EC3CB55E1081817F177363F73E7AA07AE59" + "19504D963F6C68EF28CE4DCB8574A778EEB098FB3BFFDC0E92196B9F58A0067DDA74AF23AC9B" + "865663D7AFC023B706C97F8A704A7A8795A2ABE2098B78E69317B6F486ADEA4BBB4EBA326002" + "E2D4CFE6380CA19184CDCA9E585C4542DCFEE4F23FD2D6541055EEEA1CE3490CE31B1E2A236D" + "778AD4CD8B9B36C4F2E6D6E5956747CD883B7980EC0E451DF6645D9B0E0F9CDF42F4C8169741" + "98E45FC6F1A8D08FEE03AC834016EF0E7606FE9C5F784F9AA96B3318FC3D020A662884C6F337" + "E257280EB9A06DC87F73356C0DD3A87D32334EF0D369B42EA1839230D9659DCA05F23E634417" + "B48D4A449A795F040AD7C16BADE12299D2E75CAC6DC0819F12C8B27B4FC2B85666DE7B666A1D" + "43F2DE4D1348F98103B6353AE74B994487B5D683EB5020FA9E592252B12DE822C67C4FA053B9" + "A69B0C49C185742D96CB0F72CC4CBE15CBB036ACCEFE13B6059D7014EA47ECCF632114665040" + "BC3F18CCD69559F21EFA397F606E70F76802C135C077F10B158F63FA271982E968132F42FB39" + "F070D9BA266FB8A27037019EDC11B3E2E6A9A76B674F236CD9D1B32B51EEB6C45478D8C73092" + "C7385777AA082A6B4BFC4F277F3B42A23A1A7953B3218985301C67F32B4740064C5D72DDD257" + "B5612F6DE8C9671ED19047D545A9E15E520E51FE9360EDC403F5EBC66A61D935C4F52E5BBE60" + "051AF9D69849703BFFDCDF190D771EE52EA1D3B27314F71636FC69B20A989A75E055E7CEFC6C" + "EE8FE8181087AAD3C3790741E00A0EB8C6322C4AC0D13245C610C64FCE884AC5331231128C70" + "5C9EFEAB7A58C984C8DACB94899CE030D49EBE989CBA6FE370DFA6B2354D42D2E5B61DE78882" + "28FE4703A7588523984AB07D81061C8A929BF944D371B74705395A74D0576A3A106D525F7AFC" + "1738815E4A0F49B9B710FBA481740C255F12BC969182AA81CC55B729A580B8402124724A6A61" + "03FFA8B875D5EBFFF8215E27C6C96D9FE8217DF540CB1987544706C5441F82F59800A16A33DA" + "96E9C656F5D7AA6AC5ECDFFBEE496AC145E4C9A58412C26835FCDBBBF640D6FEA142CB1CFA73" + "D177FB65D826F657306C373048CFA3E3FCAAFA0DED317038043C7CB1600C17B5F14F3BC1C1AF" + "F8AC238FA272BF15763036DB8729DC9DFAA63BE2E894A06F1F3F225D2C06DDC367CF923E9CAB" + "FE0457BB8DC9A6D861DA189F8E4668B499F8A57D85507978B7DB564516136346824236A6306E" + "3393CC4D94D9B679145FBEA3BA389C812FD69722E9471EE3917B9B36ED9B3BD138EF1C52E89D" + "2D7E9027238BB8AFBF4513CDB365364679398EC18CAD88482C58D90D144D5B7DA3D3C15437D4" + "A3F325A2CC4E3F230B70C36CB2763BBD440FFAA72F893E7CD8776C0697489F9F1EC0A522E8FB" + "8CABF727729C3B6D818DD51FA9C8BE3886A3FEB0707B9E51F5BD0600D1A7C7840381D196F60B" + "EAA7F8F8BE62419D86C19D4DEC8374DBFDD179CBE71A6850AFED604DFBBB67F582C8690434B2" + "64F4506AD24EFBFF66F46ACABD75ED4C72ED2B798AD0A00335E83F04546C1C455C331A6055F7" + "D082FF36D26C7C8F5083FFFAF575C3A2BFF810CACA49C4908043A034B29DB546702AA8312D27" + "A91F548605D024BBE11DB3B25E0A4F50239D07EBDF4956C148", + "0B2233FA2366E90DBB5971B7C8FD1DDD4222592BD06F467B874D747AB8877BD2F6D327D364F8" + "CE0F8A901A9D23B7C22924F4F00461B87C48CB94709ED53C551C190104CF7ABC2ED0943732C6" + "5CC391B1E0438AE355DED8EE4D82B755B20E797C1D8490EA26745295CB097D6269AAB62FEA8F" + "297338E44A6485F684A4C610565AD9BBC071B51F34F7CDBC0027D6A4203AD4D41722C597CF54" + "15A3178A476475958BE25D801D153BF3FB671E1C3205BE61C66FC7EB3DD14BF6D45453A5DF32" + "EB77792BDBC841FF6772DABF43E50C015A6287B54892AEBA4ED1A66CA186CD41A02DFAA2CE74" + "3952DB208F6A9DA876DDDEE6C211613793071ECA0D61E19979CDD2B80CEC1F1AB505D8F3FEB8" + "3F10567749FC01FEB18DE83C88066A3FABBB59DB1A8404FB4E8581EBAD988EAFBAAD5ECEC2CA" + "28C368E60F8D29AB81FA855017F3354DD0BE01D95FEB3029ABC9924FF215EAB29D785D0265C8" + "E406F68B1A6645C6E61E94F4240AF4D2098195C31414C1809D5E856AD25320DDE5EFB010A72A" + "96B4AA728406FBD3DD826525AB50BD5C80C1941461D4C0C82597A8121794BC33B1D1332C68B7" + "B01389D3205D0F5CA6ABD427F924C9EACA066BFD4DC03E85D95667F40550AFC0EACA58F8338B" + "618A29A1B9BD5AAEFAB88CDAEBC0D0B96F9010AC6DCD6EEAFE2B30089E0BD8C6BFC01FC97735" + "047E0EBFE78DD056AC7C1B980EA5D9CF4CC3C35829BC7064F6434421B3BDDDB70ADCAB78826D" + "A54E1739A2AFDA02C159B0C29B32C5B92EBAA48956F0A32D401853E17EADA7737FC109EDEA4F" + "776BA67DD2E51515B7E945DE6BF1FB31C33ED0261C3C736FE7EE545C00DD23E8D4D7137128F4" + "62D41579F4D1A2741595AE0212B5F2001ED9F7967C56C701EECDAD3504319290B7D09329138E" + "674A78ABFA36AACB235F4869D4A517322B8490DC1F4F3826D576A0D93B8DBDD563A8E103C6C4" + "E19D31A6761485BA1EAF7990404C1C551E55BC8714E9891F0EC3100797924A21F6E25CAC04A8" + "F8398F9365F265B7A5EF708EAF175970EF317B05EA4D22215DDC5F89E6C74D6ED84BB3622FE6" + "226830DCE90FB0CB1AC10AF5372CAB71706652D6F06262A62F642EFF7CCACF4A77D9151CD26E" + "291102EE588D0C7EE584E1ED4193878147B1C7A7A695A313169200833BFF524F8221524D5C2A" + "F0DE664740E7C61D7B312829D502FCA6A0153972AF90B83AFD09CE6EA5C515C6EC765CF0808B" + "9BF355A7603E90048F3B49C955366AAC64C582A6966F9A3F04B46E7CD8477DD5BEEFE5A8839C" + "F8A23C2C22E6370FDD91C5A2EC7F495CF5C74E9EE2D27BCF57D752FCF0B1682E6A5CBD87CAF7" + "C92122D1462102FB310472DA83E53A4CA6E7E133548DED31C2171DD5B477E7194593E1D67023" + "59CCC9880E56476FB0879AA695DCF6D63684376C9BBBEE0E86CD51D2DB18E874736CE2E1718D" + "B4B8AB3617077DDD936EC216C6B6F3BA96559E10DF6E26A701193339AC40E6B87C9A298E7EE2" + "DABB8E8438CB7B12ACC87E765325CA7C15B4E208CDF4084628B448493EF53E1BD3A5674168D0" + "F3F4AEBEAF3DE4B477972E3AF3A92FE3745A389BBF0EC6744343C451F39C115A7F77DABBEE21" + "B3E762D20FC59F6696541A32635566CAA9392DCF120097C06E5AACFD9D1010F3A6E3763A8A3A" + "5767390BF5C1D09F54E9CA805653F40AB94148CDEB863E702E2667B0F543AB24A8441F24AFFD" + "CC1004968C8C5A965E5E38DE281E1C982B78721A77E30B11A77408894764B38A89BEE52F3533" + "EFF7426F46546460F6B4A660E8ED534ECAF508358D30DF0970", + "028DECCC0D49AC2B22DBB91BE5E9A28204F70C7248041A36845D3FFB3D9601FB9DFF9154D126" + "C0DE52CB0F593E33C8F3E11DEB1BC9FE36860F74F90229D71580C40E65ECD73CFCFA884227B4" + "F4D57206E126041E77E74404BC47D20FCEE8132E1E261546EC7E87E39A944BB213C4967D32AF" + "A73259737E0644BBFE468BBD06B4E30732B66918A4266D07F403BBE85B31A2DEAF7EFBB4FBD5" + "88603A31C2C574361EDE6550549F196D46C77862AC5474E6DC06DC21C68974290C2885B674AA" + "D1F816BDF42BC836C44591F08627EB068CED18D519C85DE50A94D536C55F61F91738CC8ED3FB" + "273B4646AE9352AE1834AF83FF161170C0CA47C77FA66F6B634C8061CB2DFD9236A20D82843D" + "58D8DA2CF3431BD81109467ED56E23F77E873537977F5DDFA87D2477142B7DE41BADE1063075" + "B953688AC2EC59BE07D33CCDC6A1979B50E175CBFB5C0711C075BFA75D0E15B3D30AC7667997" + "C0FB346E86A22D953B5C18C10F6BB04F7DA851DC497C2BF775FDD3D959C2FDDF88ED56FCC521" + "1037B1859E68B63635784283608AD8937F69A70C02658DADECCBFDC7C4A6061D10D1FF83EA58" + "30EA9592EAC4C5B9C9BF96E26639D13F0DF546D95652A14F74273156316E62C1AFC8C21F1344" + "46D827A85F7AD03F16AA5CDB422861285D22C70876C076CE5C546A8C3DC6C56D31F254154CE6" + "F0D85D468718B80C2357BE5BBEFDEAF68B19B42FBB805FC16CC84A312CDA99C18E5AC17BA2C4" + "FFBA44C0FD9D3499CBEA997CD247909BA452B38FC2FC6EC550C8F0E9902EE7E097C47A4045CF" + "DCF040C90EC09D565E5BC88422BE7E79D66F4CE0460351D728813E5DE0C2D8FF27B1AF710F9E" + "2798F935E1A694F606C9165513FF73BF00D379BFF97442D8B040249C61DE40828B2F4FB13BB6" + "89A86B2560666F6280C2FF1D6D30A8E00537501E084625A810A8320B628193A04A3B3985D6BA" + "5D6808402E39EAAC4D231D676C15169E31AFC478EFA2FA6AC387F4A0FDA9203E7F5A787C2455" + "39F2626908C964DA47FE110A6E4581E16B223B28299DDAC6071B91D1B9E9D226422DB9D7E282" + "6596A1A953C2DDCC8A1FB74D0C532F8DF338B2AEDA8FA4F570DF7C4F9E768E5112D051EE5B8D" + "B5C461BBEAC4B38FED5761C119CFEFB358F4823E8EFEB9C36D98E33D3F88F872AC2F23256DDC" + "CEE710ABCAF1A3DBE73CCF7D1677983705CC19B47E3AE25C334D1EB57557181E8135BD0E16E0" + "0ABB7D6B9B37668083E2C5C00873CF62E464D91288CAAE10048222C653A59C3F45E138D6538E" + "763318E5F04543EB390482956A8A879BF55E9ED0D6617150AEC1634459B7A63D24FB1739C348" + "85CDB4FBDCEF0FB74D0759B9059BE5AA8A2D145569F6682766B82CBB7C3DCEF7CB6CE844B0E7" + "3A37C92F197B6688B1A0DD42A3A19AC2DE5EABF6785455AA50482735F0A883E9C6331B9C729A" + "C721E8BF0E697298D11048021D54C45226C989D1BCF38400E8D1F04059BB3675AFB75401DA1C" + "2F6B205E063AABAB5E2CB30E91D71F8B660CE83B067B9A2FBCCF39F6F163D4F54239DCCEEDA9" + "313D0D5387C47F2F31C66DB0E75FDC5F104BC6B37DFCE620E1BAADFC7348D5F76188EB6C769D" + "E282D2229C5B9E7C8FBEC3ABC97C56DD534733EC7D328C2CBB7E144CEED0F2A5615A699051FA" + "E76D109912E5E762E2763818D6EE6505371135A1E0689D94221FF896C9A4C4259193E72A890F" + "8796BF9F01256FC14BF870D597D17DC788FD631E5A2A0DB9AE312C8D55E71D008405AE975AE8" + "67371481726051B4130542056918841E02BB2801C5432DAE3C", + "919EB6F6E500662694AB771C68376A57427CA8B4E55ECAAECFEA59CFC04FBA5D024AA72C765E" + "5B6D805F0E038A1D9B2A863A5B74C82C8BE0A629618CCDDA47B67E8E5FD683A3112260F2AE81" + "2D23E831813622699A572C2282DB0DAE88F920B1CFB88E3910064977EDB5C0C8872A94A41934" + "847F88F7FFD3E6A54F782B24427A3987465BC14B245047B2EC7E2977EE8AB8F464F3C2987E68" + "3E9D9822F9629F1CB1A16BFE14CDB815F34CACA271163348E89DFB8934C4186380B76BA42950" + "45F78DFB3597B33E498D2AF4311DBF8C5C31833EFD7F47502760DDBDFD7253FA9187A1266FD2" + "BF7ACADA6EE7CAF19322AE2B15232C65FA14BC501E4C23EBEE861136D62C9CFCD1650A7A758B" + "F47A9C98EFC93FAFFFE6882A4771BFF2692CF20CE4851A77B22BE4985EAF1DD7F50E3E3857F5" + "DC7ABD0C93EA26F72C509398279A4B27FEC7712A08B3FFFAFE49FB8C9CAF17E8D72F2853459F" + "9C9A35B64430BBEBE2193C051E942FD31A62546A3AA264C7A9F3BB2DA9AF7EA5FB3242F0C4AF" + "E5275FDEDD837205717F5FBE60C61D18FEDC4617AA58C93E66F4D66FD8F7D1054A12EB7680E3" + "0C119648EFDC8B89663447229A9967D40ED9943FEB42C69C7CA34FA20CDCBE0B3F0CA1E79317" + "8EA8BBF74A3F1BA6F105126941ED3170CE2F21126A0F7952B3E5FFF788FF10964C1294AA7089" + "81D6DBF74930044E388EF9C6824F88BAD86DA0A21A752CCB223640C60BE25A40BAA783224462" + "E0B5FD38BF36F12DD998C34A3283E89A09976D2E30AA6CDC28E0387F00DB6D3D371A72A9205D" + "2EF901F9CD2BF9BAA9BD53968A9F21752B760B1C776A94B2330053B7B6BCC4F6614D2AE04D6E" + "E2A7C3313CB42F012965DEFE4EC0F8818B6B347F56BC530FF02110A83A2507EA9AE97DBCC32D" + "C7F5FE4849D4766D17545170DC730AE6E2E1D60AF43275AA578A621E17895800EBC6974CD136" + "A9F52F81195E8D736989E4F7E3CF082E0EA5C5B4D5CEDC7E39225C0BC4F43CB372BE394ECA25" + "67622E5DBBEC65C79DD863768037C26DDDE546728AE270689EF925E3F5159A658CA39EEB5A61" + "030C182202EBA44521C27C3085A4C7E98B2627DE0DB72B8A8F5FDE7AF75470FAFD4B4580256E" + "15F3825189C36482D6B14071E6E920D7601DD36084ACA225406700485D7911A1788C8C07298B" + "CC624C68D54C3570ADDAC2773198E99972E04E4907C3493344CA306E7BA7F4B3C77C68D7B38F" + "00835F1B9995C385DF1354BA9D0E92CA3AB77E5028FE06A8627B2851EE0A9313FE36F9A783EA" + "41D723479CE81899A62369C1B6DA12C82FEEF8E86CEECD88E0982B7D198BED4190711B377361" + "71F77F413485B6D8396C46599181739E2C4EB8257C1E59F6C7FC8C950778A14DE4615607F140" + "A7EED5C534970B95D2AC8FBA1C3A999D8FAC100F1CDEB163EE3CD2FE5DE760C5322CC92C3E09" + "272074E9997198CEE435BB50EAC32AB16324633D194E031311E85889EBA1200E602A44535210" + "6CBB806EB0497678E028D6B4126C3918A41CFA876A401A2D2BF5F0E2AEF5E7BFAF151D4EDB07" + "BE464D197E325A10C3E4384A225D740441830C0865AD779C531A659A8AFC7A49F79160E47514" + "E62A7BBB643EC016EC61BB9E3A637DDBA7446E6A453729C7D4ECD3C2F23D03A449C7E3B73AB2" + "DA3A5707410F3C7EF279196CEB17A9881F4AF956C8B32E963D7001A91E8784651EA55AE4C2F5" + "06B87476750CE3B0E8A2AE8B66E2B92127FAFE3B4C33DBE975957E0A45C1508840FF0CA3D6AF" + "E2CD6D1811F03727F7BA69480F42D3C8CC3E54776B20754B28", + "3267D3A2397EAF0664732DFCDB7E4D58614D8D5ACB064450EAEA647E17745F91BE609A70EE64" + "8370A5D151AEB473CDACBFB705DECC8BDDF298C2C24699D237015C78079DEA7A79356FB5943C" + "AD534E2332549FFF04E3304FC7E344878F0A109E5E937E7D0E714AB0F295002FD0AC37F685D8" + "604AF702D4BA99A96386C191A8706711808B80A92C0EF579FD8A4EE8F915B1B810D60E0CAC50" + "287041F100F44C11561DE1FC1EC50056455CA80A25FF8CF1038FA7D47FD8A9191127D021749C" + "81CBBCCB36F3AD5E67017A835D23903FD011DBB66B72DB442CD5A6C6B6657A44EB3CB4624703" + "AB9AB196D2B171BAF18FFF26359B3AF6430C9DC0F3C7CF569BF0E237962E96644D78B19CB737" + "B69305028985FD117C8C8A5F644E293613B4C425E778779FC4D6680DC34B954520D93ED32A60" + "8558D8E2050CEBCEDF0AAEFADBD41F3EA487E0551B6654343B48A896E1615336C5503F092BE7" + "C15EDAFBAA87DB9EB9850238D8D50832A65BE4D825154E961D80B3591FCF70F73D21196E4364" + "A39137D28989F445FD0C8A05064B6F6769CC68F591334BA34F62387ECB579F1E781DC986137A" + "E6CD6327FF8C7AEC746A5B4C6ACEAE07123169E6B912F5336B1B2D59A116DA76B36EDC405FE0" + "4E25D60AF40733D5AE7B6699EE9C09C974205F2444C4A8DFF15F2F8E04798FFD2280A9D51350" + "051BC1FC3DC354419178047C1070A051A983835840EC6D44F8BB928DFCF57B81A4A80E880C47" + "3070AC4C1B0E34ACCAE95A077A9030DD0B7F61A85FA0054A786A947385F3F64BD3C842878F09" + "163F1F90663907FFC95266239655A9E14D6FB564F2F2BDCF00F1D407625CCB121A18CA7DDE89" + "9BDD076FE9AD9E716BAC545D28760933B872C833EC4FD17743F132BAB85113069AD58D9430D5" + "93F6D9FDA6713307ABF4E22E5F32643E73ED56BB3F0A64C4C80F4ED8F4E7B3DEDE774988B9B1" + "ED6B6936A980850C8D74ABD3F230C61432B4F99AE474752B1E8131E378B90BDA6AC2AE09C4B5" + "06863E47380437F1D57218F2F429797CE9DBAD4D22D89F4D026FD3B2D72430F63FB97C6C3804" + "846955AA453863358D6710AEFC948BD50CF7477CFFAAE9FDAB9086E6B1D936E801006BE0C233" + "B2649FC8A8BEA57FB2FD85CA7300E187BAF060170DC1062AAD58900445D7E007F4841D4BDAA8" + "E3B404B7B08BA8A4C76ED59DA15FA9ACAFEC2F25B7FFC8E1F11812095D377F1E1BEB2F3AD6A3" + "E28D80D352B200AB276771CA5DFA6F3531449AB111887E1FFE4225586D378B238261D462AAB5" + "B53EEBA1A6D65EDE3F84B1AD63BC73387AEEAABFA7E4485730B572F8537C2F878F287120BD20" + "907AF8DBF822E894480445D4A1F95DCE7CDE392B00D49C7B3E73BA9F852BA220122917401FDB" + "1F5E0904BD048E14F1E1F43ECA1F4EAD0CEA1227E5FD55775E1CCE3DC6B58D21FC7B7A6B6585" + "D77CADAD55462B8641C4D1ECB61AA4427FF87E11888D59228CACF65FBA538EE6E4D5004D4ACB" + "01B147C56B5CF4D7D878FEECBA9048188F8713FFEDA4F437F53595FA85B9AB76E32515D10DED" + "202DC7155BD2B8212FE007EBA220091AB5546083B0E8060F5DE18700CE53A1BF4DFEA57D1513" + "F9264DCC4307D60080176C9B8D676109D5BF9755FF3EE2EF30ABD1293F7508E6B1ACC61CA255" + "AA9621201C363E9DFC6F0C24EB4DCBF640B2F91B44B2B5DB973E9E942F4F184EAB8FEC201CE2" + "7C6160AD23907543565BD09D1EC78C8178D4AE2E27599F2D4C28630C4FCBD52EB130A101956C" + "96D6B78D9D1192EE7B7BCDE72F1B72F013232650FCDD6AB7CC", + "E13848F14BB8E58925017092366409981C1BC7C3A063B134EDBAC9BF71C857BAA64FD87CFD93" + "152B18FF6481AD8E141B4E4B62B2F1EA6684CCEF1A8A0667A7FF956D076104A3C9FE52847D57" + "6DFC5C4C165AD134C791997134C493CB3C232AD15C4D0A46F07C5381387DEC3239CDD1BBA921" + "677D00FCD0ED33FC2212D9B197524DA65B633803942A301060F2531258E887633C5DC7A071A5" + "CC6E8C18A6549CE07B70130B31FD389A5E2D22D31E742270B306DE01AB2BF49ECED1F77AF972" + "B903BF3344102328BA7A8D716D3A1A83CB1152AC8F3B89DD13DD6115C1F73574234346CA403A" + "3BDE241F7AFC6F437DCBA12555B8701DFDC6E66E2434CA7AB436396D402A42D7B5F5FA534D1B" + "0385C152EABAC9FDBAB708A9686DE2E93CAA198B72F2FA4D622902E1530A4F72B3DE1C906725" + "95555349CC1270F79A9DE4A1950E81288D64BE9E9DA330AA792E8F6C2D2A21DABB7F26BAAE95" + "074381B16594BF5F5BD684A8056D38D85ABCA65848ECCEC77F701C3B55490BA77D85EC7EBDF0" + "48F7B8B804A6C585805D59DF07510D77917723B9E26A9511A782B0B96D1D62BCBA2988104599" + "FB813A9D3EBDDF16E6F25FA9AB00F6C19A1C885CF1968968F4B2397F19A1901DBC0E7254CA30" + "62EC674B1C0BC774798DC22E3491949E0C1018A85380398DB4CB6495D31B3690887F996E167E" + "017DCD092BBB176738986F7C3903947C1EC4A1647516A98879A79246591D3313C65916B4D064" + "747F6DD57C4294FF278A410DC16D53FFCBCCC0A2B1EE6642CCAF1E9A8DA4E5B050E36B024DFE" + "31A951937E7C37E4CABBD4271DFB26BB6E591B8C0B87C7B07033204CD8921D0149234E3BA51E" + "24390FC5C937DF6D2F0BA2A36C017659771D5DFFFD3FFA9199EF16DA476CF17D137CB947CA79" + "624782E223C65723CF04EEEC978363198B8022DFEA95208A04D06E4EFD5B0D6B13D91AF10712" + "96BA77B1FA42ADB24216A504E23457DF884E8FED09EB77B8969DB12E674BCB217872F5F99274" + "F5FBCAB2BD3B1B2DD8479FD1FD21DFE07CF70CB3A93E2E253C25DD53E51882C055E7AC1FAEA0" + "BEE894F6C984930DA8974016EB5BEB206CD86AB0166274D5F2E86CE9E756238F0214F38A1560" + "78D81460A4839C8AB94226B2C5C15B841FB7F84B98FD6720F4B26A29E5AA2B8ECC0235F851D4" + "B8E6D2961A837A8E2F0EE167C90D4B3B59DF26425585B16ABE65E9811238334A4526CE516311" + "F389BAD91DD587FF27060E9E8469AD5D606ADCE68C793D76F13A1FDA922736781A7E0F2378A5" + "0E28A5DF52B24DBB3264220CA7D1911BCAAC8F9FD051BC57FB3B22569E6411FDA180616FE209" + "9E5A913737FA8F6282FE7C4D54F62262F94C110993376C9352BEE9451C2947B13C1F96079B39" + "1256FE1723DBAF278C59CED581AEAD65885E5C18393FF86AEE26D76473E231A29CD92894B307" + "122065E99F55A3686A90993EE6B734AC24F9A1DC3D1C57B0561A52D9C74AE287EB100CDC7515" + "69E515934BC139AFC67487FB7E0876A0E8D35910A7544E7049418A06C781AA1473CA103C711A" + "B9E5CD85D3EACB919A035586CD8135F6B5DA00BA456C324864DBCA45DF415D7E0D79EA80D046" + "29F2AEE90F291D1F25734C3BCF81FEE12FE2FE7886ED36372F5354F7EBCB9267EBD387A134F4" + "B99D236E5A477BB5E42DFC5C847EFA8B11C8295A10936D5097E37B975A523823D626F235AC36" + "AFDC9D82C814412A55FED100746631B07A4DDDC83CF13A98F111D07891A794F8A74FB22FA3CD" + "B896DA3DE66257FF2FFFEEAE3BA69BA00DB151743D2DBEFB24", + "C805324AAB8A7CB39934CCF359AC2C8F6167F2DF4A01DAF4E9D87EF1A35A793C7DA6BE42B6B4" + "2A0EBB25144BF390596700BA1FD23340E6D39663C0A21507F2E7B13DC7245D8CC696E1665DD3" + "8D4FC36266F5F734A3F53B60267FB563C1D09CABE5FFBCCA4DBB7C366E44012F4A8883F18E74" + "4166D932D469B16839102D5DB9BE3D9949816E74004E13A749A1005D5B3C1BE923B5C10AAAA3" + "EE986270EFC213241760A78EE1B5FE421EDABF61FA2F451F4160D0D1992401F56801AB3DF623" + "7207BAF72FEED2A3385A60E0444BCB79E334D3A3C7183C3241E406F80F5A7AE6D97FFD9BAF43" + "65BE3098EC69152957C1FEAC7784165CE5576E77991812A88790C92479E58B34C7A88CAE00D1" + "1AB89531A7AD631FCD1CD996DF4E466F0AC7A23AEDB7F0DBE3A7A70A4B6C9763D16FCB9334BC" + "4F643B1FB864371D70F9CFF38B17EA7A5A5430ADAED985AAD0CDBADA86152D2F2BF468E7F9CF" + "875C76130EFC6E13791E9664E9FB45E3749B692872F2E3ED87F6DBAE22F1A87B31397DB4CD9C" + "59FC635AF2C6548EAC45803A988AF19668D3CF124984F08AA40C4CF73B75539D3410F71ABFC1" + "F54A544B1B8C863ED3617AECDFFF4DB3AF2D780FB013C1261E0C71E2E59663CF69E91103832D" + "0E62A5BBFA77AEF0276237DE6AC00B57C0124CC58583417C517A2FC37EADBC213FD6C3B8F283" + "74126421FB87230CBBE2AAA841D6E24BEC1E6D5D0042C972E43900173B40C94CDE3ECEDD5A04" + "4E0B46CB15A64DB3411738C7E088A97A40113B361F6ED9299EFFD3EA9C85C1E356FF32036E57" + "E29677D7B32361F958E5DD3343B4B198DD1271DE46F3A7F0542281E334E5B3816625FC2E8073" + "4D04E7E914526EB82A16B6A13EB2DF1E4F2D62C7BF0DCB97ADC0297DA7F343789A1ACD679996" + "4CE69F28EAA9265009A767F65D386DAAF1BE12EE5DCB62FD5F40D557D7D24EDEE1A4F946FCD4" + "435DA3D066412A69C1EB01DB990F003DD3EF5A35973749FDC9B79A10DDB70322034D2D24459B" + "ABB48855E2256B6BC03B413CEE8FE06D798EB0CDC528ABAFE5664C32F3BC80C20BCFC51FE330" + "9AB87105F7898FA7067076BA1F7956BCB8AD987206848E497A0C4B8154B96B8523A9510E127C" + "1D435389AC812E965EE551C2B93827376601021218B8F05950C339F2B442AA2768C54D5A2A37" + "AF5CEADA10230CC18B7D1CFB940A9D3577F3BDB9C6DB07C97FD03FAF80417DA2A4E65290ED7A" + "CD86141C8D4D62B3E851221B45728B7B578CAF1B59D1D60A5245CDB5975551CAA07F7A79DDDA" + "9F56B26097C837B6A0F01C496401B9AD51D2DF6DF738F19512C0A13622E7FDC44750C4D26CE1" + "09C5864A00DB00A75CB6E0005252E832320904C4C174A4A00076D3AE500DB005261A39087364" + "B230AE223BFE7446C850348A98F1CEFB6FB4B8AB59D802692380F056DEC13E9064D6AF95BBB9" + "E5EFE05538AAAE9ADB3A24A506B8B9AD8F531EADED14EA2D8448A17CD46B2B1382861B35EB70" + "94A672745BE8201F5FC0BFE93E0DB639DBDCFEEACB95029DF38BED18330C4085B573AF5EC545" + "AB2A316E455422D4F9CC30A9A0F1D1848408066ECE41C9D438AA77A6974813591CAC2B83E487" + "08A95C4A1D69D2A81D2305E927121604E19B51D3D6A9EF85D6E0E60E5F191EFA08E1D590CC7F" + "8A3F3D043013DCF4C3266A7F5D514A3B30D719EB607F1773C82DC03D6D6A447AA112DD5D9A22" + "4B4B2C044C0EDBB0859ED93BF92ECE9AC5AF7CBBC00F099DB80D783965482660BC5BAC22B3F6" + "29F25877B724BEBEAAB02FABF46D3BA77487D8F55B61CBA6FC", + "A9958A78FF2222D3F9E09781C98A1A50E7EABCF19D5FC53F55B91B755BE149086726739E3EBE" + "43D82256CBCED8DEAABAE840BAF761A42D25B178C2A1A2A8E67DD8101AF518031446D30CFD14" + "2E01D983D532F913845B1E8771011D60E882416E3E30CCE250F8C1F63AFAF782FDE616BA652A" + "FE4E0AD3D0E267E801486A50D5D5380C243D97B2AE30DDA8CEBB248BDA54372D4AF453DAA5D6" + "675B6E3F2D04030E5A8B694D897A5D27B206AD89590099CB84D902D56B6FA37B59634554B4AB" + "061CFA2341785DA59182D9EA2D0FC9B7CC76B5648A0BBD7CE7FEEBC5872D4801483E60848675" + "C697D4E4B968A0C857E572E78E0AE9E0E09A29D298B609FE8D2E46B1FE4405A4C2D49B96CB25" + "AEDA2770DB0110F1A623E7A3707CA6269964653E0EC5E7C4658F0880DB0EE45B75A4D369D92B" + "4325A0227F8D6274B17F906D194B94590707975071E74EA7EA1305169D272BE963AE6121067C" + "128012B4E1A3D77FE73EBDD05126AD6E33ED93F0B4579B4189A5BA1E82C45F3860D52D2AA2C6" + "9ADEC5F6D6AB409B21D399009A91B5604DE4BA5E91B296D15A70C020B4FC76DAE66BA55BCA2F" + "52B4EC2A5BD124DD7315BB0C754DE9BC24301CABAB0A56128017E6470BCB50727F54A65D6867" + "BF41EF5F5C6F831F0A47330C7C7682411706B8808EE178DA21C89F4CABC19B807428BF30CB62" + "28C018AF58081BBE67154585431E8DA4B42586EF5D02175D557B1B73D36A441BC27D7C79CE64" + "E6109287DAAED89DAAFCA3FAB98F3D57E70A58519381E9079FCB4444FF1E51A9955CB7B51833" + "688061630D699DDB4BABAF325D9F355AC7CD411B33897A34C1311E2BE05733350DB1BABC53D8" + "39825D66347C298F968E994BEE5C9B4F511BF065B12C9236836C395E331C090D90CF60BD2B13" + "A3D3435D7C342FDDA199857ABECDEFC8383405CF0A856666D7EFA44B1F7163E5F4CBE5FFE6CD" + "F4260C5A5C564F2FFA3AF20797BEB8E36FDACCFB56F5998B154D4A7D067308C742A60D5FB094" + "5DC8E575AAA418EC9C73905EDD2D5507DFEE18163D5485705653CBB49DE9DBA6C37233D77066" + "2215CB1435EBF42EF0A0A35B08178216EFE7287F0CC4BCE60F8AEC2C419722DEE8BA6100D9F4" + "B2297CE4E4A28DE8EDF277FEADE7A144002B7149716B0C89A58DD031D1F2423E860D30F224BA" + "7D258E55E3E146A1F694DACC9FD33CAADD53108C94D3F3F156EA7406EE9B608E131E9D0B5725" + "C1263F6E096B239F2FF03CD5B0179E4FE806772EA5F446A74939A916341FB944F4E72EA31315" + "003EAF5D0DD734325A1CC4670B49859D76175EAF80151918AE9CE5E453BF058D12B3925CAC45" + "F4AE9DCC02FE4F3D01B56781FE9F389AD20EDF8C90749D5A172F190E20DB2EEC05CAED51F9F9" + "65262119576AA7997F266B652DF0AC50F8F54E3497CBA489E196042F8849F171817634B2261A" + "D1D251DA800450BCF6AFFDC9F6E2F628A4E4E7D289A5F36010CBA2EF689D304686EA3E0CE7A4" + "661FC29CFEED083D021B58A0A1EE85FAF5851A75088CC1DD7989D86CBB72F725BA794D41D425" + "578D030EFF7C1556976F4139C726E304AAB5D4E2774521BF560CA85C6219CC17CA56551A3335" + "ED5BE66B7ED8E3AFBD3C09EB8BFE9E4D474B460C85F66CFFF4FA65F4F8D1DF1A44BEFD6CCCD4" + "2A1E740583827EF66FABD43330B77E8587D7585978B91A97A0DE61361207198F5386D82D8926" + "91B4C1FB115E5B274EFA532E2D3E3287C58CD74833837947ABB1B615999D40FA8F1190658BD2" + "399B10567C6B559F37499EBABA5B7732D618D0C022D98315BC", + "7280137F5BBE761A3A485787E13DCEB886FCFECCDDFF01FA09B01F267FACC09149F27127CE6E" + "5CB0E7589C1C4B78B7F6D993451F041C06380EB9C4ACC27A597CF96DDB8DCAC02C5B0ABC7896" + "DCD630342F57CBF467ADCF0C2FEC8F7BB0534ADD6ADFE2D893C9A9D01E344487A5DA3E7175F4" + "106C25814171E23019A2A206D37121ABC725783100B87B4EED15B5A043F7505131FB78A60E61" + "27652F205FBEE7C5B8C15B5A7F0B7333AE2F14CFF5101502395485FA92C6767F3E529C6127C2" + "EB340621A8B3C7AF186DA8C7D01B7663940ECEAB8B12D930DD1A143B9FD9BD0CA64CC4B0EE3C" + "E3251A488B077087EC9D1924FE3C7F22D9B1DB7F85C6C0F1E1B89EE5C6A5615632EA567385AC" + "734E344D581BE5D8A3BC2C9DA3F1257B26135DB8D0D7F5C70AAA13661526ECD8C88DFCCE0E52" + "52DC4981FA13C4C48602FC2155D01121E3C83F9092B66DA3901FE702255E8D90C0C315826613" + "DFB5638B55A1FD5A63ED4E81B4BC5E8746F8837C76D891B85C580FB09FAC9AFC86F80D1D0EC4" + "8DB71F608FB170BD1E96C0B95BE32D5FC2D568E356FDE43320D4618184D8BD522073FC04E2DB" + "36A484FE09E3C2440595421FA0309191E42FC0C91DA52538399FD8898D9BB25433642AA871D7" + "F5858EDD64326F5247E2DC9A1EE28DD3EC0D591639671AD0E7352BA6354352B1D3BC8EC3C781" + "B1D0FF6DC6CDA27F1E3F924C5C9BF0877068892C52639E3B86919932985ECDFCEE142C5D864D" + "A468EAB9B814E3376C05F18ADB0C7AF1E68AC230166BA1F2431CA53E7F3731A4AFD0954E2054" + "0457F9947A3AE667687F2D6D418ED1F3BEFD027A53724338328F6FC6450577E102D6D45BB96F" + "0E80460F5271EAC24765B022A2CC0623C74140D21B0417D7473E2DD2F091163C05CAC9E48DA3" + "FDAB5DA96506EF789BFA1879DAF317E9F57A1606359DB48F1EA86D1A01A9D8EDDB4F9F4D2F21" + "9A91CEB80E301C107C5164CDB7F68F691C1C8D73869D3B39F24727C944819AFF327C06C82FC0" + "7FDD99BF9FB08EB9DE43F0F5092E2C373EED7F6400A7354EED60559949AC7494C2071DE34D14" + "766E2CC8F47C974157FEABABB25EF714CB1866D55162D79E0ECD749842EDA01D40BD62947E05" + "D960B689E1218C3C70DAAABC5FE1548D69E6757C0A35694949825EA6FBE84059B1C5717AAAB3" + "79D0341A1D05813313DDDAB7C6F3A90001DEC23CCF0DEEC67476D9961F1CC34AFC405D14A7DA" + "E82B7A88634D93C25582029B91EE9D46422B87DE66561630CD931E45F297E685C81AFAC7A47E" + "96B2C53D090019E23D5C73CF5601E5DFBE29FDA26572BE9B3E013E158971CC779DF5E9C43089" + "DB673B17E282764ED815566772F5015777931A4727FFCF892810C316D281EE8360E089A2C85C" + "CDE68E9BDABD6CAFA6E44C0A7E55EEFCA6EB6E79225B2B10608D4DA449E76D7653F77AA7E503" + "22765F536BD5BD97167B33A1345910706C177814B68C3081491F3FFE4E258C9EEEA80AF4EE66" + "AA81B726E4147E8DCE6DB910C2397AFB9EE338E91A87C807CD97D4EA645BF947DFBA7806AF3C" + "E3ABC47980090BCA34D697E25E35F5813A167E94FA278C9B30C686A667BE1D44262B97789D94" + "041AA43C9B2C6115ED4175BE528BA023F52C338F8699B6E2E6377B0F33C437B800095CF63ED5" + "BBBC8CC81A0B8582C0B9ECD555E8EA38D9A0217DF657A41929296AC503EAE6796B12A87FA3D5" + "55B0E3C318487916D069BA07E2946BD02B805B742192EB37079EB468AAB6618D328EF7A4DD5D" + "57FEA82E93E2F1334766E28B2C7B8E043292E359299AA06B74", + "FD95FE76224E5123645A6A287FB11318C0F862565D6E3DCE2E3F9F0777E9BE35E6AB9F4614C2" + "603AE21E8698E56CDE24A45A31AB28FEC9D6605802CEE2AA5B9C6DFC19E351CD87EF166C40DA" + "C9754A18CD51ACFD9DFAB3B3CA27E744844AD62514B41DDF35BD64EA8B49198B23554551C24C" + "579B5F2AC3AD8625C4271261E3B8391887DD25730B54ED8FCBF8CAEBA745EEF4E84DFFDF19D8" + "7D7707706EBC7EC5093EA067A03FDCCB468E3E7959B6FA6CC2C3D263064001676199B115BBC8" + "5F55E49DDCD7C8994740DBAE9116E9B6227F71F5EB8DC23D62FD990A47B0B3CE1EDB4ED49A0E" + "BD60722880F96AA2BACE558BEA98C0601E285968227A3FA1888168BFA3F2AD90C3961815F0FA" + "EC8BE5142560FE99A98AF814DFC7A01A211887584ACD3BF1359E9611231DF14216ECF36EA0FF" + "99DE8D82C90871FAE3667D19063340C767BDEA6A0C1E64474DC3007F843879F0CDFBDBDAB645" + "DB77E5AC4A493C9728B276529B93453A4F24948D69FBB6E89B56F6F7ECC3E787087F8030ECB8" + "899E0C1595EF79B8C0B318262F99B1D7E38424D06C5EE67FC15DB3CDDA10A3EE31221A5E6B23" + "F72CD486B84621160178FECA07D465665FC1A90A29F44DD7C3EA061A70C26D53F17F45A04461" + "7F179105A6851E0180C655F46A9CD75155A7C0451381AF5C164ADCB6DE1CF3437894266FD1AF" + "10EC75EBE3BF911B65DA225D76C0B8A644FACEEE49EABE84F76A236661B9A000983192F0D0CD" + "97DB66A79F1C58B4CEFF0179815F2428DF8F5D83B83BAF86E63EFFEC85CBDDE8B975D4C7F4FC" + "6DCAB433A92EF846270771E1923908E9186D70D53EB67A8C90E2A8AAB1346624B455C9AF6B3E" + "EE0B4A291AD48848B9F914F37357EE6FCD62ACC614ABA4D6C08D9A3DF86CE2B1E60FED8E7695" + "51DCD006819AE4DFC535631689491ECDA9C6585E11D70190CA18BE7559EB1F65FBB83E7F1D1C" + "EF1DAE9A9187C0C632237F85159689B1229C911B9FEA6FE53ADE16BA9D0B0FDFFAC3EDAF6588" + "585EE830064072501F9F303AA23153DAF952C3FA62E6F13440D6A5AF460C14788AB6ECD6152E" + "FA21E1ACD7046552CA1F9500403458E857E0B88D27E148BE9EF422652BA7C2A2431B94315109" + "4DD6F92D7D210692F1A13FBACF8FCDE86CB28AA34201E6A3C7C47B163461CF0DDD6B4661304E" + "5BA118EC20F49E73A126E1352AD5A85A8DCCBCE9158AEF2D64A999BF0AA7C1A3F73EFB71D263" + "3BDBC27DC5045698FFFD0A133F5AE143BBC6F922379956574DCF85A830CF967B8602007A0BAA" + "C7850B8E981BF794D0CAADFB833C61205F2EC4699629B13A544AC02742BC3731A9A2DCF35281" + "8121E9A5A212CFFEC9D006A403F6E45B5BD6CF650CA7F8F8AA501E72C81E908B71AE26913760" + "A21050FFDDA22DDFF850422837644B23AC76884BC09A73C052A8F8FF2985379B5ED6D13B7E01" + "2B005C9BFF9A422D2CBC240C0A5679DA2CAC6761EA17201A9152E46CA34CB11BA7D02431E60E" + "FDAA98594F7EC0CB8E850F1AAE82F002030EF34F9860AD0F9D975354CF6224FB1EEE143AD7E6" + "4285FFF8CB51051DF21EDEE6325C76FBE77E2C1F2A87ECCCA935A7BA8D44B9E99D8AD0AD5AA5" + "643B242E73C97821B8C42ED390643316B5DD879C316346F11F1E2B3C02162A8A69B0BD9F8F9A" + "EFE42C7A4B0425F5A4FB5D948454614FC6122A1F2EA532217BCBE8943F2588E83F50B8D16010" + "054FC29A55310759AC3C22FBA54359BB6A88F1418317AD2B5811647B3A32FE1A54FADE54622A" + "E067CFC05270130060BBD0D08D37ADBE1AFFDF8685CAEB43D8", + "0F94C5A9474F534F2C8260885649889263580FA04B8E16E15557AA07303C18883F4D464DD075" + "BDFED07E06CBA9CA78C821779E60C8ED27C16134B088AE450D4BCF45A55D634390A6C953AD05" + "88DEA30F385861C62A2E697DB5EA8439FC7DE7EDAFF3DE38CE96AEA157C9872763457D9E8598" + "716474A9F8FBEEB2F916D99956D1E3F25674C57A61AC1AFE7560234E77C3C47623B509033FAE" + "0F9449AA760DBCFBEAEF0B8A96321E6194B7F5FAC0619FD145146CF95EC39EDB8A183E743097" + "8B1C892E1BE4815C6554B52E3142FE69B8D76768F3F83298C27043E14DB1CE1484BA98D91F88" + "04BCF23B4DA1A11FB7FAA0F5DEBBDCBB4F8636DE7E454B0A6C14DC7BE392EBA256835748ACD3" + "EB339D8B0363D09B53FFF99878699A4DDB83AC5DD3C576BCAB7B17A111B47134E0422ED27A3E" + "71FE72BB05948A21B810A02E436ACB966EE13A4BABF43DA702A673AA7DDDFF652D97091FAC53" + "7AC296F81CA54174E2FF47360044D6BF96F0026111CBABFA0F8FE2B7E0153BFD110113EE4666" + "92AEBE1314A248A5190FAEA92CCC4EF9101117FB9500FDA8FE3E0BFABA7110C801ED3FAD6440" + "0D9C5FE8E5D054A703ED286BD946BF121D3694DFF777CAB9CCA81CB785FABA4B90EECD3A6AD8" + "4E80A103B08A25341BA9CFF1CF8BC96E8840E591C5B110BD1BDAA7ADD4797746B83B764B32C3" + "C333FFF95B2178D81A37399AF966A25D582D48BAE938FBC76506CA1A544FCF6D8C3E5BA77BAF" + "75E0ABFDBF10B0B65B89E7A4023F13632BA4250E71B650F841C8632983F9E2DCDD63B2CFE851" + "8E95A554C75024FB0E92271A3D2185CF830A3B6F386F53E6C514517F30C06BF5FDA530CF098D" + "2A3A1EEAFBE7B60DCAB2453E0EBF981215B88DC4787DCE5880D5CFEB06B0CBD465CD49F8F16D" + "53336D13E9AEFBE3F2A5C4D1C3342F37D458DC9C327D50AEAD2E638F79FEB6FCF7C7F3842AF5" + "B7D2CE8A8C70C3439E18AF623416B9526CA13858D754B45F7A56144EA221A590D07C96E260CF" + "3DD08263CA72BA6C0FC16FF7B5C1764C565F822307819C0ABD5550ED0E3A40BE0358C922324D" + "4220C8269E595E5C52B4653E123B70CD48D9546EE4FA460B0741B7ECEF9FDEC0761236176FD7" + "B36B178957FE91CA6367DA2CD9C61804A4792855A30B7C680915DB17B4660296B3875F313F3C" + "A26C7B8F127CABAABEA60A0C63D70750B41735D5F12A834CDF26A09CD59C851602C62217CE91" + "0DCB7EA3DE9F718325F02A0B5B89797737555C5AEF1CF5B0FBF2587A7732F3148093BEC73A55" + "04104A4C587499276B6204C6ACAF4865B0A048CE5F98F7802C362FCD85AE7DD833B1BFA243D4" + "6876B18B35A83580E7FF122A47A902017A9D433CD989C3FD1BC8FBBDC0B14AD336A5626EE3B7" + "48099F9D8318C485A5B44B1E984627AE48C4C1044878C2D2797858BA81271484FF100FE92A09" + "B641525FC023FC84A3920574687A792D0C7848820C8C49D7918865E348B696848C6306E7E640" + "4BB71DD91A95B32D4A340EF77C4F62FF0E466CF30AE57A010257895123FF9C06B056B34635B8" + "58AF0917F637306EF9D686CFD1B0D007BC67E9CC481436984BD4D58C811B5B9264B868C94820" + "82A9738DF72404A33D33B978693F7C36BCE3DD68EAABB3BA7A476B41503E93063BE5EF15FB4E" + "C225CFA1118D01A284E6ACE41593ECCB05523EAEB3A0B42B83AF18C14195F55754F923C778D9" + "14F3F233EB8735A50198B7A36EA24058FB4316A852789480618E6CD16F9B194E25FFAA47A35B" + "37AFDBA1B121B80DEFE7DCDFB60B8341897C9DD8AA6C4ACC38", + "0A837BBA606F81C88248D5A41902AD17F497E2D3C8C1C365617E871F9A61A4A4C8A75E6A5504" + "5871DD3A2A69441C9EEF1D8353CDE2212D5EBAC0B2E361E3D400A1B2AB723A6EE316848D2F01" + "59C930939139E385CB593F9A20BBE46DE9D9DAD6A1344D88D694B0C1F9626023CBA491F71E44" + "131DD59843AE28FF78014E5C22C622BB6600191B46C8DB270DC2C85E8B1409CC850D4C4B87EA" + "43C784AA56128A63AE4EEBD193D223E47A678A2D06406BF748D910386A62B629F2705CCE99CA" + "9D246B4E2F64C248CB0FCAE1EA8E061221B29A3011D437625983C45A76DB7F6AD73CD6F4247B" + "8ACF8158283ADC79CF5709B91FF6071BC1ED553CBAAF34607142DFEACDFB4F72133F715C572B" + "1C115B93CDAF6CBBF800FCE256A473F001FDD36F5B3C9DA8838D4EA3A8EFCC84EF2DFB357FB4" + "28E062CF55D3CAAB783D8E06FF89D90EAF39E3B5C141A81F351DE242F6B3CEB56FEDB6E5A23C" + "19A46EC2B880C594D84486071578753F0D3124326F472D624B95399733A0E4F946D46561C089" + "B12EFD60260B451E65E27C44BC98BD77275C651486A5521E3C257E1D232B0A1339028D17A134" + "3B0E4DB1362D8980066DD4463443A72801EFF1475C219ABB8C82278EF8925D3C406469F830D2" + "96B11B22C856B5B9B97B627DD0459FC9AD3A1C79C89C90C939A80F4B12168C7765C4ED54D850" + "02BC786C74D035D7AB48447B3CAC1B8F779382296545CBB8E1A20AA567AE51325258659F8E17" + "E86A6C38313CB47E92FE8B5409825AB12411381F6065DDEC150CAAEFFCE07559C86DFFC85458" + "0F0553714B4BA5E0ED07E094B3AB68887A87A27E904815918FB3BE959D261F60EE8D1C2BC626" + "11C8F3B74C8E9E6C415CE0E724FF7F3F27D13D16CAE545302577D2C05813CE2683AF47909F36" + "E74FD6F8A9FC15C302A12FED2BC2CB0B4B0B402197C8ACD4D3A9F4CA006BF196ED1667637984" + "8F87B8C4F36EE282EBCAC76E3ACAE09DE2B188E5EC01AE4620254A1FE1BD71AC9048B787DBB4" + "4BB8F37DEF6A7D525D0AC2AFE88D79CF452F6B19DFB9F3269E10A522B3D5BDE0CA67D6AA1AC9" + "216406BEEF7AB5E52B36D1C92EFC4AA584AA74CBD4AF867E5AA14EAD3ED10C42220200447EBF" + "7348EE5EE7BA471383CA33F301118C842C368E9B24F13EFB4C588C2953E089E5ECC612EA1054" + "F6EE4BC92784DDE3FBD8EED5FF9F2F887B4CF12C2EC94F7C76D1C2A52685280C4D6B8FC20655" + "20F5B8A3D5EC9EB819F9B38B5DF236B917ACDB45467D5F754729C2D7E2691F6793B8E4D75CAD" + "4C66848B6A6F7FFDECADA242CC656A75D64E3B93CDF12C8FD68729C55DF57CC545B66BD13AD8" + "9F75A39B3F303AF26F578A3B5E0954C087E3AD64602942C94A8716DC7DE526E8691E65BC23E9" + "F3FF56EE37BF8F7643C927A4EEDE5410AE90C66F4F220F9528623465BEF91E49B2E2D8684263" + "11019F98A78391C4BBCEF4EE259DFAFC44008088846116F96AE50AB4FCC3EA57A65CAA434AA4" + "7EE92716D9A94F5ABDEEFAC04D09A6B0AAD7CCA60F7B579A894A10F2C99F3BF731ADE945E73D" + "622FEA86A174957CADEF7D9E3BA45BB7C3DA24126B1D7B0FF0A54808C4EB006F4E231A8F720E" + "A6B8EDC6A7AE828EED9E463BC3E2433D8DCCD16ED31FAC00A65F2B96566A27D30805A1A5A1A6" + "87A96FE90A8187507F2A3ED7E5CED9F213C5EB82C8E790340697DD4819454EA6D17917C9F9FD" + "FE49CE0E75046CF2E265DB9E2710C8C7A87162EE0DF0C97352FB9BE313502412FC8BC2BC222D" + "AB9A520FC16E0F4BA5A51D9541E0345427FF6C27355C0E7FEC", + "DB3564A3C0A25BA97372EB649ACDAF5CD188CF07511F5AF820479E5A72D5543173E2E8CC93BB" + "8F5AF68504B17BBCD314AC39231C7EF5550A5D1D7CDD0853F6A8C87382537AEC31F72174A938" + "077355FE67CF5304074DD4E937EC371CC6DF13F9C4B44215B8DBBC223E311BAE4A86B6D74DDD" + "03C0DE107663387573237052AAE59A27C6A9E7F054348258A34E2845CB57DBC20E81F82FC021" + "491FAA59EED31977CEAB02918CCF20421B82EFA7D4FBFC3BB8C2D7A2EA00126B8FFC5CF101CF" + "8D673D754F093EC421FE4BB35408800C5AFF5D2FEE501D214401AA8CA1173846C4FD43863F74" + "35169EEE35328EBD44D91BAC2CFAB88F0FDE5DEB3978F26BECB0BE6C649FA1E11947FFC28A47" + "0D6E755DDD9204BF03B003D96E7F99B1F43D932926329CAD8BAE0652889502DDAE69E6648186" + "575F79B3FFB6427424F181079D5675E38D122C71EB9AAE782063C90B909B7FF367BEBA986049" + "99E59D6ED02A4452981D746D4E531925326F0BE3667F9DA6F003703F48126EEEAB9DAC389450" + "FFF8A621E17E498D9F434DF593C7A735EE9EFC3C4757CD0D7626C8AF5C532B1DDE5A2B0BBF18" + "70AFC8D8873A214C556008A02E029DFD2EBFD68C00440AB3749FE108DF243CABAF39AC7CE023" + "CE8FFC75920015D17AD0C7770FF7CAF97DD07610813CCC6250355CFBA632DDE6957E24A100FD" + "07E05C10F6FAB4E8851CB146904B0A83F9E558F91669D55283B133AB87319B821EC0F02EECBA" + "DB58549D76231F110F76C76A108B48E7F23ED8CE3B0DFB25CAECB80832BCF99FEAB3B807254B" + "A13BE30DD7B2907384C55BF2842ECFAE2E942AABDF8E31270D4A32CF77A348285BD6BC77724C" + "C5D1F3A30AAAD3969E788107D6BE22B83CC462CEBD6CD649B5D3B3A5769140F149AB36FC5230" + "1C57F0EECF7E650AE871D62F356C595A96E96420CC6FAA0ACEE8997BC147E082433467B70254" + "2A48846573C09DC651E6658613A5C5303B667801E4463F7D7816B973DD2DCF59A76E43FD5832" + "9D91B3BCE04C4C29C549C536C5B478D45E3D85F2D235C37016A982F71B3B685B639D2D1684F4" + "DB61A84EE37B06B2A3B8328939FCBC94FB75A6076E5DDB7D8B942A6449EE38FC4DCC5E0F634B" + "736C63AF1D66D64521026E2DA0F1563C66A0BBF24D477D6E8CD74D57D7F523637DD9088B8B52" + "54A4951B326275AB748CD050DEC1AA12173BCFDE0853C00E06B1ADAD17DB3B785FD1F0976607" + "0CA23488B8655CC1E9DF1D2BB1F9061D6E64575289B3DB5D62D082A0931C2E8800D244B4B486" + "2ED3D1DEA3B248AF4E368D9E3316CEEFC296419EF028BC9755ADE3A1D8348D42A1B5C6A071C0" + "D56836E40577065977A6081240832F74D30775013B60B5581C702B1D6C2A158960DC2E3DAD57" + "49E8A07BCC134A1FBB9B4663CD8B6397A8926E2BDC5E5BA30969691258008BA1C6482A085A35" + "D6DE6C8A575133B5C304FC6EA5C7DCBC19D530E8896229870337487C5FD0F6E6DF45ADAC6B03" + "801E5083DF9EE74242AC1BD850598976AD723266C5492952568E8884DDF636257F5F5597598B" + "B5F715927EE82B31E354782DA3B20425135B35C7AE31B676963783D19D91F8E3BC9132A14E8D" + "F6DDD3B7032D76F949E9FCE48A60EE2A6B06F63B90AC36D9790B45A5CE36D0B6E6C77A0CAB40" + "761D625A7D0DE3D158F16D1B651C951CA1919039EE6C4DCA60D5FE13B72CD79DA5DE74EB40F5" + "F7E3113C00F336E0651D2E430D333C531DC81E75310892A152076F316612083F141EF4C8BB9A" + "82AFB1982134BB4AD4D1B567A35C70BA8533F79BB87F51C060", + "024F15C46FC5E290F8CA2FC9BEC679E2DDD6F694086CCA89F34F33DD0A053CDE440FDA077919" + "2D6E28075E44A824CCEA22FC6FB2C390D09524439C4BB7C1EFF430472ADC449F08E03097279F" + "AE06A4188E1F7DC5C1C1CDB5424C125AEF679A314CAD31A8A0DD8883E6D3BD2D88F376726968" + "1AA1A1D451A0A73496B825F525695E7C361211BB0427DE5B2179B02E127AD70755114E13A6B9" + "59DBD8748FF8DAF5A811E17BA0BB4589395D123F4E36505BEA872EE6F9B61ECCAC7B49DF0A9F" + "608A0A086C2A5FFDE086EC4B41566A5D9CB69C2CB77344CC231F93E77E85246C434D033350A0" + "681B08B0EB728A0E82FAB3C1BA98A4BEE348FCDE54384EFB11876DD78E9B30409521329C855E" + "F2D58A244D10268D62C8116448A3569EF542729909520419B2E3D76DC311BEE43854F67E258E" + "FA4A32BB079ABE82E0A29DAE1A21B02C0A15998165846C4942FDCF93F18866459DDA6872DA73" + "74ACD505A46EC20F7FF4A86C20A0A20DF2A1F725BC6A66F0DB3ECEE9C2AFB414D8E5F8917539" + "2345BA0BBD0F102B5EB63FE25C37B7353ACB90E51155C1D6BC90E81B3D09B4F7C841BB1090D8" + "7CF52D495F483AD259CA0B14570B0AB02D2C9CDD9E23697B96CF8223760A2B196A6518B3CDEE" + "B49064855B670707477DF0E2304AC0EBF3C9D2180E21F24476A9C4185FEF07DBA47384495216" + "13869BEC7E88AE66482A44F5C028ED69313DC0B7E044F67940A17799E59F22A66C2052DED776" + "8F3CC6FB27E8A63E128F47EC4751E4814EC1EA3EB80F993F9076B8A4447E427784907447EB2E" + "757BDD67F584164CAC8F811A5006485D2D872AC8B94A2F59B75F57C113F20CAD55C4D0206F2E" + "EE419D7CAA7188FCC5F159367F28EDACB00D8ED12602DCD4E4F5B24FA611022030DBA95D0E54" + "2AE14C821DDF2904EAE587AF62B66087FEEEE0C70B85A71F5A35A7D4DE1E71F66F5C01FE173C" + "98F1AB17FC5085E54DDE28EE7CBA96E2FCC8FA100916E535379B3B80E8C4BE3B1B703A4A4524" + "96DCABD7B3CB3C3AA33726CF3333DE0F55A1560102A9DD42AABC971EE4D34E5F9214A72FBA45" + "BBE1727DADCC9898E0BBE2F6518AED78978681FB428D4A70EFA6E4CEF7EBEDABFB2D8B5BCED3" + "59457AD85BB9DD49C2072D93A06D1AAA3E98AA154C5DDDA0B5C160AB95B540CF2DFADB77A587" + "EE0088C0DD66E2D41DFBD992F4D1368D1D97682989313DF229D54886634FC3F1E63B22C015B3" + "E43B8EC7DA8C8E78399EEC6E416DB96F71B9D06C70FF4581C3CC28B0C79CC0528B1FB9660235" + "CBC7F8F4EB1019A77E345280CE78C3450CF0E068BFC38D82E763BDA76DA09D8DDE67079C4C56" + "F8DC7709F36A00D13719E3F0FCB19844AAE513EF23246505BA6E2C5B22CBD266F7EE0AD1D9AE" + "C0C4401DF8697BB6D7ED3CC0AB6A7541A0EB416EEE8CAA15465F15562D81726D3810E4AEE776" + "86D7A8A6B2DCF6B46D37F56DF5FBDCC9D97DC394AC50B7E0587A47ADD4629BD1F741C6464CED" + "6F93A1F768977D394A127E9CB2C9DE3A4F5550AEE550201AA16ABC1EF3333CD93B31570F34F3" + "7AF54EDA4928949703B6371F48C5C077367B2B29DA240217C4CFD1DA574F9DC51EECA9E8428F" + "FA3563C64F3A1FE00EBD9BE39E1ECAF96B16BE39687438C1DDDFF8419B51BD7869D5C8253EEE" + "104CA1D50A9C2EA576C3011022197C936BC9CACED01922DC6C034D6DC53F9B26A3E8CFC66395" + "4FAE609DDD3D8102C8EAAD4C13F220FABEBB66BD14A744D5386D2E84980296207C4D4C9A086B" + "F9AEF7AB9D35F88B82487B909F8889475B827F267C075F15E0", + "A3465A40F1973C941798F74A4F242E922982668A163DE532A19786C6E9918771E7C401E440E7" + "3B9C491780393E71F52C0366EE08846A3A9268272ADA0A22BF2738E7720D4F15D15D879982E9" + "C3AC057FD862D828F8C02E659B53E08C30B8F85C4B0EBB6288D7407B4AEA54CF0CCDE9949D41" + "6804959159443A54CF401BE2014663086E6F5BEA3895B2C9F667E26B3F19CDE6D3EEBEF8C1D1" + "FA9EDEF3A237E091D01BAB02DDAF29FAE4B2CDB1CF092C275CF11D2F822FE2342F17933EB07B" + "B40B3C9763CCE557CCA8CBA689EA2291049EB434C58616E20F15F86B225DD17A739DCB6041C9" + "5CD0C18DC3D653B5E3C2117295108DB4EBEFBF5886648FCE8C92A343E41F3AF6C888904B2A22" + "A69048889B7AE7C13E162A498B9F893308D7EFBEB96D88454A74421E3D6E535E1D8C1859D49C" + "10369DCE72F45DD226B0FD47823B430D19616BC9044A22BC8B2E98A99F55399E3749E6816EF0" + "6BE64F47A1623FA20FA5C479D721A4879C6D9A693AFCA7ADDA06AEC05C483F622E7BDBCAFC5C" + "18FBEBBE5B3D9CC7E6B23F337C9A6D48E2BED7B3B0863314023EC0179952E114D44D4900B415" + "C94CBD99879952BA96F017588A36EB8691D0F8E861883E56CD33A018F8A0DA30DFF501AE1CBA" + "0CCF0DD45D4795827738E727EA2282DAA720B24AE2B10883BB3601A57C73E4E00F4491CEE738" + "113C011F3C770C4CBB1B0F4C2A653DE3428B320CA24BA127929778CF4149E74C7812D3162ED4" + "7FC7BE42A1A99C62896EF920155FDD64FD756A5A6946A3846B7B2AB3BC0CE5D4EBB6488B4E45" + "C4D0844158336BCA1A29C89E88E63D557BD894067828E3C161BFE3D544A673652E942E6E3D49" + "58ECCECBC9D71F4EFBF2A365192D456B719E8E0747E12BDA63341F9AEDD866CC974E35B0802C" + "31AD41CBDEA9A3DCD302D78B50154330AB63702FE05E212D5F766E3114FA947715E153D99AAE" + "D2C04B1F6FD054205033B12454C92832A8864F6D0B196F0080BCF9F48EF5B6398E1BFB304CE9" + "1B93BEA20589E10AF7B48C3CD47814CC0B3FC369B1CED910D25C696263BDC2B98307E6CE96A7" + "718472451FDB919EAEF17E976CEAC1F92B040ABD965EEECA42FEFCC7C63B4192D3D261CE4390" + "8EB3899E77B5476E460967304045DC2D0C4680A3ADD6E895C28B5EFF85B926F0599B244DF409" + "A2D3C96E6BBD196CD7EF9FD4909F44B964A80B6E5F5186CB99A274DC1F7F0B98E69B967E811E" + "8BFBA35FFF07DA92F83E26DA98D7D7357187F973D263C416D73F34CDD077EE5A77EE0BB32CFC" + "EB6823C64BCE9FE18EACEBEB195B647C1F495BE0FFFAC5DFD178817E69D96719D0FEF83B2E45" + "99D3618AFA76D015269D22F9092BF9F7EB3698BDD67693CB45902FB224D99A0F649DA1FF7AD1" + "43A9176BB5C5016230B43BA2020CE6906276E2ADEE7991CD7109C273864BCB4982DC63E33F7F" + "4253777A69BD5020D49F835736E97E8F757989DBF8A24E218EE5697367E0C19D43BDC646963A" + "4B089B738D96C3FCD033281E2B3C312DEF508791A0457DC9D897320CDFD8719C6DAF712F9F3D" + "0100F698D0B6F261154C14932A248DCC0A042A0BF6F8D2034B75599BCA87A8EE295F288C766E" + "FAB4847A07F40EC6D50CC2A80AD1EB40CB3BC5957BD382B58C34010DAC72E933661BB759F82C" + "C65BD487E2E071798ED6A2B498AEC54FDF72F8EB93D373371A92BC76742974A6CE6522ABC7FD" + "8683C7141E60291BDEAABC67117913945853D6CC1A82210B23A272D1126DD72BA7303DCD54DE" + "D621C562965A56AEBF26BBFAA8049F769146399585427DE3FC", + "F755ECA6372C9E3295E113A01935FF7D33A755E114041857490D6FAED0D00E2F862B35E7B497" + "3B34FA4A08147F353E448C86049A6F5F93143C49BFDF8E0CE6274941843D55285123A431EFB1" + "F03E1B796FA6796FE51191186C2A7FEF65906F650BA396D0AF6BA187AAA49533B8B4750D9FDD" + "16AC06D57F41A019C1E186083BD42B2CEC067184B4332ABB23B653F5301E9CE045804DC03DEB" + "DAF549A9828932EAF38DB16FDCBCBD3507D92D4A1C5246D2E16015744C0F88C9AC18F66AD703" + "EDC96507CAD73E25C0A2A4BA3656506374BFB28B7F1B9914708A058C8C1B23AA4D60A54575E4" + "7FA6261A55C47F472E8F1C30800A35BE7025E8399C2C802156C19C593826F081D78ADD8DFA22" + "968C7CE1CA39E8E0A35CFEC5995F90EFD47603F70174ED228C85CF8AFDDB273E726DDFA8F9D0" + "98A25B974077E03715FB84FD4CD1BF9D62838BCE29C39F18B4A22FD8DDA8F5C087B20E4D1CC1" + "B542009A1CCE0BD2073ED62800861C78BA717F11D52C3232FF13D7515283592AE26C1898D028" + "87144CEC7F68A6FE97630535362E92A281D23E75A9F05349DBE075AB378C1AC988F819175403" + "43A5B1251C295A4DF0565E9E9DFB46D8E7ABA648A0CAC957ADEBDE01D900D1039CBC0657E536" + "E26EAA661690C7301B9A6A15EE0830C3C1CC02C17F55B01AB45DFCD857168EE65492AAF0C2EB" + "7A85B4E2E8537B04D37BFF2A1B0C44C453FB4F32FB4F6C3E07C6FBC612E2450A555E10C14972" + "339838FDFEC91E1464FD7B2C903098913E567F1408292F966E7496F3D66A30FA380585BAFB58" + "49750C101443D572E65F7FD64C02E443D4A63C9A76329BD577EE18B075A5189E09C5D3379834" + "F1D4FAFB06A7917B474962122DF47DA7A9F45A1C0CB27021D444D24C39272C7FB17B8FBB99C2" + "72401393F8BFF3C22C0E50B86F973E0575865FF60E15ABB834430B410BEE93A74CC3076B6DF4" + "DA9D39D09EDB214860D856A2F4942678B746E1F3D706C7FA6A211B268BEC5C82A54C5A94E6C3" + "AB3AD4A3230EEA20A1B5027F1964D7A3679DD5B79EAC9CFBB0A35860AFE1AC5FB119F50EEA7D" + "05DB63E9DA2FEF5B73FADAE8B57F155F1156411CE47137353155CC652824108435E9581AC72C" + "B2E916C2536DB57F90A536EBBA26C381DDB2E9370ADBDFE302EEE399684D5B0F21AE4857B2DD" + "61CDE821D86596F59CF5CE00BB23E665F49FB8DD9DA9909FCCC6EAFC2DD3D8B804B1005BF8C6" + "3AD2EA87A544E6FD1A9B0CCC4FA2FF3BD5B3C2C2CF02FCCE0BDA97F11411E9D91CA14E1C0B61" + "4BFE82DC9416006B61FD73FC605DCDE997A8B20241F497043A59A5C20E92F82404D15E997B3B" + "A063FCEBF86D60068293B417FD286D0387285389B9788288FE95BD0733F40F34343CDABDCFF4" + "5F23330D958BF6722A5E1574B5C631FDA008D201D1BCBB43F576333F90995B9BB1DF92FA667C" + "4DD0073AF39AF69A61B8417B387BB4DEA127584F0DAB21699C77740C7FBDB50EC974DBB81C36" + "45DD76CA509FEADB6CA4368974D34E3581A97AC21082414A633AA8CACEC8E2738826A88FAA8F" + "EAD175B5FCEDAF7F45B97C6DBA0BE5770AF988DFA3587F5061AC50DDF393579EDABB9E6C5EB2" + "698FE40AD85045770C4C52B5CD5C367295A32A5413A37D164D884565FE360EBCF8762ED1E642" + "92F456A1B061284DB790B9CB95B2FB6D6E0C332E5C977D082D0C22C1DD5A8706FFA61AEA07CE" + "9F61D0A703443CFFD1FC9C8024E4399DDF1DE8DFE34E49C324B222B840E4D30385A2F95E5BE2" + "FB4484692E2DE89E560DF5F2B8F2C19ECCBA3907918A5AE0D0", + "8311C4051C3D66127CFC6768A4B51FD07649A97988CB519BDF36014BBF83E9DA485280A3BF91" + "FA38C426B9C90B80ADA9F76940036FFC5C1A70941F529307B5FEC215D27140717E1F6CA7BD1B" + "953AA85C84D8D0B88EA37EA122D3EC9A873FF2EF9417F1C75462038FD88B85BBDD611E0EDC86" + "22B4570928DE4E7A5F8CF5D43F298A452391962B588AB9917E09571B7A7D42904D7393E553B0" + "F57588C03E12599CAEA8F874D71CE30B466D3EBBDF8864BA1568C454C8A447F7B883BF43C65D" + "6249AB4C71FD03CB2C394D9215EC4CEFF4F4B4386D2AC384D19062ECCE9A9B278DDBA59F4EEC" + "E4F1336AEE57D819D0B14C775335E3900CC4E17CA4E1C3C10FCE9FD7563EDBDDD816C67CA939" + "EC6A186078FE00C6955DBA9ECEDF44DA7217F4939A53476344BD552F6FFFB357CAAE86321165" + "77B3711C5688AFE57A1DB527AB32026C6FD19569507561DA9427B96E0C41CDBE0260473846D6" + "EE0803847C945AE4D1EB9B0A15964DB87E7A953AB4AF732DF6626D0AA5EA7B1C8A0008A9AC85" + "ADA39367364E2DAD09ACA8800289C6F2BD2A85B2337DA677A96AE54AF3F0ED934D4286CEBC59" + "3AD149F10E0083BB5B10E7103203ED9C1183B4EF214ADC357054B54C5FB1B20266AF256DC2F5" + "3FA88B51C4766F753442630BAA9F566FFFB7A555E916371652CE497F4272D917DB9BCAEDD54B" + "1803F8F030C2B1BCE4A9F31B40DDDEDBE3575FCB9F841E1C3929F43919804E3D66577194685C" + "C0DF53BAB6647939BB97CD2EDD8F26CACB99BA304C590E1AA5B0E169797FB991BD424D94E1A6" + "9E05FC7196AC9235D31E17EE08EF7F1128995118B542E9308FDEEBE5B3168639C75970F8ABA9" + "CCD243A0188D75786E553E4E75904A15F2F6C75483F44CEA88D6A34C4E25128CA7E15D798FD2" + "F393D8A487516A2309DB83C435DEED0E88DF8E0231571C7F414FBA7FE70AC9BE5A242BF62B88" + "E858D909D0AAE54EC5EF29B7C3F47014725D421BFD6F064A57C14872C1D1FFB60014B77CADA8" + "0E849CEB2118E2FC4FEE280A5092DCBE0FEE940367DECC56988CF4AC93705FC56928B731F9F2" + "4335E1C5011C4609B9ADEF3C33A833FE26AFAB1793E35D09052CDFCCF26083554A2F7AAE9520" + "11ECC802620A0300AB87ACEF84E549B0181B56E80E9181AFB56B84526CD3C919ACD290BA36C1" + "DA604EDBE8191C6A4A1E55274E3584C1F86CF69CF43CC1BA3EF8359A0B6DF4CC95C4940F7B1F" + "ECAF7BF29F8693768D03196871A6EE72AEFAB9E7FEEBBEA8630E61C07741673303BA3F8C4B05" + "1251B97F08FEB5525F3E5A3CAB8F840951AD92E9ED6A741BD2EA5144679049F89369CDD689EB" + "31714F83B422B004F76B0518B14033BE2A21DA628264AFF707B141729A9517079E824EE9D0B6" + "2AC592C5282083626DF662C38CEBBCC6553F0E79423F2F6F1CF79D5F3242524439ACC78241E3" + "359C224A424CFAB9EF38F6F4FC429E70FCAA633DD731C3466FB646C10414A349A3546D0B9772" + "4179E0E8A9594E828DE0EFF52641465B84547DCC028D18A0D6EF200D442DC1F28E8CD7916BB3" + "96C91F9209E6228A574BD82E56B79749B58A9021F1D53C5A7CFA4AAD7F10FE9D8A48A0D231FC" + "5DC0CCE682EE038670C6157DD77FE79D5F754E77658E1698C0B16EC961F94FDEF537F8DEF029" + "23A9332FB6D059AC1F7C5D833C2F396F361F8321AC72E4AA785256389817DB72065B836C5D09" + "4B359893CB364A21D6ADF5818970176AD8180D92A721F735E1D500C050464013378804A9755E" + "F452AAC1064F33FB34A090BAC7C9E8D5F5647FCC15CC3CF7B4", + "C2A7A3209B8BF5FE643BEC789791A86E40A3EC6C6DF017DABCDEE6F9E31730104B8319F0E1C9" + "BC460031E094D43C7B0207EBA898162715E3FB6E90F96E4763C852C8031A7B5DD6C392A0E380" + "AE05BB24A25B66DA10BA14F8B437FF96045DAA9A96195D7D6E9EA200A0367B51D888C051E9C5" + "84C12732D563BFF8FADC192BA56DD3148099DC743A012237FFC35515B0D6A44EC97E35E3DAB5" + "E516ADB0E96F54B8B6E41AFBCB9FF2174B8D47661BD95F13A45E771D998FD27BE4154746CA38" + "7ADD89CA8273896FCDCDE14347A735FCBF942E02874F415F76346898BFB368C9B8122E25D4D9" + "1183336D9303D2C5ACCCEDF95EB086CE94E34185E8BAAA88139D56BFE087C0A878B1D71E8753" + "7A2D4B2CC20A1E6A145E86FB5EEC51A29F059CFDA697D8C38D2AAC586C282761A7FEE8DB5151" + "834B6217B646B4B9CF69F9AD85FB91F4C6BE204D583EC1F6C3F5CE249B2DF20B76EC4DAAB1EC" + "D9D0679799ED9B511AC8BD40AF44D622B66DE67A7982E6CDE3556C8DDBB413ED36491CEBF0DB" + "E0DF06AC811F58CBE277E86D67E5BCE74B589B7A11B4B062A2B6C5DFF961B9050D868D552C70" + "C6FA596FCE683E51628DDEB7D85E8A159E1410CD34AD17B2B85E3AE3478540F841FF5AAE7204" + "555745E860B1CA5CD8435EA7EDCCCD68D2F0326DB3306226CAE91D120764C5B37F46458B1BBE" + "A0BCB8501D0A7F4FEB3978B0A1ECECFDA4739014E46ED78714D8B8AA09F792FC666E3B9E8972" + "3EA6F619B8AC74BA13FE74F7D609DB474ABDA5C36D5A29EB56F1EB1FA4DC895AC36A2AB0FFFB" + "1120170B8EE6404A32EDA975260ED7C7FF71AAD33920C868E5E280C446E2B79B0140115E5DAF" + "AEA61A56556E881A7FFB0B47CA174216D9B6914937681D4071C15270DAEEB7963004D284F1B8" + "9DA7C25DB7F1EA391A064575F810378F0ACA41E300188F64E1C3E6307482033A31E7D9DECF56" + "FA03ED8D8DF1409D85627A478DF7099FEBF47641317950F3D14B042B7E620DE9FC29CF7EAC63" + "4033F2F287B92BCB274AA0E708571C690AD47A9C8CAD8840A619222C8909B1DB51101E6DDDD4" + "8709121539DA336995A2FC5E50205201C2D25143C7FF54D750C377C023FCA3B6F6A0AFCD5785" + "8DF0029A8FF1B2EEE600C7C93912C1D620C9F64B4D3C0B147558E7A33E12118DAB9D2D139E5F" + "AA37CB32903AFCE8DCF2BDC8068CFCCDAD549FC5AC8B7465D78730759701337621DEFF1E656D" + "4A836E360457A7E092112B9D5A250374EE6A6AEC845C21DED01E9AB872F76C4D35A6D882AD92" + "52FABD939EF8163323975DC2ED844AA6A0EDBFA9849DB924C458FE3D94E1B0C76183B2D9A90E" + "A253F023F8C4CF26FB0D76A10D6171E80A2244BCE5D85D34A1491BD2A3E1E996F8BD469E5690" + "BA71407221FFFC22701472E84B53CB15E8FB4CBC3E2A5EC4942965D0DD39E9122280BC743584" + "2B7586FB279918FE207E522B84ACDA6E0C37186C394DE3F8D11924EDC90CAFEDB82B2A910DBA" + "1DD74E266340FBCE4DEAFA524DAA08DB2D6591B77A70EACBC05BDC21D109BAB2B3B9760522D5" + "CEA442483F2F510363B60A95B533C7FBDC237664074D70670F5D317689AD1FC955AD99F98B00" + "9DEA79D8B9FAE04A669F62AFD3CE45A5CEAD8C4243E62F38D5714681E596937C98235C1A44E4" + "9F18033BBA6C7F8ACA007D8D0F559FA82B7B6E29FE201F7618575957FF1E14525A1C02502053" + "D1FA2D4CB662DCE5424487095DDDB3C04456DC6C8489A224C328108DA989CAF15A84B1C75087" + "382A97269EA4EF0A7A7E601631ABF79CA1FCBD8233F6A10694", + "62A4232B79EAA9B61585690CD469E04F489D727128B710CB43D5DD6F2B4DF9D313B9A63BA71C" + "D0C0B0CFDEE05413CC121CDA9178ACE13C41C48BF629FBACD26057283ABF80708837A83128CC" + "68126C5DBEBF9E5664C58631519AE43A63A4B7CF000E5D362BAA25C1E5707B649C918B65B56E" + "7DEF16C7C9967FD28D55352EEF467E75E46CD4E96BE854784E8A47DBD400F2DB179E7009AB2D" + "9DA70293B6DFE9D724A3D745D800722081E33608CCC427CAA21493B6CE35C255EB68691BE4FD" + "4DFB0E244ABD7ED9279A060B97A66AA765CC74C1BBDCA98B1294E705396B22CDE325900D4D3A" + "CED192FDDE7B7B6C738EF90316DEC2BA303C547360A03766A1BCF2D9EECB47A4212F169BBCDA" + "79EC2B376028367151E062EA1BDB4604FB8E71B6F6F3DDFA4C5B9AE595804D263D9A26B4E507" + "394A468CA9DEEC19719D372AB32F4E8302CF24DBF5EA912386FD95F93EC4B0B6BD521D639B6E" + "49422A9F21199883663C08227000DD175E29275CBFDB6E4A072DCDA6AC8073CF46DA78015EDF" + "128B90F150BEB4B959B13D73F317BBA565558A5FF34C9F1B47BDF3B56D368C49C936F0753C1D" + "22AEA365D380079F692E32E13ACC54630D193353CFEBEDD1B240B198A460AF6088700FEAE0A7" + "503259AEFCA37E891C11E439A8F44AD9C2419E41503BDF98681859C72EE32CEE065CFD96A7B5" + "DD5E16984768A47275C897903CB15984B50D436CAABCF6A6212A364D84B4B7B59E05A1AC889E" + "FC3D149520C8029E48FB40BA79FCEE80A313E1609C54B5E4151C17AEBA7186D02FD813FC3EDD" + "A4319005A7AB0B7B933DD55510B7BF6A847C3C85319081758791661FBCE79134BB20C74AACEE" + "5E7B2534B0709B23C91019F3D013087E2CC90FBD8205691AFDB7675F4AF17219FA9A960FA4EC" + "D79A0E4ACFB4FD7796AAFC6843C9C8250BA7C588C70B6FE435D39A9E0547F19F061B5DA70712" + "868C25C592BC503F39E6D07736128422C12936F8A5B61E5441D7E36C41F093C38D7BC42D054B" + "478B99923FD2C98161DF91A5357C88BD99771F758DF649FFE15E1C2D06DEC4C0CF1E4E0FFDA5" + "AC328B0E23B28D321E87D10C7347AE5788626650057E171D5C6CA42AFE314ECD515286EB3712" + "DEB87D76BBD4A2EBF79EC0F2AB36C4ABD0241CA4401ED51A5157467550B191581EC8738C1986" + "E7367775B203421A61B933B889697683C7BF83591D8E6AC17F76A471F389FB0B2A70B374F723" + "ECF56D9927F306FD5E73F7B0265406007C3798831BB58A6CF317A5E8CF3651ADD8C119EC3E00" + "602A640DEFCE7ABF60CFE499B6AF37C4EF2ECD0E54D0DF91CF8E256EFE835671B89AC1FDE3C1" + "6E96911DCC9D865842C04DAEEE6CE7619831CE13781A898D0AAE62EA8A58AB78022538240BD5" + "236CD54F0379EFD7452BDD6EBE1D7B48ECD7614A8AB3728C7F5425363AB8E87EA00A664611EA" + "75E2CE308BE1784CB14DC470D14C35A5BFF07278F303237B60B4387A87FF926FB1AEF8EE99BD" + "113EACA589FB8681934BFC4999D1E2D2A0B423DEB1C3C90F8236C7EB822A786DA51F6C948344" + "21486CEE0B679CFC0A3D49A3A4316148E0E5BAD860F98FE2A07959CBAC27F6D0E311A3E5D0A4" + "1393C2163F5569EEBF2DF3527059EB3725F069595F984E8F52FAE6EDBF5896A041BDF093347E" + "10C80BCF980893C4D90E0D2CA4DE7A773552E304DD2C89E73DF86689E1AE81098CA13C3E2156" + "FDED08AAABBCC9DED0D5E5A0098C25BB7C3FC81BF40B618E5D75E838A827AD2A390687C8C501" + "773F9E5D02DF1279401304A928BC3F79113585A079ADED2D20", + "19BFE37DB2DE71183068A7CDD456009B434C7CA293938B49AD58C69718F5EEE0ACC7DB9A3CFF" + "DFDC8C6E59A0C089081D3567E399BAE933336F580AE20B123E457608C319E47D5518302D5BCC" + "9996EBB00B0795FDF6D4D2A7B02B05BD850AFB8C2B4CE810B8F7E6AFDEB605521FA90D98730B" + "8DF04EBB1E08EA297F8A4743BBB50C8D639A2EC5EB24AA431D5B7FD783D3A7CFE97A5B0AD7B7" + "768C8F69C071F6CB7657F21E98E08B012BAAEE970BD3B8151A7082D50A74AFB9B5A581F7ACDA" + "1C8422A4BF45C0144F00CE2616AA3F1CB0D480988717862F105EA862FA8EC70E9728DB332416" + "D4F9C4E2B2B0EB971349ECAF7AE59BAEB03550858A1ECA46438AD8DE1A99753562897DB4963C" + "90B6367627F90F55F48026D00E57E5887405E8319162BE606DB4D177A93DABB589E41FB6EA1D" + "A7981E1357AA83BD4932CA99A34A97630727B9049D438334B183110C6059A205284FB419B9D6" + "2B92732368AA59070C5F1433FB1F7114EB9DC2DE69D0B554C5ECAE13FA21301AFFBB88C1D466" + "FAE07047CB22C262FFE8C8689A7C41C0EBECC570623BBFEB01908BF90EA6F46555A172CF6877" + "3AE511DF1BF9851F461C134AA2D899C93A8D73B305BE429408B340C6111831A59838572413BC" + "9C18DD2A58B32A699257B82ABD590F033CB70AEDBF04F235BAB792BDD165B6C0CFA8D13182F4" + "05C234FD4E016C8025F55E13FC8DCD8DA1278D25B7D228D595D32B0F636A384C4A6F0A342155" + "81AEBB34EBDEA6F2591D3AE1A9A8E473E56D04999B629D2E1C6E2BE8C2AF411E8C3D1C232025" + "61A71F8AAD0C8E601E4500745FA4A884270B66BDF034B5B3BEA5CA156821CB1503B97A1D2EEA" + "BA901A20E32F09FD4DDA6DF1C072DE262DDDBD6A1B4BD2FE7CB9783D7FDB57184AA49AF46E8B" + "38D62615BBB85C4A3FD28AE20F1BAE41F63A19C33612BF09540DAF7EACFDE3A102E65A863BEA" + "1437B41A81BCA9656DF7F53C1A01BAED33267B5681831557C4F318620DD44F891A08EA035ED9" + "9992EBB338FCD59702122060B34EC6277F7FE78B3B7C66A0EEF5E31D2C6356B25A393928A7C6" + "585B200D45767CA2C18311CF69B7D8FFB302DDD6CB4DA034A9E3D72B647808553427161DC79A" + "72D6CE19BF4C56EE6396EEE9BED8A31E56E0AC995D5F31FD3EB717D55F10B7F4C1E9499E5DA8" + "D56D148F83DF228C76CFD6893C3C355A150C63975B21C5B5018CDD9DE4D9761EB29866DD4B80" + "DEAFC19005560F7D90E9346B1AED2570154E0623CA515F70C51800D01F1AB36081775A4E4E82" + "ABFC4CD08BA0C22D286B0CD810616EC3FBA3006AF4A0911FFBDFF750AD202C5E95B2DD6E4BA1" + "80E9D890F3730109B8DB7D0A789C8788D19AAC5EFBA8AB3BCF53F78711ED88FBE754BD7F07CC" + "FF89C05B2B0194C3A04DC25321CD8BE9F889FD7D66B468FD1E78D27B639B622262C55A7E2DE0" + "8B77B4B7BB441ED1F96A8D19111B671B792C79E2FC58B59AFAFE447E5F46CE13290EC8170CA6" + "0353680E47FCCF83FAF4AB9F7C46DE2387BF2BCF7354577DE8D5662C4784E47940FB6C764203" + "3B3C246E5C061749DAED36A5E8D012D42BBFEF7FE22414BD5803177F0DDA18206CC35852D10C" + "17442CC8FF5505C9C96BBA041B3563E02C00628C3BEA294F1181CAA03A92DD6358B25C26FBC1" + "AA80260FD5EC074AED986535E1BA6C9EE6ECC602B68E136BA718C2A16AB0F0F245AFCDB8C513" + "EF07C4A2DAAC56E9E64A5E0CBFB423EAAFA3B5F2FE33EAEA64D41DA9E3146DF65DDDA719DDA8" + "CBF661CDAD39678EE1A390B2A840789B53AF1E54B016CB4DAC", + "85FBB403EA3B8CD7936543C23863C5DB5D1C2E4DB320EA8E2DA415CFD59381A6EA26497F2A4A" + "06D862E3CE2C5F75685FCCFD6698D9CA6A025B3EB51C67357AB1B9EB2397253B80620C43D892" + "6C0D9CC6BB9914B7CFFD0BADF04F296411B9AC6BE4C18B0007BA4309388AF247B5E9C13A51BC" + "21677A33EE199D67CE2CCFC04B44042CCB42B9FECC3CF58D6EF3F17CBD7624D62B7E37E3BECC" + "357A9146EB9AD285A60437E83FA55C7F3E530F620C4FC588423BC2F57D3CB568DCA6C7FD9FD0" + "073E26044B1B0C7849E411D8F4B6E2F00F10ABDCAD7E37003C610773FAB97DECB7C5E0E68817" + "90479E50214EA8072362BC686C76CDDB975D0C465F6518096B9E29AD7CA895AC454598DA78BE" + "F807A46414D86BC042819F2AEDD02B95D53B3EBC0553888AC22D837E8E9A80ED281AA53548C3" + "36EC93C9376CC312ACA55814B70159717EC1B4435111CAA03D7CDCABA9D40BB754F9814203D6" + "1B282625E01F7D1E5B19A2A235A9153EB59479D69018A6FA6230BAE9DBB36E36163D46C4E015" + "72840A79E209E8116707A3ED37BE9D5FCEE0863C00EC7EB53BD508F00F476D2F1B8827921E30" + "D8D220643CE00BF9BFE3653B16AD3CBEAF43DC4211A3F23046F0CA7CFE3AA5FC17EC2065A14B" + "59D762895EAC337DC7EC7ED46B246EBD3E8FCF76B1AF3C337F9D42D3342022D203F33473E6B9" + "9877CC5EE6843D8A5C8397ADE24F511C90C25DE000D18327D6359D882694F20FB5D0BFF3ED28" + "99DD6339B036491BC2304601DCA4E9C4D79D8D5EACE638AD7CDA4056539B1966BF33FA16AEFA" + "3473C7461B605254FE9264576581C9ABF3A825B4715704CDB27438BADBA3C61C43C2A6C9EB31" + "DC57C02DDFA11EC9AAB0D139210DD93296C17486CBBA16624A34030EA244A42EAC0AA1E06842" + "3A154D1E1A049D347F3B73DB9312852E5C951AF4A87B83FB483F9E637BA0F8B98DB87B44DD5E" + "E1AC8D6C46C329109E34862CB2E9C3DCF279E0229EA37C8CF608819AEB5B3D99F21A8D48FB2F" + "C109A848D9AE013BE18D5917E85D4543515BC8A223300F78F36CE5F89508D269EB6E4B958964" + "4F24E4012F8F7184068D8CEA91D343460BE089B3B3E9E91B82471048CE82C0B09967F0169FA3" + "9B45FAE26552A8376F53C96BADACB4081D73CEEAF2DF7479ADB66EDB42EF7BF155C081D1EEC9" + "6872570E1D077DBECF0777CFEFCB8015FD7C66515107DD5DE115F5D2F2DB3EDB2ABD53A121CD" + "A0B59D506F5370D49029D3D3FA8CDF741734928CB75E2DB7533213774B9102FFAEEB809E87C3" + "ED96B73AC359FFF0BB9B6A6188949F9720BC3FB9ACA0DDCF483B4D03FAC019B155C800E00275" + "51B3006BF8165B825E7760A6B3BF87A09D3F252230CADB3BA1FFF3586B9DAD36F87C2F203AEE" + "BFE8113A5DD909995DB68F5DA629259D05DF662BF97972812561D95EC15735A0B67090B957AA" + "9B6F9B69E975F510F7577C11514CC7D7F5003A7EFE7DDC1E6FB7DC170E1D49C2D26EF1702075" + "51FBDEE85B6ECDB6B3C5DF69EAEE79D70205A6B6BAD2795EDD82A954C8EBF45B38BF2D01FCD3" + "21A0682E62411C483B12F2F9B9B220FA0C5859712AE6362C0431DE3E9004E49E44D2353A4EDA" + "F2C9621523F4E6D9E3DE019888A27B5158545742FD135630FB900EB36242B2107E9BE2562B09" + "F3379B5AEB30220DE627D8AF2880F3C9E77872E9A68C258F2112986C46D626B0EF57645BC3B6" + "33A3E0BBD8CF3F825BF83BC2A5EB15274E9429193B79DB9FC597240B0F16550B8842C0F0AA06" + "AE84A448AE18058A48CD0BBA6C25D06D29937610939161AAB0", + "41002B20E6D1D09E3EFCA7C84F6449B227342B8CE28446696EE046DEA729C85AE2B0939F3373" + "FA757CE40BB4E4305479A9A893EEE73DB7C94EF359145DB09A4144BE8ECC4BA133EB9C6DEE12" + "32620FCCB40E7F968779A24E0841A67E1E34685149CAA3D525F2228978735F751B8B503D14B8" + "96D6045F47F3506BB25A89546E240298A606C7236CC5EBE221EA5F40CED5828B9E1FAA3B9843" + "2C18DF2221AAE2E29D601ECD5A8F589E3D6A181992BAA6C88AB67032A6DA021246C4C322A72C" + "BF525A675EADD0CACFA8E21F372F42375F26FD5DC8C467682951B1692124F95AA92C292B3182" + "D10BDA607BC2267262F9F5D81FE0088F3F6F31174D2C53785381BAABFCEB753D39FEE2267ABD" + "6E250C32527CB11D9A02A161D04819BE73792DDF7693D9CFB3024170D0A80B3711E7C9498614" + "8ED7ABCC88EFF39795DAE7FAABB03943D946965D119EDF9E2200FF0375F3E8C9CC887BC0CB7A" + "1168319A928692AB53E49092D1B15282DCC4627757EC9F5D885E9D9F08E2BE6A6176AF5CCB49" + "5FA69CA898646C49080B6CA981CDAA226CABA933030AD78F235E2B566F00D728E8EAB0889F63" + "0698433B8ABF0F3A28356E605F4AF088FAF466D89C6C0CA328048EC5522B49BAC159FC5F440D" + "6D23A517815A3B15DF59C3D22889F49578AA725142C58F0FCCB0420E48B3DC2D3FCE05A67E08" + "C9890EF6C73AF990BA466E2FA4504B21B7451359EE527DB79CEEF922B2B3C54184E5BA04E7D5" + "CBF9D99F3921A8EB42729CAF6C40EED2CC4428E63A859C89B244DE427CA7EF8F21716CE09A80" + "1059C375EFB0CF56D9223C3437541D241076421344302545C9B1FF09A709859E5DE659B3F3D6" + "3FDCC6233512F681981DF069A9D322C9EA2A161E5ED10354CE9B9969948C20F9EB3A1907873E" + "4FD6F3048ED29D221A11BCFD99CBDBA4A70EBD23F8646458236963E66543F214BC3BC82BDBF9" + "F6C7428EC5C4B817C9E8ED36BBA275D683055AB40BC972B0AB1EC30E983A2F4C253536C7E116" + "42C8422341B850FFBA205CC0D2FBEDB3B74F20CD082DD6005F6C02B68A2EADDD55758C48C664" + "351DC5BA9C7414D9180E9FCF1EC6723DF4EE6600D73C8F4BF774EED66D92F47B950B2E15CBBA" + "60EADBFE05D9D5C77941543F3FE4F9A7EF31EBB691347AF5F3F0FB888893CDA60327D8EAC39B" + "9074477C33DDF18AD34BF64A2A98E2A6D97D38B13CAD7BF61B2AC93971D4FC117953E554A1E2" + "3E65CBBF305A14EE77CF6A55EC03B7292DB14A82DD13D689C4C3C61C1B19F5007EA024B5F9E8" + "6DA8E978E82A27CFD5A1B8F3191862633C7616AFCF91505C7A5C56D85E7EB49015F802BE6360" + "E18F0C8E45AF22ED054A36D253B700DEA95BCFB9DCA16833F74E99F11E14AA9F2A7A20FCAE3A" + "724D5361BF7AD4F23472FA6D951C655149BF4B2D463EEF30FB88B827670D5C6F930196CF2444" + "477C3F3EBD78B225B75E33DF967C9FF3F0AA0A7B8EAE6E81FF6D5C19774EA1D342A778BD26D9" + "ADDCBBBF4BC4F3AC0199DCBEF1398DE3CFE5C0626CA0B8E5768EE2B0998C48C6BAAAEED5D145" + "B500DBE801AED042CC13CBB736DF7D2C0CE81177FC28760B11084D09A21F8DB2B290CBD17065" + "C30DE354353A4F40B56A8305AEB91775B2DC5E4FA0748E8DC50B8DBE7F6F504F70F4A13F0A99" + "9F1A5B106898987F12F5C394976F4E66FCF6216112E52DC4833DAFC9F3878261735E7C10C4A6" + "5A6765CCAB022DE9E1A1515E4D132E56583EE06605BD22B3118CEFF1AF3F36699EE9E6864396" + "43FE364E8A90308B2109B82092E0ABB0B0F1126DABCC37DEB8", + "481E434FB7E6A3514644D0F273DB00CCCCA3DF8F2CF26642BE4B3E62ABD7CAEED0B618D750BD" + "311E8E3302AF4F253351BADF0B4729FB61A7D4B96DFFC316F2EC9EE46996F61E97B752C24721" + "C5339965137D27ACBC211DC1DF089B7B1889483EEE241B792C41F7DEBBBF40E5C794904BAD70" + "EA231865F2274771AE9D1791B95906057359AE709158E32FA55E402D3304028972674F380A31" + "E0AB52B54E9504C5960EDD869BE4B6DEC37A61A336C8F72B301E13C315E3992FD794E9DA3713" + "05F00176F7565F324E125D576E995F141E3D749144F62C10BFD909DC224655935B23065380CD" + "9F605CA80D7290C8B1028DF1CDB4D95814F6765D1DE5832743CAEE57DB1E36B3A2C53CF88439" + "9679FD7E84DF0AC6B623BD90B155CC3358989E6173F3B7EB030EEB2A9C20FC40F5A76F5BF6B7" + "FB12D01B1BC8DAC2E8030F00B45B52DB4A76D5FFBFB282157935186E9644F8BE66200D36EB28" + "DF99D411340661D1AC9F774B870E9777C9AC5C330164415CCFD8A6BB65802333E8F9134BB0C5" + "64F5420A6FEFFD5B7296DA56D168078600BA1AD89EC6C05A46FF6B7ED7B72D7811F821CAA6BB" + "8606BF6E7E7433C8C8D6619D54684DEE236B1A87D90BF5FCF34CE108F9E51A2E6B63C6DF53BA" + "9E17260D3DC5D3737940D4D96D9C7D8A0468984A7580A9D037CD980E530626D64D531221DC84" + "DFE841A379144975E3C147D4CBB755D2439267D3577B74007D064762DCB94F5FA4CE3D461E43" + "C066A7789B662C32F61BDB693ECB0DDB834D19054B956A56A83C6280E79732748A010665A013" + "D52FA638D44873ACD6750304D4EC4F45CBAC7717227D30C622B875AE90494F1D3817EEEBDF7C" + "11A4F6C123BBE09488C6F6C887DC1DC421E9AF25F64534CE651C27121A576F4BC37B4CB13BC9" + "BA7B461FFDB4E95F2C36FCA71687DAEC56652797AA06638BC465E85758C3685BBA9F5EAA33E6" + "93EA133279A78FDE29999806DE7278591314562B3F6F9613C095878E46FB203D5B89C3B8FE47" + "3426491851EF448AD3497C1E37BBFC287A9724772A0C5A155A429C8B3C6204914BACF23B3DFD" + "1F48F8FDC9F9D129C753F1268CF2DA036525678DB9FAB664DA43FF831AC48C15A09016419276" + "A4F3FD5F7E5C8742E8ADCCEB30FEB2E0DDC61D6AAB99FBC10C2A4593C6B750B68E2E204531FA" + "A995B9A56DA45540A80DD8B095A5F8287422B808D98134E922D94292F29BA7C33BD4322B88BB" + "70A51AD671D4C9B3B23C5B769578D3DD352FF07A971722044EAA0119A230CD11DFA24661E2AF" + "AD2CB8FF7D62579F848791BB7D1509BAEFCD3FC274781E817A0EB39C30735F0010169D32E3C5" + "75A0C554AE06711C802551FBFE129E68510A0C342A1D65FFB475439CED0DC19ECFE98421FA20" + "B37C666F297087E10E94F6663ECD045F842197F37983B0B739C2AE2DFFA6B8542C30508A1679" + "487FDF8AA401388E60752AA305AEA3C74CB9680800FACE0C39CD705E81781E2E43FCB3F75D90" + "A8BEDD89E121F9EA46BEFF1D34B5F547866245FB88B30C45988055722044E8E95E0FF4ACBBCB" + "1EA96EDA3C4DCD932B8E6B58A50EDD11D44C2BDCC3E5D94F49429B44972C819B103D442E141F" + "A5A90D1BB01502AA25B6A59DA9955F8CA20474716D0AED63C9A2543083DF99D556B863BB074D" + "7F0CD733B51742E13A7EFABFCF256E4982680905A8312358C1FFC25B266D5F9DB1E6A4A6C05B" + "4F31648FCAE3948B9F93BF1F12F8BFBCDC4F35D28920463CD139425AA85A3054EE24E95E143F" + "DDEC783E92CB5122F78A1892642CE27F1DC391DABC04DF6270", + "DDAE42EA0E07863F8DB303D3AC806D17183C59E54C389B8A7FA487DCC8FE2770B99509C83B0C" + "550228E9006EF0D9EC614F5390A12321E63A7D85467220D288D6360067D29BC9361D18842D94" + "32C1AE78DC348C099780F69AA1D48ACB55A4BD4E839AECCBBB6E49609CBB56152D5BFBDAFB6A" + "EC2DE26EBFA6A2D6A2ACA1A10FAE831C2A2ED1872A1800F408FF82FCD378CB66C723B5CA5650" + "C5B4F0501B47E82034FDE8DF9C13FE4F1CC3F9AA14AF7368F2623C8E1200FC976ECE29BFAB8B" + "C35B4DC01302D0D9C8C8931329FDB53860767955612DBAD71C5BFBA1183FE474A3CBFDC15B90" + "E6555B8CCE2502BF39FA7B0FFDCC957F8D314F90481F8FDF4E308B8E60C96E4A8A981ADBB1E7" + "B4BF878FA7918E90059F9E5253CFCD004B8C4F2F8F0FE96F3C6EDAC0CA8A93B498338E886397" + "DF8FC0904F94658FF5499DFF86F2FCE7EA0523D98ED553384ED41DFE9E29713FE0C42EFED1C7" + "5AEDA43554F37030E56DFCA64648989CD85A06401D96D61E8EAFECA39BB749F8024389E23278" + "B677A942ACFE19C793FE41CFD8BDF96020BF16C050796D1853529D6E271B3698F659FA0FF881" + "7800C2A70C5BA2A1C60BAF842C29AA2B5A2B2FEBB23DA1BAB6FADEFED5A54356E9C83493B6EE" + "99BACE0B95E92D569A895C2ACB780F4C818961D8F3AC1A614DA108C5C3649ECA5F300363588A" + "582273150DF2E33C2624284E579431BCD87BB004B8A2055186E09C854CE87723F899DF092FF2" + "8EC8E1953CD1E0C745B009AE5E066D8FE30F0382BA13ADDD5949CB07883147561E6269CD8862" + "712FE99B818628801B1A7D3EC020CA981D36875BFD89235384BE47BCF51BA567E653E448003A" + "C6DF410298BA3F2245AE0FCB257DCE47665255732829790224CEF78B07D45BD45B71E49E9677" + "AA79C51860E63E72AE3C3462496EB2F0FE9FC45F096F46D347FC02863BFC3B3BB5D15BE8F848" + "E958D74868E188A772205C7F1664C7224A866CAD6C2FD73C15CC21B957071388A162F28F7538" + "671B25BF648ED4D33157C3BD596C7658AE12F664BCBA77C2827B017670B85F7CF15A68AD7F52" + "1565E39817F080830485B26FEAA9488F2FDCA4429DF606C8534F8BDC253D57FECBB21E3461F0" + "12371335DDE0B523CA83346694CFE41128950668792E3A4B49316A1535E385EF1937373D475A" + "6095D59F06E77360B9C240F11CE390DDB9908D14DDC20753F3FFB85F4F7AB14558CF2AB92CD9" + "3BB95112C787C3E65D39EE82D0FB44E2A6D754A49B9C9A4BE6B05646B2AC6A813650D3FEF796" + "6B3A535EFEE1877F7ACA5CD669EF7FCB0A6C8156354D626A0D67D25939D9252AEB654722DF0B" + "41779CBA67C3E1E3488A9DDC9B349D54F31AA28D5EF2FA1DFFCFCAE043BB28B1099DBB09C738" + "8F02439D06CEE760F9ABA9065AE2BCECEC98F7A1C7ACA8568C92D25C749E1660A9148827F329" + "662CC153C4AD07BBACC8EC480F862C784DD37FEABCA43BD1F2CA13606FB942253BF4F1129557" + "F64DA120C1010FE819C7A6A84AFEB5165A8F3EFA1D0E6E80DE4143EE5D3D266F48751A6E369A" + "BDC3EA8CCB2B7126FDA4D8E61CAEF14F468511C8E0EA9D8433A83CEBF436B536615244E32668" + "FE3A044EE511871612EB1A97121F17DA8BADDCDC3FDC61403FE2CB62F690FA23F97F0F4D7692" + "462C3C754E7C670618A39E55EE6979278EDA2BDA2BE0D1EF7324409E9414CEAA4A66E273BEA4" + "D3F075A244FC5D194082FB635C001227CA67E6A5D8AF3DE27D21CAC491BFDAE16CB819530403" + "7CBE58D801146181D997F48E4611B39646786AE28C11E0D390", + "1CD864C118C4A74CBF23A2C9772697B6D029C0CB6609DD966F7D6546D46EC40FEBD1B7A9310C" + "85B49E7DC88DF6A1D640F07BCBA548CA9B573F7CAEA6F6CE5140C160D7841E743C2616D9AC59" + "467BBEEC05407C919815084A0411B2B0871AC16C58321746143FE679BAF1A7036B58A4DA7DB1" + "E4E1362C7586B5F43F3FAE673AA92A06C0BA8DB2A3E173567D1E82CE520C030E2EBB1CBA1738" + "73FC026C754FAA56880D9D72B7715D5B108C68CC2174B9CFF3BB6C1BCAB351C2CF67228E1C39" + "2A206E55CB96329FC893D1830E3AD61BD21B84A224A273A595AC11FBE54EC23430FB9C67DF0D" + "462FEDB25FD5AC8A630A1B18062BE4ADBB2FACFE01AECB7987BE9B788EB4B0E6172B2DBE012A" + "56411D2FBB123296960C6B24D316D6FC72068E1CC0D41186A7328D06FA40B9313DB98B19636F" + "90D804B5ACC3BDC4CE0111D032F8B74F7429B7B98504F26334E064BBA0A4C68DF7DEC7E750D8" + "908C85DE0C2652351A36648603F07DBDD479B11C7CEBB0FFEF155A3CA975DA5BAE953C5AA8F7" + "FF0DD73E388D9E2BBDBE0FC061266C58AC4A64307BA131091B0AE7E37BEFB1632505DD26072C" + "C64F20A19DED942EF2ED1F4C0B88807323BDC335AD201B09F6C698D19DBC8C9D025F60B14CE5" + "61882B033871604E3F6B68CB24D63069694C48DDF4B8826A54807DB4D4E8670D2D711ED97DE1" + "9ED375807F35F4DDB527D46018D850C65135ABFA4DB7F462B0FBE639DF0C2C4372A7DF8835A9" + "A5CE45244521D84BD86B5C70C18BC913F94C69D3AA7604549C387144E6F3438ACD53D836DDCF" + "F39D2E8433163108DABA8EED4EB9B0116A55F2AE36403FCE1CE85D38DD7470C0304A734178BE" + "6ACE87C54DB15D036054955CE675FCFC2FAD61AE346C87278DBE5B251AD6C0E58F5D9E67FC28" + "62E84C1A368358E10D4D88205210A819893E02A0377DDE629A359B68643C2E7821EB0683028A" + "736F65753EFCEAD95312A5D3DE0F026B856FB113BE792DA1308C95ED8BD7F023762B62A6BEF6" + "69BB9066D303940B6DE964EE9345C4FD32E5231883261B384F2EF5D203E62644F29214D2D534" + "20607524833BB9B753539F4B6E9748D4451D67F45D851101A2D2194F90E6D5A64ECAC7EFAA8A" + "52663037ABEDCCD47955C0AD3975AC7D429002EFD1210A8265803D0FE784203AB8E12E4FE510" + "04CF36E24D3C2D947FA25914ED5C93D6A7D5BA4DE68E521D36493F55D5BD129AD8321C8302F5" + "A50878C5D93CEAC127A1FC4817FDBDC180E63E405ADD1F59A8E3AAFE6A7D8758C764D0C629B7" + "7312DFFB87086D081EB6285C372F935F8EDCAAF2BC7856DFE25387F43D356CD10FBEE633C75A" + "A252CB74F536DD2247A3E37780855120F87A6C7827ACE1283AFC1DB14E5CD7BDF69546BF8999" + "E159062C157261CF93C5DAB9B1AAF3FB39EB45790EB5699F3EEF9F32D5AE13D45AF39BF9EAB1" + "B3AB74793E70C9D5068C1350F3323FAC552DF7BD674E51B707EB8290E6BC83C6CBC3E0915420" + "3DD8F8BC48976D95E5DA6948AB5C798CEFBE1166D59785FC3948FF6D43C7A9EAA76E3F593E9D" + "87428DAF0216C21C3BFF6919DDB28C6164DC635C37CACFEAB8E2B35F176B404F8CE0B077B7FD" + "0247F0BC906AE7937463C214B5E8182709836B2917B5755F924D97094E2CF64BB57CAD792756" + "E51348BFC536879648ED9E640114FE4E90E3AB80843CFE178034C82A10917EE8012857C6B5D3" + "96A07553C56676FABD818CC94A2ABEFC6A6E4CB56CE13E530968B011143745FCD71445625D2E" + "DA5F39595DB3BB982495C0C0859569650929E44C8CF80975EC", + "95EFCD7A3124AA513D31C8D7307F17B5672DF26EA997B0A10142D8433B1516F894E1AA8FF8A1" + "4431DE495153979E08E76072D5CF9918ED1FA5C3451ABB4540D7D770312A1D8BACC4535D8856" + "AC1A7F5DFD901DD0E7DDAE6831F659BA263554C5EAAD54FE922618F012F4B729276B432D6A1F" + "FC566AC1AD0ABB15AB7CECB8D8BF50AE031C3F043708414A0803C059A2E6FB65437B5101FC53" + "02DE3E9F962B0AED2847A6109BEB522D756294DFB10DF018B1B3FA22C9BDDA7C50E80ACCA5A5" + "5E1A164B2C1E1C4DE7BC3FDD1E2E3B5A2ECC23DB66617FF8CB104906E8B3BDC5C8D0749E5EDF" + "97764B27736E39B832747D298B2AC935B0597457E8CFFB46488CC1C3BFDDCE7FAA4B02420042" + "40D255FE73BBFDC383311262DFF317EA2E9A0DAC9354D194BE2E4C1D9C76CEE4D26EE9FB7A79" + "2E0B13A3BDCD17609208D31FFE8666DBC433745ADC7478BBFC3DE7B2387834D268587AA5A533" + "50170A3E5BBD93445FCD8D180FB08DFB2946AEB44AD7D90865E214B750D469F97C7B40CA3F80" + "8ADEC2A6DF67459A03C010528210EC20FC38C0750AFD1B1D373ED5A8DD50B583566A3FF856B4" + "C2D6E494ED2F480F1864497F2AB557A32AAC645D9A6F8C1675BBE70BB809BFBAFE58356A11BA" + "CA2335D1B8548C0EEBEB02A2DD58A2C3A5F8B71899F3AB4E06E71079E9CA8A927B8C22851FF1" + "5587291F68A8DCC21B4280850DE995764FB4E6ADE8FE0CEB138CBC8A55248C5EB3F7A9F8A391" + "7E1252F0C14C1298293DDD69D00FA36AD58C52333B003C12BBB433CFE64D1F4B8CA2654E3E46" + "6F6B58FB5FCDC07281A83EF595B449AF8C771F2AF0E5B1D964CC4BD63566EDE60DDA23924517" + "906F893AE873976A052FF129C678564D7CFFC74899B8747990ABA13D02DB589A016183D524C9" + "2027A160D9DFF18572376D0BA3ED30DECA5104D919FFDA31875A01D2FBBAA8AFB369B2520043" + "3C186E9202E2BCCDCD7C284923B1DF0180A186E8520E85C6BA4C3FD13AB2E9D4C0BB715FB397" + "4A2FB8C4F2380670937663D1E118038704FCBFF244D45BF53D337D9F7D1F85FDC453C5A55767" + "B568159E66FD7B2CCCCF6854715705F5FD3525B2F3D06267F5A5ABA42CB219FDEC3C3CD003DA" + "32B13487569560AFE79CF4F3FD4334DF8E8DF24F5B35112C269AB80947A0531C11AAF3FFB6A3" + "89AC520C560688C3018D58A1235662213050C75DB722CA4AF54112E4D7685211E3DF39D52736" + "740E4B3357B8C6BB90171D578641FCB7ECB000462ABE374234452FD8E8C49F2462E37E944588" + "5D8FAA8C4001A6FDA7F04C3D571D013BAC63BD599A4E05CD9C95739F78F10942DD64E11055EA" + "4A689DB75C61419088CD5890A3563018622C0D460946B238ADBFF9EAB1071940BC5203AB2C86" + "91159B5E49F62E3F659857F9E5E73CFEA0D52D5C2591A98B7801678786F7F309A684BAB4B5FC" + "C8C179E9B49597F5F41D51C542DE66669BD7ECCF3502D5BCDD54B4794477F43F17DF37D99795" + "FB456449FFA7E41C380310F178CDD921CC0389E463BE8A5D39BF51DBA06572E9AB917F864BAC" + "742E0942EC30A0301F71B8924287D67667A8E8092EC30798400949B2D9BEA2ABBBE9700B5C31" + "8B7FF31364114A6F6196F8BA16DD89D431FF7360D0BC809264957830D00B235B681790BAA133" + "C5C3B3225C7FE7D64D43CC7291FE940ADD39C2EB923EC13D1449388B760CF6ECD58D7A4664D3" + "71B4E1EA9F1DC63EB245B535EF82B029C0767F5BE35ADECC4F8E54C8A63A5F164CFE7985BBA9" + "07801B998946356AD8BE0172D777928329065061E9490FD138", + "9BFBFB96DAAA6DA3D24384DEB535B4BD2412D5B404D2704ADB4432ED87F0CF8D318496A311CF" + "1D709DD1C41640FAC52F7BAEED2BB0E30361ECCF92AFDB64AF7A33591127E9C68E95737D233C" + "AB1F83F835471DC64B85BB220D045112DCD0937B94B710A48D36079A999811824BBAE44D711E" + "3E3A80865AD47759BE3DBE4541843D964EC36CA0889B18C03A42D14838AFA461722202495B84" + "B5E48B633381D5D1F2A8D7036FF0F44BD2F184D89987646A14174789CAA37DE1DF13BCD2FDF5" + "4551A018D429E08CBAFF22719469ED24591BC6B2A103CE3BA3BE470E691B6D01A9A40A59752B" + "19DE3E9F81E699D2148645B027468551C7D6F0EE745A366B63C2F541453CC49BB7B228A0D8E2" + "C7F1A38D828A26F6EC919E514157A1E36B362D173B87B5F1C550B17206D1309425CCB3C0FCBE" + "3DCC6A574D2812CAC05B6C4B38713EE2EE39E042A6B1EC4D125BCB14C7227FAE9883CA158C02" + "C55157DFA59EE47DC3DF62A9C8F174142B1370CC8D90C7A5E91787FB60758AA7C5D5C0E66368" + "93D690ED492022274312FA8E0945A12E018C6C88829B61B934DE10C1513EDE3ECD7715AD3080" + "AE3E3C475913AEE920C40CCCACF0365892847694EF64859DA4451058226ED0E931DC71560FE0" + "FC6A9E625F6754B8B1CBF2444D662F7A936DFAA4F99BC3606386EA5BBAEF7A51AF813411C5DC" + "875C79C462B490C658F987F0DBA6116DA907259016D5A4125E96D656BD90E165E2DB2AADB4EF" + "EFECF1E1BFEB2044649807F2154F1AF96D50384C458548E868D1EF8BE3972C6E3383068FFDCF" + "E92262826EE6FDE6A55C3027C74EFA301B81C58512AA873F40037FB413D4E13B1E5E47D08174" + "C41244DF63570A5301DE4ED05C74CBC758711A36889B09F8D684F54BB5C4CB6379D65997F75D" + "CA11F711CF54A1B994C02B7C201E1EFE2AEB60D25193E1F8B1B0B4605B26CFB9945BCCAD407E" + "CF5D1562367E0AEA02D684DCD4E43CA89711E6AB8F56E3FA258D92B770F3FC75397FCF68EC2F" + "A798988D37A8C659855391FE818E358E75399BE546106CA99B9965474CBF2A520D0DA1A77A6E" + "925BBE9F3B9A9A8055F3312D3FADC58E06F6316C1F9EE77CCB0B90B671F7DB4E4B5FBFC3C1BF" + "994A19BEB8C0ED24FA4DA7535F67B228F7A9F7C5A8263697C1327380047CCC11A7171C2CD22B" + "500755765DDA1AB54ECC68CF6910E70FF47552A257BB7B1F5B35DBD20554422325B46274E6EE" + "598A4E01126F3BD89A69ED602ECE4AF5BA787B6268458D6498930FBEA0F62A72F060F4E546F0" + "57DF0C91926B1A21646DE1E5DAF52737406B796591BDCF6488072519A77672E462DA4C4422AA" + "04BDBACDAF8DEDDEA454AAE2FF0E70896F3163372AD585BBA6EAAE00AD44B3438E8E588333E2" + "001CE4C83E96C6415A3EF95EF144DE6FACAE5B25F24B7031D7D985299FD83C3FDFAD272DBEF8" + "E6D09D0D33EE779F8368C6F6071A3B5FCB48CCFAA015959DCF97DDA49765EE585B0B04A54FD3" + "2E2A699D995360862A7D99CAE71AC71817F89CAA19A6315ECB11919E5F43716F3FE9CAE3FCF0" + "EED49B1A45FC76AF1D56788E9153C272B3B216B4057507E6C46A8BAF37E02B533DA299DF364D" + "A062D0D8D1F87C98A4B06D7547F7878043ED403299D852AF388EF8853BAEFE99A6B9EC6D323A" + "DD2AF216B1F90D9116C588E1AE3D32E3A0B727B80CA50EAC6FB2248232E810BE27A78DC872BC" + "82DFEC002FCE15548A1A381D80C5F72E3E40C3AA567BF677641464497F3BFF160C1CC7634E9C" + "7D1F78B161712A1A2321C0AB69F58F2A84FE019262204D7FD8", + "7CA6B97EB9717271DB11993DA11665E7F03F8FF91ED20DFCDFD8493629D44B737A70C5D8F0B3" + "0EA88E1A5ED7E781DA544B391AA300928B264BAFABBE83D3843E9069D3C6D960E2A38F814ECD" + "A467F3A60BE1367A2CCAA18C8F2FCB177E9C0753568A206F025B60ED55251C09BCE7497F9D1E" + "A87A56FABC7F5CCACB00779321C4895946DA940650D9144CA8711E288DE1DFD77838E8EC430B" + "DC649A88CAAA315EE69D3B0058DD2D3E1E8C9D2AF7F7B2BEFF2C275CF6D73F008652BB8CE532" + "5A7BCCE119C269EFC542F4D97324022E34BD5CBFBE207A1E2D01042134E33CDBAB8678BF4414" + "0929424356E5CB8C8FAB8D00BA81ABAC09DE2FA84512635E9BFEA316065446021AE9F8312C29" + "2DD75898A88FFD461A46608C1C71C1883312C315FF88A8C8D75DA4A1A460FCBAC20311530346" + "2BFECBD6324510AFA3DC81AEAC0AE8058EAF898E9D3B561214A4814117E8F30EAED9E6396421" + "0405A3C2F023EFE9D5E963A2012674D97A151FBCB21CC4399EF2D265398EEA530807E75B79D7" + "21A7FBEA6F7F7AA5C98BC3E5A5D8D006E5CB3BD462AA988AC931DE8611B8B8E0F75FDC3D88A3" + "C470A99144D853014ADB14D4891C264F70069A99D7F1EAFB52F0ABC5CFF49739EC81C52555B8" + "36D207B0228B565701CBF7469FA7898C2A99A2F3643E832E7F312D9B940F8E2A3834DB1E5CB0" + "4BE10E5E0BEEAFAE93268A48062AC4E69152DC0F3F5BD2C388AB866878DD1872F676915CA364" + "90DFD9FD825BC4FF8FE07F3D33442DE4CC46DC727474EBF4EB29F3C4F10AB9328ADD6E3ADA89" + "EA7E77E915CDDABBB7DEFB07458A40CB3D27DEC092B83E8D30001C4AEE030F694E4D8FC92019" + "3610FD6F078E782311BAC07546E5C4785E4886D10AEED6A85CE7F0B6A7281B8A1CB1BFF99133" + "5391ADD632C8772371F42F36101925FADF50E8D25D4C7E03D85BB649128036B4AED15E40D94F" + "CE68EB0A813CAF765BA878B166462132437EAE1B04A001689EAF63EFA798334F54B4FA149385" + "E2499D5FDC46E9A9DCEADBBC7ADB7C45F7B4DCCA1C70324ABC54A88FBFC7D5435D17279FD4D1" + "E2A4742AD12AB6A4B977849515B626E4EBED8B046D8F00F4DBF2306837F0E63486FB90EE076C" + "B7664B4E1F69B6120BAD8298B8AECFAC1AFA189863A521E652A01F5B200CBB5A3FA2653780E6" + "E4C6E55B192AA7634089FC88F218B8295FC4BE6E87AEBCDE68AFE4FB7EF57FBE4A8575088DBE" + "33DB3AF619A5F8949881A06F45F05F250A96B81794C9AF7C084F20436C9BC2321839B58C064A" + "946691F67F6624DB2466FC6F896629526031AD9C184C43D936C204F2103EF59329E81D6950A4" + "FA0FA2F6058119291FA5986F5CDBCC7DB110AEA1527DFEAF7EDF27F5167B3D75E1767D23FA94" + "1D184F113F9102C6E55498DAA763276701ECA645FC5ADD3004DAF8054A6784A5C619185F5835" + "F3751D1941B5D0486D96F872D266ED36E07709DF612C670FEC160C4FDB2F00F1B620D1B7D727" + "646DA8A921EE9D256D548B542E25478B2BF9E4E8BAC2ABE3FDF1152A3D524C0E38533B2DEFA2" + "3EDB5E3DDB573B9597623BFAB99247A1C9285F2D2AF2CC19E5F7C6F57916800520D8757EC24C" + "8462668D1E15DA6EF53C8150D71673F29B027A8B752D6C0148926DDA1BC07E32BA4B170AFB5F" + "A498086CF42F8EC4EE134C6BB589CACC899FFD8D3851D814E56D0FE73A156B77508B61127A1E" + "23A762AE035D88C41E71E0F6BF086C980493F1B27296F0C0775238000CB17C1D49037BE4BCD3" + "0251A2E0DF7BEDDD5BB3A897EE7E57915B5C76BB514C9D508C", + "70585A8C6063F14F400697EFB253652662960FC778F9D46B8206A878B4076455C0AC510AB7D1" + "59FD8498971FF8432739E5AEFFA8A8FD60382F91D759A26CF9D353C3D98B4331D4C7B44B40DA" + "FDEE29CA9258679F8CAA20391E999C204ACFF61EA8840AA500D04436E85CDCC20C20B295A385" + "27310B8F32D4B6C1A49EB6B207A9664439B02A68EC9F096552527393234D8B5A376A7B55C8E4" + "6D0642AF8C9CF29322A7AFC7AF4CF0A2CC839704A9A5E4836E64AA2C14D9BC436D87EAA464DE" + "96A904E1381DFAEA0E8E86232914C306DABF7B61E09CF2A138A371BA682A37BF835CD440C481" + "4C3474FDC0FF29FFD6FF0C2AF95C3D5CB98CD9F748774D70A1FEFFEAE7C19EE84E8C5A49211C" + "F4A99236B61203ED9C9BF62D6D99799A73CBF1DF4AF1B2CC9532462DB13D866CC3DB3D17DC7E" + "51037FBB8A08594B2F50FC3DBC3F0AF4D29A1051DDFEC08A7E3BE8BCDBC33661BC8DB4624CA9" + "334D8F52FB8FD3CE599E99B6B46FD939B7C0486D6C49952F3884925A3172177983E757FF7F85" + "0EB2EE12EF9B319D3ABC3A9F5430FF6BFF94FF03BF2E2C328123022B3AC1FDEC54165D8EC51C" + "854F390786DEFD5B60C32894C4617170575FB81C872095697B262557E1B6C23D9B2834552676" + "C127A59520E9C133450F32F5E3F5E544C94F3931F54260B62713AADE56EC5AD1B2C4C9CE4A4A" + "A690F93716540D9C226695E04D6D7925836D2B4CF1D08CE4A1C5A94D0430433B3A176C220B00" + "A5502115786FF352043999789C045531F9E61A49539477BF5B02D22DE32B8CC2D19BC3CACB9F" + "36459AEB89F41C06BF1515FF75A79CE4C21FF8E91921BF9A8BED508A3503AA26E02D1E156041" + "D62B9F1EE3F0694664A6CA4DF7E96002F28FC606315A1A0E1AEFAF779C3619834F307F5EBA5C" + "97421773DB6B8D1E68B18FEB964E5D7955935B067885B046BFB710AA9932D199ED29E272CA3A" + "C9D6A0C40B11D8E61C146B8803591565F91B995D741AF0EB4811B03D1BF51D1C16B3B8D3ABFD" + "9D6B97584D2D3E285065C4C150EAAEE3B601EE9C10D47F87633A331282E036DA9A14EE3EF3FD" + "D01E58498795C60EC7AE8DB18AC3469AFD53CFFEC5EC86F38B0892230DD5B40C7005125CDDC0" + "66FFCC6111CE7BCD6D03A891FA3B3DDA5F6569F2846F26D3884C9AE5AFD10A830A17BD452D1D" + "1204568721D818D3E952B05407220B7AEBEE3BF78A785D4EF5F1D68FC1ABA430DED21CB68B84" + "9DF64238F2DA9E5622DBD4DBC8E4AA772DA05F5A803B53C16E3F85889CC24FF9E476A78AFA49" + "905A2741AE05FDC3C4903C1CD3F33987216BBE78F873BAD7A1DB135C3366242FD90B4BB2D956" + "A2609D8C8805F402263720C8AD5369BA5A137E848CD987591B70BD6BB9C3E3CFBAD09C3399F9" + "670781247877F40EB05C8B41324BEA3CADC4F3FE486722343F8ED0795B802B5F40B69DCAA4E2" + "7B657B688D4F2B69E3884DF7243A2DA7096F6184BAB07E2D71F5EE5743CA3DFB8EFAEBDA089C" + "0541A952F96303709C2D440917169457BD0A182A117EB4EB2642396C9EC429F2D4DF4B779B8B" + "F122B816D67BCE7110C67FECC07767491401C605B5761889221A39EC26F46FFE7957EB2C586A" + "31B62EBC6E0C753C32434F0177F9EF8EE50B2B6D80E829198B98DC3FC561072EF00DB8EEAAE1" + "506474C1428F9696435D3AD737FAB963B9AD071715FB1781B1025AE1EB05D7533B13F4D51358" + "023AC5070CE3711A0460AD726B8A69C8F296F33169932AA11DBFAC41B423CC1B593553D74E4D" + "3AFE31A24F163ADB79DD085D274BAF5FC19E58330D873DDEBC", + "7B3580B66A21C2ECA59894421A5F79314839699DC5E07DED0924B65E4FD3B1991CA604B1D23C" + "BED54CD5DE5C975238230F327250237FC0DD3F3AF613EF4014E2E9927C5BF198B3D4880695BD" + "A6E6828E0902423C0BAD5DE230C4DF6CBF6478E9125AE6BAE83312B7627B131A62E3ECF0D3DF" + "20C5F53E0373F58EE47FF0800068E2F2D258246B0545D6E664A3FC0EA00D869EAAE4DED309F6" + "BE84CB1102DE18B09CBD77D5938A21B1D4EE5F61B2E6240E77F6BC6D143B9DC8885670B00596" + "0D50D84F7AC70E2C9C4A7C2C6EB9123EC71B9A64D8920B439409B69DD66CCE6D92BC24B27E86" + "7E9ADBA4C781FCA4A41AC8E0C9455009459B786E6A7902B1A65EB38AE2F585FF1D6789AE9A6A" + "113BCE9E03383C23C003309959C770D334046CA63A973BE26388D4476D33F32DB88AC47191F7" + "3A57194D880B32C3B8E6A6433000F10F07301E5CF72215965D6479AE3FE86BD1D4735E996350" + "27959D87B668A402A8A4C1C4D609494FE078C976D65F985F93490F526D9CCD9AEE5B640A70B4" + "1246C9967638DF12275D8D0F948E4D1C38D7BC86C2AC1A6803439A8444EE770A2D8F5BFB9C09" + "19D361BE9DCAE36114726AFBAF4E43461ED02234C85F5BE432DEC9D55E586C015C0FF14999DA" + "E8A835890692D3D1C5800043FF89DC6BF3B01F2BE8C13EF2C3CDF1D196323791BB523305D759" + "D69225C789BF4DBEC8C311EEAD740F1090241C5059D96F6A58044AF34663F68F9265D1CA00BD" + "F21BD73F2EC0FFB10293933C310712BA4E9EEACCAADF4F12E348194E266372FC9E9B49242DEF" + "81E8EE65A704A327BE96108A46694DD0E1159B406B37BEA0130631F45C1248FCA2A8DC00E522" + "42939E3681626E30F49A2583436695C7B5B9F11B251B4A8CD8651FEB62EDDC0AE8831225CC9B" + "751B2B4FEFCF53B05391DD414F460DAD69A814B9E3477D5B137947A28D06FA56FC46A7D23F1F" + "C50FF8C727E0FCDF1F526F9DA0C7DE80AA2FC95F9FFC35D6DC0DEB5269B1A2192BAE9E6A2044" + "5EF5F32609FC14DBAB3421D07E678CFF10F4C26BF376ECF58538C7A73E5F54BEC855BEAD0034" + "738A6E2C8F587178D0A48EE7A46EAB5C9239267BA9F7C0770EA9BA11D648C968B4F804DEF43F" + "EC74854550B31C1C78B90D7010DB9DED8F0889AFB88EA848976EFA1F1A2CA6F798FECC4DFF2C" + "EF0A2444CFE633973070924BD47E294C17F5535027300294BA4669E66972114F0683D969EFDB" + "DBFEEF7E9225DD628D2164311065F96094A504FCDD6B2A8E47E9145C578F8F618530715CEB96" + "EA68C3F0077ED84F9E1EB317AE46A8F96EC9A2718F549A6F27B2C9578C722C9BB4F8AB17AF46" + "6BC3CF90DBF7007E18B2BB4EB9D470650C378F8F51D144BF138AA6B5D9F905294834FD304461" + "34258A35DD224BF7BBFEDEDFBCB4DE0B07944274B33CB312E94A00672056557F4194A3F15E92" + "4870674E633F99112287B9A7FD919BF8CF7B29A2C7C2FBB74890AB88EFAC88878DBDCED84075" + "84E8F1C1C66855150971BFE17BD900F968B498935C42ECAB87701F7CAEF324E249D6ABB12F3B" + "892858F470D789A3B28E716005ABED509BE957D3E72F18E50D79BB767EB2197847F98F33F05C" + "2166AED941FC83267D7BD11022B3CBAEA4C22C6CB256BD81DB5D61FFCFD49FA2A80BDF182DCF" + "B257C7D9F83F2718FF851FC7E25F2B11FB52FB058A2F14F646D5F7163CE940ACB5AD83179415" + "DC4E506E579FBF96A6C576C99D224608BA81DDBA36BFC530D98A96C526C47CED6F1D4B36160D" + "22C97863B2340B63CE4A12253801D8AA29F89241D17C630640", + "8FFC7A4A6378D1607096C17F7CD2BD18C0B9CF2CAE030E30B1885BECBCD4B8D4D97DFC44E932" + "608B13A2B7FB12E5418DF681F943ED0CB3BB1F65EA23B9B9DB719CAEA7C1E21621ECD20D5675" + "5B084780DFD9939597AA7EE5635CE932C16EE384C238C86122BE32388A0A0ECF478509DC019C" + "4D196CC6CEB6790B58785C70B543FAF68B0C85874E720578A32E56887FBA2F5B61CA314A1DCD" + "AB5C56CD64B688120ED74EA3A8B32AA2C763883ACD1141E55640D6BA53D9BC8D75AC7CF6D24C" + "57182A836E4F7995E3BFE4867E50B17DD9BE73F54B48772289AFCC9908CC3E22E7EAEC4DFB91" + "02F30606A632B4B4F0BF1F082758D3D4202F18529F395B6611CBFB3D1D0C6303B467091C9127" + "4AB7D014508FEA419E93294C9798257F10A280BED52E4893890E62DC0C630B8BCDFD38866DA9" + "CF94A18F4042BCB1AE410F8FD0F2D2D4C656060CF4089DFB23757E7447C33109933F59144EE1" + "2D2AFCE7D9BBE8D0A7E6127FDC7A99EF276C15418EA324B6F3E35AEB13D9BCA5D6B026AA7828" + "8B35C11C6E34554CD15C572EB7048116D26B36A3AD5B3B8528C5386DAF45DFE116274C51EA04" + "E72E1A130D16F5FC2AD0E3A1E1AD09E6D73633698B239803B90A1E2F37050511C4C7D4486131" + "C4321C776834C973AC6A77E55E9A9C99BFB01E210DAAE6AB04B3784684783E575398EDB9D9DC" + "457A6F8DDCD30B7C29F816FB182A748DFED45C8D1064C97223FBE9B2B1D2B3D37DA118D0C70C" + "07534F39D0318BD4B3EFE83690E068B1EC6525E3FF1DA4DA7088E40F91B37588E17D3D9625F5" + "A083777BFCB5A72FE20463B317F388B4C8841DA36DD1DE4DF8C3FB452AB543CE356FFF305A37" + "DF75A26AEBB9C7220145F84BF916F6223AA9E362990D829ADBBB237A21BC20960B859FFAB41F" + "8D3183AF4286DE18EAF0321D48FC8393F4C1A9448D38F814720DC16B1C60C43F0A76F007EEC7" + "397DD91328D13504B61A11E5F47F04B419DF9FFDC55585F6CA2CBB7B7A8D05653A0D91ADE836" + "C3B69815A2C4B5D1690369BA425D11119161B676D618B3CD06191F8792E7895D9A583F9373E5" + "3BB14C1077E744AABBECBC7319DB31855D9681B2B5261653A6771057E9C277568438F61700D8" + "0D81BF629804956CE0F3F9414EC4A0A99B8CDD4B479F8C45D1DCE35B4E68F2A7190883448875" + "DFD7F7635E917BBB852C4AEC0E202BFBCE413722A3C03636A494EC66CA6F9B46849D5DA53E9C" + "BF60867F276CE19496BA42596101A8296E6DFBD1EDF1798A9BEC785C36DA86E86157015A5B57" + "45C26EE7C927CEEC8745D5B4B501D50C2EC2B6D8743C6FB2A33D1F6F17BF6CED282B010D3484" + "BAD2530E6DC9FCC20DFA72F94B757242C5B3ECA6CC6E524AD8D8078A89D904E7BFA808E06EA4" + "6943BBBD12F58DDFD7F75C2245822131CA9E2CE5B58E77174463F3C5A57663B32A0A46E5053F" + "9E0E6D5240328DFB03603601D0DE3842D5DC872FD411DCCB94D0C95A9B02D3754319B7319C7A" + "6FBAAA45CFDC10651BB94F9D93F834B37523CE93C3F130C1679A30D6DCDB0D1311117484BB2D" + "812D175A468B5032DB86D82F6B1360B94D4162BDBDBA68A6DF4355477FF3F7305A41FC5F4F10" + "B0DA4159162991377D39C6EFC01EDCA1F8460C71AD07609C503E3962452B065F93827E257098" + "1EAE30F6C285EB831963F05ABFF343A0D2087B08BD89BBB6B28361328D8F2AB888DED13FA43F" + "450089C73BAEAC8B5DF7D8B419FFED58E7855AA945BF863F64F7176D8B7042265A239FD19B8C" + "408FE9CB5A7FBDDD820B5F48D3797D0E235D9B13E04E221CB4", + "2F7ABA171BCCE9CA78A90833967041632CEF454053C412DF979D6046EC762D5E52EF45C77762" + "DAE843A842704F20A91453FD58D1B87E85CCF6B9CFC5B6CF0CE599167565E84B2E917A45FDCD" + "E0F22DFA44B47C4589015817BF247F6AC3D1C2012A9CCC0EF3E99358B391653CB5D0B62AF731" + "9F410716E773B1E424AF9C99004C728240F8D0F713DC00C1F97F450D5E987DAFBDDAFB1EE696" + "1E196BDAA3C2AA5CCA458CEDD6CF673C70EA60030E875190F5A754808FFD6E943B0CC0A97BD1" + "5F236607D794EE0B6E55F3665C8EA0A13CB4C7DDFA416837F4C66339E1E1526A48F6C44AF9F3" + "5F62B192CFCFFA789EE68F10ECE2DF4AB0275362CDF70C7EE944AB167F0B9EAA2B79078ABC5C" + "0DBD4AA5198A5EF59DFC1058960A6D90E95B6F6C389EC3F64AC117F8E8EB497C0F22C0A80D32" + "5852CE7293CF2539CD286932C0540D13C0FA4B5C5C7FA20D49BF0DE470DBDB6A5C26D941A468" + "20FEE6BDE94662954AF6C0E8F547827B5155E743F9A3548A5DF8C3BECD1B2B90354BED1CDC23" + "C59DE4797FCFCD26351BEB3E7D488DBC49592A1E1E73198CBFB05A097EEF8CB4F21415C4E99B" + "3EA9DB41DCA7AF819B13EA2F7A540CC370A5DAFFC404AB96BC262B85C300195C38F39BCDAEDC" + "C6894CE9550F156F5A61E1A59DE37D6EF7D6F865EAC28BFA7E0C00EF23BC2C7C090538C80264" + "E7D4909E373B9DA3820BE633BD51B42EB4F29A27346B265F3DC0CCE552010E2F0D5BF893F7A0" + "6A024688F8B4897ED13C1ECEFE897A25D3485E9AB9A2669CC3CDB68FCE75BCCE85F8762C6AFF" + "28A25413C8390857085D6D1BBB8E8BDD29EAD1B8DD881AE7A7ED208F280A8BDCD31A0839A730" + "4254794E5CCF63A1757BD183F1DC64E3A5E5FFE4EE84CFCCD42B36A235DB03B746BF05259A60" + "E561F78F49D1F44E37D1AAEE8ADB1EB14A6973D1A737F2B274C460EE667A24F3098BC76683A2" + "B8780F7A2B1F877464EE1739A4D8BB2C77BEA905D20247EAA577F82877828D2A9A96E8D6F121" + "8405DA663F460A6F85AC8AF6273529A82019C91800A88932B468DB6503D0E1EABA22F1BE331B" + "AF2C9FDC52B6057F4FA4BA70F73E0985845727AAEAE3FE80A1D00AD95C3A3CFCBFFB558D2EAC" + "C71BA4441BF8040A93DA58578D671B6B1A47D1A75A0627C9ECD80CC3241D646152D0B40CC2AB" + "B81C6D457D3C21207604051F038A2F4DA82220EC195A5E43494909594BDEA7956DAA281B598C" + "272F2C09DAFF881F21CA1653F19D63081AAA13447C7D4A13CCF83403285F51C20BD880DEC2BC" + "1CC63EDD751C7A5CA4FCB8E9036FF367FDCC0412FF355F34CB15C7FA46B218A19E8CA08CBE6B" + "3E988298BCC28C26B12FF1D469967D567FA41019DFF367FB604B8E9F929D2F1C575DBE319C1E" + "A1BD808DE821C57D0A60160F99E4295F1F11642AAC08635CC7E53429C27C08FFADC81A7A7218" + "CD6C0A2ADB54F2BDE94D484949613D2D4C1B82220AD97A28E07C50103702421E5F515B1C0EEA" + "A1981685A543135C1261990D9BC9F2302D72C5F12C6B6C7358F50D2DE4A8100FEC1112EC719A" + "BA58D56FFE9F9E2E1D4DA805C280BFE3ABAAF27510D0C83E77872E92F97F5036A51DFC9A7AEC" + "663EC7A22EABC385E0536D8B16A6488A800C49CC020ACA567237A89AD0FB28317E332DD010C2" + "47B58BB4ACAA58A0F70A0FF752ABF12025D04ABEF71A6E8D92CE743B931770FC6A2F780F0EA2" + "E0B371E8C867922F333B83119726A7F672C5E74B2946BC6DA8BBAAC5F63917C5C978F7C35383" + "2CD2507EB176E06DD622B66A1599F990BB93FFD3D2E3931DC4", + "AFDB7462D227B6DD29287B6C339DF41E38655E0843C03B8134B73021CC5C86D32A2F78D80FE9" + "3F1A3FB6AF52DFE923896F86BB1324FAA26AD4967E045E73B3E889500E2F250CD2BFCB275C8D" + "B7F95E48414B47C480726D3D3E183A0E437092D996BC3469D11651404502B832F384988432F5" + "8B8F59B72CD7294EBED3F1B69E044FA79FD9F92C77574B2F00B04414991DA72E3A8545F1E4E6" + "6C1DE7C8656920EA71A752ABCAFD26A0AD3BE81493E2E4BFAD328850E368DAB68B199BAB83EB" + "D8513A7D35533A707BF09BE0B701A41755582E2F88FB02C19B2C86071C75B11285B322B69785" + "477247815CE985D08458B371A3A518022AF7D54A007A67280D7B6849689BDB3F7232C3EA38F4" + "DFE73044536B5A1229055621DB7A4C98E2F204CD3032A3EDA38A27C070DCC663EB24F5C56AEE" + "902A7D6C6B5899F1E46B3C8BBE782D853B76A14BB5EBFDE8B9044F713C1EAF0D196480EEDAC5" + "1A4F5BD99C15F17D3EC02C4084D692FF6F95A9CCADD03A11229DD838900AD9B924092766D402" + "4706EE51221702ED4CE56A7DBFD25AC8408D00DF2FA3EA0E66F6BC9628D6DDC049A62C3D5E0F" + "23BC882745EFF5EB74A15BB7286D079F744F3589E3E646B58DAF95025DD5A8EBC935F198CEC3" + "80F914716DF153032CC813D1C64C97B6E11AA8251216B5B2888339FECBC715F0D313BF36F645" + "A485B7AC0539978014AAFBD51006297163B3468842E865CEA07893B8A87A5B51336852236B8E" + "38184D3660D037C47D1D06AABA09603B41F643F7839732AB2F972286F5F0757666345B56C5B1" + "C284532D7F49D1F24A05F72D41592FD4F552B96395C125A984F9EE0D99C9E3E8A8571D396E26" + "4A0883403D34BABB8D27E6FE797C881E5B63F2DF5CA53ACD3B66BC746BD308464873D3075028" + "80A29A22E58B0F5A66D243B09C17061F2F2D938048F8B4A0849EA7FB6C4EB934FF52CC293D1C" + "02A445F3739E881F9A4AD59157C93237587DA47125FED2BD5B7F163F25FC06C7BD1532D84E8C" + "E1033B4B207700F0841EA9871E0BEE730DB785252EDB7912D18BB6FD596A534A710D04A07159" + "77468F918919051A9C215D906778FED01F5219A2F04A6649ECD4550C41EF2B1BF3BD4B0E86B8" + "285F1E61E5A42C2F9F31DDBEB5CB8A1D04259BA99CA84C29BC00CBB90C3EA07F3A2900FB6DBE" + "5783C8D9873C367FC650911B23BA9D68CCE21814CB49F4DF89D4D07B5713696275C428455215" + "6C415E12B3EBFA3DB11FCC6A0839FFEF547AEBDCDF69C3EF7C7151063DB939AFB2B7B6BE8570" + "ECD3DCFC8AAF964E7D2709DC42A85AB1600FF6E5157BCA15D20341CBC307BB9BD562F2C7BEEA" + "5EADA5229F349EF5838DC9F3B82C0BC542DC5B2A0A7E3BBC2254DAD66CEA04E2A66F67CA5520" + "EEEE86E848D38473C627D9EA552E3AF8FC9E7C991B446E3957AF84F90FAF54E3B116C4C9F3C9" + "F8FAE3A552BCDF231E710E5890BB0BBBB825529F37B32A3902B9B35AD95221EEE3F282A6D1DA" + "151E81A0EE7C9D8E0D7BC967CA252DABD2BBED1A7A355ECEEF061E9C16025D429EF5453B7F80" + "346AD0AA11DC8725F3934FAA89F9DE59B8750BEB6F6A6FACE4EDE3045471F7BE1CB7D9DEBAF1" + "57BFFCE082B19FC46DE2FEBE6A43D411B5425510A11D7234B64756F0595C8FD97C969940C239" + "98B5CAEE26C448531FF361E70CD89E0F53EDB6F804A2E7F02BE184EE9801ECA190A9CCAECD21" + "05C28E9D6BEDDC67CFA1A12D3C33C7D0A0EB0B8695EE7EC6A7BC11855159BC9332907A2CC257" + "C05BF8F7304DD421CAC504C48C4F8B1774D470290584729650", + "C323BC7C1F2C002D95F6A579FF1A593D04D753FD7871D314AC6A0C458B24B98FFCE637CDF105" + "EFC225BA1A892641F517567599101796370C51742F6A931245C365DD451C31F5923A905FACE1" + "7227EE2BF8E86B72D26CD51AAFA9F7C8DD2EA2508034C368FBA0E57D7D2EF560CF60D1B98698" + "30B7044552E3511B891AE2FF5FDF34254C8E68883271C1FB2300A99DD1D5F0378BF8AA6C6A4A" + "7BE86CAF394B61B4C10C8D165102E7AF1914A312BC6A1370A2BB52ED9230EEC30662831577ED" + "04F6011B9741DE9D29FBAD99FF4C14968EF49EDA0DF30539142B477591894EEFA946D3E879AF" + "2D14F597A88715A3015627F0866081611187B6D21F6DEA4150B167ED37243BD2C0705E2361A3" + "C640796DEC73B098846518FABAD07354BB1EECEB031E02EE9B6B83D3736C337536A06BEF9B3B" + "2E723C59C1AD817897AF4A640BA49DF86D4247EE5D16925453CE26AC096AD01CB5F514F939CA" + "33AB59A04624C7F436C69F27E8256AFC5855924DCC50B62A885FC5EE728C3DF7A86394016680" + "29C615EFBC314E77A3FA11546D0A33B249AA1A3F56A417E4F9636C2FE32462059AD5CC539C9F" + "28AFAD380B5690356473CA2A4968BA77E242B61FB925D02652F5E91E81B5839A3C4E74DCD9F7" + "D6056CAECC36CECBC1D6D9774078C0D73778DD2ACE0B5D5F18A621190DCE37B69E0263C586C4" + "7A0E034BDC24ECB7E68D0A8257B6F84B6DE188868106610FE46A80C5A8E115E9AF28B4F59E17" + "CB6295F7729189AEE2D4289CA0CFB05B792F71692832FF99B5DF94B97B82E9D8806F20B7EEA8" + "C14660C3770C49B74ADD450EC8563D48C52898F5E7408A68B130832D86D29CF53617DE525636" + "551FD1EC0FAB8BB99500C4DF838E4C11167132A42CFBFAFF475891D88AC74AA220ED0C19619D" + "8B06F306AF74BEBEA705DF16C32C010A4574BB13EF95F558AB364B4ED6171FD477E44E8735FA" + "095C49AF8C38A2BBA6C3A248C956F42E8A30EC69E80899AE6AE8AF826491585DA443F7A08FB3" + "EC673FF19D24D1A230563528CB8E1EBFCAEB20BC9A58FF9EA56FA9B40034F83E3DC4C3E71156" + "B0B2FCBCD31269DA33BFEB5B0EE66BF64095EFD8B2E2BDB915343B5B539D06CD2CEE109F637F" + "7B985D603FB0CF0C1ACFB35EA93B7F3033EC2845688E57BC854EB9FC392D14D929F4E857B91C" + "4DADD5CE3480AED9886AD83513FE99BAD62B850AD5FD2AA4DA2F84BFCD20CB1663607E482D21" + "02919F15C2A44511388180D67C157547C6F20E3E4B5A7E90AD67EEF779A71A78B64F448C150C" + "3E15C2087782FF3800E6E54A3D37350049C390B8E3F7FC7694B11A2BE3ABC7A049CAC1B66E09" + "B95DB99475E8267919E5E1687C0C774C730AA2D46547EA594FDFCBFFCEC90658BFF50664B3C2" + "D36897C5E452470F3FEE5D7990240772A203F400126846DBB116251B047CE4E7C41B148D11BB" + "6C42C90005F808A9DC048133D74EFF9E1C4944F47D22D96879A4CC15FFA34C126E7FFA7F7E53" + "4AFC54C568AA19C65DC607C2D0F4F313CC82F5C533B753B20ECDB06A7240BC7AB8FA8B11A52D" + "C7FDF8E3A1387240159D978A54ECE0039FE83DC208750F861506245E4DA3CB1CB3DDEEFCD6A1" + "2FCB5A4F8E09EC7C55D507CD603023911444A8751F35281096824FC0D8CD1A60967FA43E8B64" + "AA97F56A143A8D6BB32FF915836AC2336EA0258E7576B64713BD42E5F29365169387F3AE5427" + "BD4E22D44286F9819FDB92AF59BE6B061E61BF80D7433BDFD8DF210EE6966C17395B5B859513" + "B7A8E9A37EF5204DFACCEE1B5AFFB98B72C91967A7E9A1AD50", + "4A1B9CA1FE5133000F427BBB76A23E44CF900B6192851F7CB1E1F6683B5AB327D8F999F70D93" + "DA05DCE4EB6ADC4B169F15ECAE1FAD5114217251B15589D66FBF410447010133F8318D78EF5D" + "BAB6C7EB7F20D8F20C07586C65789F4F4E9CBF6E277131C863372C1C60DA92CA3EB19D9C36DF" + "E8C1498F7DE546969E6CBE54F2D9CB8748BA0AE79881637393C540BFEE69C99E9591ECF8C718" + "691918010907D6AA0AB82A6DEE3EFB309F9CCB528D9681DC62628860B9D021638DA1F5494FF9" + "67B1541ECBCE03E793315452C2FE13031F94047519F547DEEDCFCA9F2F8F259F46FBF63FE1F7" + "4B98BF9C953AA924DBDFA27848B8CD2CBFB5231F12DD06B6D4955CA8ADB63D33056EF7CA0842" + "BAD8B8D62C86B65B6E3414B559C2BA7EA1899BB9086A4F6744E5C444C888E9C8B9BC95842776" + "64615F9750E6AB4A0B1DB69B584D1AC746D7508414FBDDA8332F1B6D454EAA4ADB582ED23E31" + "2B7F4D2CC74487917EF6C925572A4E7F4674BBE1FF1BF7D8BE693C7D3E54FCEDDEF8ABE62B88" + "0A7E30321FD0D28AA33279F01CF4DE0AA379A7FCA4ABE16C71A102E7418451918EE05A6C52B4" + "CE7E4137DF1DED950754155AF824200626258638C7CDE26A5E64E59DFF40A8F273B1A04679D4" + "1744B874E6D3CA9F4D9E5A58A9EFBC64A0C5FEDB0E6E635F14D256C18E0D3B3184E323B91DBF" + "4E5CBCBE47A98D86B80C13C6C13FB5F8DB576EBDC7AC6307F32020388820BF7D9AE46AA36293" + "A10A22AD7E1D4DEA3E5A348ED5B5C9CEE816F26C3BE667C6F93356B7059BE1E34FBE285261B4" + "027CC89F115BB77790BC0033229FE14E761481BFB7A172C30D502F1907C0A2AF0DBDDB49628E" + "81A39D30ADC16B676B635CC6E0186DA9ACFF64CDE15C813057CAC3A8F9214BF5728CFA278689" + "FB72B8F4711DDE2429CE99A9534AFF5C51CDB101BA524AAFBD6E2C48FEAA1682E81D574DB5CE" + "3427595D4489DC2694406F8AC65E391E08F4D6A7C0B5C29B37AB3D32B3F69B3D3074DA286C56" + "0148B1C36137DF87E09E083A64B8EE51CA26A54C81F75D1ACCE245639611DAF255C7FCAC3665" + "56F32B0409F39C0E7940F739BA51A470AAFD6A1AC15A1BDA2AD968039CC590346DD4CCF67069" + "DBB18552C8735DF38C146EFCA128A608EFAA8EDCC9B0D9CB5D956BCEBF9768DD3A9CAB2F986D" + "15222963C8A0427FB12CC0B45CD4D476D5A08E70ECF687736CF3EA9CAD77E22493B71E011296" + "2B7BB199158C9D43F8E7BABE36B95459C86105ECBD0D9012E1118C975A4BBACC0690807E004E" + "A9820216516DA632855AE10E32E93C90188E784C6458A8D13190F388C049E4BA63843AD50A63" + "2DB45342020CAB9003F0084B019AEE92D7498C443A404D85E9BD04309CD154EB63EAEF38FE15" + "C98D44CC6EF6A34A4403C76E49223F75A9CABE79B6770B79B873882D5B715959D16819A46FF2" + "10289E34A22545B0CFA6A9CAE5D8B74FEB9EB54DD69CD86C99DB8AAFB88328A429FBB1418E7D" + "D6709A550C6EDCB07379995DB1604D19CE00B4DAA2DEC2D41AC2B5FAA8712C52ECE77814F381" + "CE7C8106A67B553361A9FF1D527ADC434E3512399AC5D77C09952B229C53B8E932E083C83F0F" + "DF64361C68940351B0A2D97065E6CB7E6A65E6AF66CA1D681F2B597883C4E3D31A8FB0114B21" + "DC8915D4D721639D6D9755C0BA0B42ABF891A3B5EFAA9252EC046D9C51D7FA9654ACCB9CA123" + "DDC47178EA76FC8B0F22F98A757E9424F8AE1A9F506409D43D9937F9ACADB0C03B19D636B736" + "B41DA865CE2C0B8A3496DDED87AA281F04C7A055861A742F6C", + "7DE73B7C7733A3DF80DC44094AC4451C5900692DCDBB1AB74CC4377D88642F7CAABE25441FA6" + "C942F390773BA4C50EF3717ED8E17F879113336EE9C8CBBCFF12C681A7701434320D65155B54" + "D6CE76255EAFB92BBFE7E77FF6E89D9EB85D299B757AD50FDAFD23E7964F833E55297EEF9732" + "1460D7D551E5D277F2876C96F24F0BC77596666C7BE6A22E4B0E96600BF0D443AB912A132575" + "55A7BC8D8296F8BB6354C75969B7F17CEA341040C1FBA6D23E20D8E46E7F123934248BF17AFD" + "B322823BD020D89576E7C9772A311F9C2CB5A5B2CC5882CD6A8C19BBD6255A499B899B6C2E02" + "1DB1684562137B4F1DD3521A15CA7BF272F1E1C250D56AF62F75E674ECA7BAEC2C652C49F0C2" + "8A28971DBCA4441742334991C56DF44B5BF212E1A7A905D314DC35ABFAD40BE307654E72A6E0" + "C7D02B5FD5AC3B28CBA095E587494FDAD22FB6A38992CC42E822253DB8E91451430F9234A634" + "375DE5372E67AEF46F56AB0A43878F4E4FDE53A8584ACBB8F2DEC846A2168DB8407436D991D9" + "925AA46BDD983156B3411A334DA5AD3439F88C54EE93E76EA91B040BDC4144CDBF5E8FD1242C" + "9C48FE76271B047C4B65DF8302082C573E8FED969AE32AC6DD1F6941B13DE5AAAEA4C85489D5" + "C22B0FD0066970D2744567DE366669AEE3D0F24F6936E14FEE4BA78AABEB06284CE9F77E94AA" + "7CC1F269E7C4BF5BF0AB5EAED994BA1D79B9176FFEE7E7FDD49DF57AA46E736B2ADAA8A6B04C" + "2C280EE5816348FF3DD3139776CCC889E1FE871B7E8ECF70A325DCEE09CF429365F822A47D55" + "3EF42611BEEC2332ED58DDB3B496009A38A2235290223B01FBC5CCEE3EDCE7BEAD50016F3921" + "F39B5DD6228673EFA090C840C08174D1E093C13453C6C4427D466C2D5FC96F091D16152F91D9" + "646ADFF5F6DC8AEDF92FD034099B7A63508D328D9A72E4C9B4AE36545F8682E2162C40EF3B32" + "7022FD15E367E9BC229609051F705FA3B790055B16E898BF04452D52C56631EBFDDED6DA553B" + "4B50B0C4DD80B588ED84208F2D862134F61673147134B00D73B78AFC110B4F853C9528D75A10" + "377006A8B45338C107C1B0F561A97F012C7851FEFECE1C7837EA7778B96D3CB480F1D54A07E3" + "9FB8278CD8F84BD776A24F82C8320EEF1330B98E3D1B915CE67788D33AB6669A07F099C4F3E5" + "A4377705CC08181FBC43F35E6B69AE6D5184058FC303FA922D058E33C15C9F79BE81067257E9" + "FA818698F6D878CC04BB5DCE219154DB1E5AAC6B3C43DF36CFA4656C2851E22B0EF445F2F589" + "B25C4228A44C2064DBC09EF32CF6252D6341B72A304359077600677F50E15FDCC00DDC135841" + "8A9DB058D6948DE699EF207B64C08644A2884749B235E9F445EE1A88F14286D4C4BE6D9F7847" + "9AC6AB4F1B6551308E775BA40663C36DE32C302BF2FD49CC102FB3DF2750798E3416892BF818" + "7E34043156CEB2DACF59F847BF030206741DDD84B4F9E47321FC0B2CCDAB99623DCCE7513B17" + "8E33A1991EEE0982683E48ADDD7A43E3663C83BF38FC0A5571E025A796D3A3DDCAFD83C70E6F" + "EFF143C6901FD2B0D5E1B07C10639945A2AC01DD810B5D629527943E5A1107EA3DB9D601A591" + "C519CD0DE5908C369E208436E235A0376461A15A5B954B6D6F77FAF18CD4695694441FA322ED" + "1B54013DB8BF41DF14120D2887B2FCD8F517E881C99B9EE0468D08E82C3F454D8EA5B264E9CB" + "3629962158CBDB3205817E93F6EA276DF5FF6AC4D3713E950D17121ED27F5686CC57C8446C79" + "45907920F165D02060426120BEF9CC288D775B39F0939ED000", + "FD647E1C1C001D1CF182875C20180024EB9E224258C72FE2A04D7167DD62730FDABA3C2C255D" + "FCDDD17F994A4F2D5BA33D37025CB1A238F936F4EF62116013B03DAB4B0E5D3E997EC6DA43F7" + "B0F6178308F80C152D27663F2BCA3D00732B46FECD27CDAAA5BC4D9701D1FEBAECC37EB1BB0E" + "0795EEB28B44B440D9670FE4229EB3924EAACB037C82218216B2AE4CA84E6884B7282FB151B6" + "F9D7F381330C1D372659021F4484126E43AB820F8E1DACC599B5BCC88BB1422674D5F9992C87" + "145285E3482409C0D3FAE0E9C619F4899A042B0EA9D1BBABB8129911AA4D1DAD44BCFC32954B" + "079289CB7ED2C73572EB6FE8D91A643A15720E0088FA3EB8943E04F2C1FF2FC431DEF953643D" + "B10C495EDCA54D63E532B68CA19F21D5EF43179AAB2A8457FD580DB409945CA0239BABF990F2" + "F97D75079C3CB8846FF42CC4F8992ED2C80284D58686A618CD03A48A9BF9EBD272BE95E8FB7E" + "B789E5A3F2A45914A7AF4F77BA72EF7797AF2944D12A7E2D3C8F6BF6F8BD4BEA725EBCFECA89" + "2E0598C32B0B0D590A009A5BA4C8F919A17FB108E9E1CF0575F4FA784CFEAECE2029D14C816D" + "80D5FF510AA6AACF4617BD5C27CC298B6A653E359529DBD491846DE13654FBDC611FA7FC1A79" + "03E148EBE2F88803827542E132C4D8BFB6BA75671A5BF69C8A4F06954A61F9E915ADC592AC44" + "CA40EEAEEC5CAB86A102CC897CC31CB83AFE581C8120963D0A514709A4CCFD597322146E8899" + "ED6CCD19ADC38F820EAE13B2410917C204D32765C186640E7F5CFB6C546FA0A76908B390A993" + "AA6B420C2209F6069AAB924E6BCA213F8734D81169168A6BBD4F0386EC6BF619BAEBFC5C074D" + "91ED2AAD9F259BFB16A67005E29EA7E33725A54180F8860F43786F7E12DB1BF4CBE5D38696AD" + "E06E40344237B97B64F8E22C69D20765E62ED5A79294CFF45DD9FDD521A1E2EADF867235DF34" + "75902A3FA718D21223CEB92000C021D70A0C79C5C001C1C3F135FFC2841E89207C16D35B40DC" + "918D9C7B517D67D0F0B46AB89612AED49DEB61464EB5C6AA9A732C2E3D638BBD58B818E8FE38" + "94FB26CF596730E802D251878C162B0F9DCCB450C223B885456A8DA8C1E4418FD4D4ADD5A321" + "A6A56E61BE0A4AAF7B0FAEA0D8850BA974E5DB57267FECF285CD1E94EE99F4422E33ED47CA67" + "383B79C7BFCBA9247B74C46D3736FD424CB914833EA13E2223DC68A434DA2C94B0BA9F073AB4" + "551CC603DBC5FFE379A2A62B6B79D94605A293A6755837EACEA4926A969F51A28CEDA717B771" + "DF92E9833107A94DDED4AAAF0878818CE1261B8B275FE64C1C93877F763ED26D3A25B4880EC0" + "98665AE3CA6A7731CC9C1DDFE9A63F18D7E0D7AAE1A4D5F4B993E45F004D1E16CCDDD94E054C" + "FB12F27C316E7342CE768C3E4F48DF32A0729BBB336878B200FA27C99D2FAB258755EB07EB18" + "FC6597FBB839338CEE5653C75A66190370112DA45CB64B7C6EFEE5C9383267FAE4D1D8648731" + "811E10F5552B7BB295E08CC19749FB8EEDE8E5B731458AF9695649257357EC1AAE65C945A062" + "9B9ED6D465459EC7FFA3DBC06338AA2D5CE0F95D0D29345B2C25163BC4447C857CC1289D3242" + "BF6CECB6232EDE2495D3FDE39EDC1CE653E2B7CC74422F99772978B3A14F37FE64EADBA72E95" + "D0A11B0575F0DEF552507D8676A56584C5ABB52B2BF182278315B156A2A11DC4430A2D33B9F0" + "D46831E18A4B40170CE69AF364DF291C7F17181D1ABDD1C6BC7434CE595563AD726286D7B92B" + "7548691D562D0F0BE6BE8ADE39B1893B02DACB683E04917820", + "BCB53230CDD9ECF6E5B0F0A5D60B14AFE94BDBB6866DCB11E4A7A2B49557F15E09384B7803CC" + "22D6FCEB65601FAB83B672C4018304152F5B9C6621417AC10374DA9D466F92CA4918E13299FE" + "31BB0FDB464E86B45BC9F85732AC6ECB3959463E07C114AC46FAF6EEA9419E389E6A8C60355C" + "58915D8607C88FF7BFFD128F19490C72D6986F8F053F3C46204A1D66B1BECE7352C3A8C03DC4" + "9FD68EC13C0A9C2794054A9E81B6791D3F24019FA2C082D349037B2366371E7D06CB378DC2A3" + "E098E3BFB4F8EE8EBF35CDCE2BE069C62866EA846992253A7D9F5034F740FF46CC4529211EE6" + "918F261AFE3E942F7726D91B2A3F296C1332C1A33286F0BA8C8F2162EFED78B52FA549C062D5" + "E2CF9D2B9B1EF7D6A6ED161C1E9074A4A49B9FC12C47FFFCA61F513846DF553118CAEDA64073" + "72AD97B2F71A7CB1DE9BD36A9D9C04CB6EA6311955F6C43915F0CA7FFFC46907F3B24A4A5C12" + "F070D16ECAD7DEF1B3A973E68F568C07254BE95A3D6FEE8D09E262BA1EC2998B0699906D29F8" + "A9B136C9DDE852F8FEB0C9E312CEF109294466C5FE05DE5815F37CB948932C42AECC28C72C0F" + "A8E76759FAE2EE3E5BFB8E320F8A8763D9A6C17CF1D8CD89BD81259682068BF30049F9713CDB" + "02F2A54053C872A07906E2D7F24778062B86959CE6FB1ACD70A408C479F941E3EC32D69C6125" + "31E2917FFBDFE227C0C375123475580C62ACF238F3052AEEDEBEC46A5107C0F8C53539A6EC6A" + "99D43F27B45AC2E4C5B7E1BB18FF32990E3124A693ECC572B65D8106BD0508CC73B5E9504183" + "00469CDB83ABF00D4DAE7ED68867803DA43920F51FD5525A8BCA4F11A76CC2DBB7A52FEA51A0" + "D74A1E1B4EDE6F376618995A7B6F0707243D4C7B22004ED65414A485396FDAE51CFAF333950F" + "67A1A957E22E1386B84D70FCA6CAD301AC0DBA5D4A11F3F338CF2BB8E5E6861451BC938BF5B7" + "6DC2A339D5353EB65F9C8E8FB67F6AAF27DA297A2C217145BAD2EF47E77C8D4148FB24E66DB7" + "BBB4A80925F3E328A0B8A8D3E27FB731FAB83FAE6068FB83ABF6AEA82BC7BC005E451E502583" + "7A1ED6ACC686A9603253F8A30D3279C617FBBD77DA8A1B7DCD4298110A0436912EB2D45D306B" + "2F72D683C1154BF5B7231B4AFB443BE485F85E242AA9E651CFA85081317627B451B80887D209" + "4D2C87FAC8025FD2F12DE2D80C8CB9B42A82BA41FE12033DEEE5E2F6F381C4F907232175E451" + "40A324212E847B67A41821B52D8A1AC98AB44D06B7A2B4816825D452502E569D2F70A2F67D1D" + "90746DCEBDAF2E07A942946238493A4577D1D4D9B403306AD7A66D65FC70679EAEEA14CF3625" + "5EA91B3CCA15DD5E79838FE9AD997AD583300B66CAE2FBA8972487118A50A57C1D3D6F5CED8B" + "826E2F9BD143BD2E5A9D02928AE905A04B517B582C8B5464D6146D2B61060979B7885D210931" + "40A289EBA1313827C8E073DBD1E9DDEF30121FE09750550B674C4C06D1ED23D2FE9004D7F84D" + "2CA412F84407628B791BA32042857CE299E555091E87E849F708B7D4B6313B6BF4AA20F05AD3" + "BD35832E8AD35D225B0814220650ACEFB61456FBAF77FA18E7932C3147F29301A55858CD5ADE" + "17B069029E289E800F78F5055D5BF57077C5819D7F0757E33B7F91F2C547414531F3E924054B" + "777B6D99C937C4A0AC4FB9F8BDD2D768A3A10D17A516F93D55BF9B7C5C4E7E9B5F2B2AE73150" + "EDBB6BF4724F628A1859E9C7753CC733F3E214AE976C0D6032D4D94FC3AC8758721D11FAA561" + "79BC2A7333D7CE29D6FDA728494A0A9ADC8011378CAF093838", + "2D98474858813CF0E06C4F46719E9919CC9E69E5E5BB0DEF577EE69512CEA3736C0FCA5B2F2F" + "6766B5DE98318F9F4D6435821466959A821C9AE0D099EE5C84BE71349E4AD36CA61C8A1CB5BC" + "34D74BCAD8FBAA7BBB28EEEAE4309DE57BCD852F4ADBC63C198A76980E24E4AF378217FFE88C" + "B39EFBF76D9377EFB061D535B68101B48C8F1269D513EBF2BE2E8A78C7447D0CDD7C8D538951" + "250D37497FEC60E423A5C260827EF089EA1FEBA307F59ED4382C3A42BF2008711A05E5F52DDC" + "7514414612D71D9D9E370E730FE5C5B9DC291FAF3504ED8787426808BB2BD57F212E1905B20F" + "448D8140AD40EEE052611A81F421146898EFCA95F0500D471FE91ED16AEECBFAD58418F8677D" + "016E80C49D1411F1EFD3BD01304A02A547D8F4B41876CCF21550762457D3A302B061710F7675" + "985D74335CDDE11D0C1A818B97D448DC15509E66DC305A5E37C54A80A419017B97EF1F105172" + "4602ED017DCC3E304356BFA6EEAD16F12FF1C560141F52A7EE322C51085F02B10C940EEE056A" + "05036245E09B4130E909FD57A9BA202C85C3C36E4159EBF128773B474FE19CE1D8F37371D690" + "C504515C77695F4F40B11C2009FA84B8683856F35FC18BAFF0AF221EFC820C874B884E0C6FFD" + "25D96149152395627D76617C45C63CA2E8FA9FAF91572C91E2625B0102DB59570C1BEFDD936D" + "DFBEF39A622FFFD083D9EA4E48E032DCA33078C7B6A5E94367BD4F72184EAEEE29BBBCABBE36" + "A7A5D6587B5A70A270CA6D96A4F2591CFA4274EF32160EB27082B352CC5083584D65F3E31832" + "F75ACDCDE9E9B4A7E06D9D8AE69152CEFDD5EF61BB4F4F2CF2673132F31CC5E46C0E1E790234" + "25C433682EB06CB7FC22A416398A37B4DFAA7D725365E33661AA71E770ADC5C604ACEE8A3939" + "6BB454DD9240128B83D7173860A590BA56247957E806406F14A132D84FE6457294F749C98015" + "DA0103B7AE896D9F057F8E495BE19C2F9EDF5DAFCDF8853C268FECF6512B0A9FF648A9F3120E" + "5E6A84D6E499CDAF4D230F08A35398B5A75D354EA5983F56FAA81F89D6B14CF9D5475FBA3F86" + "0C8F44903312958621E9F4AA868FBA3A25D11527194AF9A1D7FFD723831D6DF4C114C8ADACF3" + "D27F44FF582EF61023605CE82324BD0D9B5C16C0DDA9CD4F95EE4D038B5710FE7071EB6E23BA" + "28BE9B19E8AEE561CC827599B1C0AE969BE250AAFFD0AC6976D61DAD84B30C13432CF9222E30" + "5C10CB422217E041B7A7602B45CD27EED0A23DFE728EF5AD5F2CE5CD897CE16C8EAB3BF46A24" + "304585ED21F7D1449B2374D7E2552AA63D9F69D38756653366933CB19E845C9A12C618D2164E" + "885E634F3059B3299AB872E5BE6F19552A91FACBB13648A2FBE12DE8688309158BF7355C4DA1" + "CFA46CE9CD3EAD6BDC539FEF1142DDF92CE8B501B97B6081FA1110B4C20E831D1127CD30B20C" + "33486D6E1ADBA58D42FFD54291F65A5D40E3666B904CE1A9DD45E6365F4517711DB5E3839FC2" + "3AB4702C9DEA7CACE56EC0DA0EB66C2F493105CE81B1021BDD06BFC8BF92F3CD6D44CA20CBED" + "AE30713AFFFAE167D4A6392A22E917177C58554BE5E1186A52330248BC4C187F177EB8AAE7CC" + "A35AE47E0557DABF06695CAB2EB96B4672B1443C312CBD6CE649DAC8559E9C1233E5449BFE54" + "35229BCDFC590F2847ECFD6EBEDE7D0E61F6A49C7FA83E6DA45D7B702016EA0064E4BBCA53A8" + "99FC86D3214A3D809805FAA7891A97426941873A3AF0745200926ECA8B75A727145DCD4818E8" + "ED43B9E395619B31E9B293AF957ECB7B14671A09510FFB4D80", + "B279443EC7F684524BD90E4FA348AD44A9ED554DE00AC3710FD75CCC142B09C6E980B8DB1C25" + "862137731EB8EC363D79F7AFDF98634E3989ADA30C4989EF4B250E65D132DA3EFCB99940D804" + "94E7C4750C33FF3A4BE1D89FE2FFE06772EBA5D9672811E6066A0335D7C2FD9C1FAD034FF190" + "601BF20DC8399E8E4E87503D1F90FD6DF4E0AB21B1793DD823FECB7786B0628F22E3255AA6E2" + "961B8AC96350B94CE5E8E23B4A1048E611A7F9330A668BA8BF6D82CA018CBB28582AD3672908" + "5CF0D19BADD020A454801444CEEDDA92425C0A60142F434C1892E49E1BD6F9480772A3DCD14E" + "53BD5CDC39EA365BE4178E0965B2FA86FB5FA1229F783F0DEF31EF97A40D3CEA65040E42A3D9" + "6FE52C5B441E280B83229121F3925CE0CF82F475E20F77F9821FA83BE3D8EC89733705F42490" + "376E820BB76049217D07667489B8DE3EE0AFC20CFF77823D717A0F9839D24E7C244A260E80A3" + "C116D1A53FB4DE2A13810532B9E5812F4FBC67BD87E0F7CA242FD6FB0AFA6D34838F413ED362" + "BCE1D9D5EE539459DE2A770094FB5EC3C93A48C19617A1403281D2124ADDBB99114009512820" + "5DAECC5879D084A7365AA0D0A6E98C029A0DB7E8AE8B328664FF2C4338904296E238BD3994E8" + "56349A8EC34A3B2AD5263A278A306B0F769BFE20DDE4F46C26A8397DB5F84FC5E0570B938BCC" + "E09D827EC0304C7F9605AFC1CDFA1F5D6602B3033C40A734DD2EBA77303FFA3FC8DC3E92E7FE" + "6185711F394900D814CCE9FBE2DA645D33852697BC8C91862DAC8CE39630CFDFAF7CF5E361B8" + "EBC67764230D21C6D8E80CBB1C86A14199D75F84761A803D9555BCA915A8962F9384DE92510B" + "7F1BE114F26F5C12CEA362FD8BAE393094AAED9D3D05282EFE2C3B968DB8A871B64F1E315A99" + "0AC15FC77EA388BF9A563C6C8EC24ADE404CDED524664CB79E3BE39ABB4067EB83A70ECBD734" + "DAB0E58C57440AE777DAC4080F1FE73F49EC7B39AA8EBC58A9F172D1858A7D9359311E674A0B" + "72FCB32D1D5D8192B5393CC7FB18B4F0ECE03695C9BDC253BCA18FB8D5BBE7E1EC7E808CB26A" + "C879D5AB30DAB513515A2CCFA191042C0C4DFD6BF008B257D4206683EB3E7B5527819B61D962" + "23388C4456AFE91CF806B1C9C04E00896E2C5BC2ADEE134FF2D484CED504135931DCF513F244" + "9F92E013CC531CB1B28DF91716D49786F64697F0244D63C595102D4F7D1FFA48A04D564A79FE" + "F225858F9992DFC2FFEAE5CCCF59DC861572EE6A65D58D4D951E60DC773CCD59A1CB44A11FB9" + "60B75AACC0FD7B9D65316323DD42484CA78F97E2509AF7AC9DC0656D2555F065D740C00302EB" + "A60FAAA4B6A603B935EF590A47E9F1E5321242BBC4C68CA6B9DEBF03355AED069DF88522D385" + "9AB33CEE3B0678A9B2B1ABA656774EA8613B9AF333A757FF43FB4999F1A1A44F7F9E526AB205" + "125FF8BEF2B408A9A3C6B2240FE9626F61E92B68E89FB14D8D38CA33C80749F9224FC8AF3B8C" + "9AC820AB73212B4FF2C877B543DA347691007203938D601F3897F56A22311CC4469B86D981E4" + "AADE7CD7C166042BEA4D100FD6BFB23034208985F3345A8AC8AD5B0CD5AB9E13564D31017E37" + "87E7DDAB1DF1853DCA43BD93A96C07370F2D18DFE33C9CAD4981BAB8B4CD3F4ED052E6788C98" + "C9BE51A18B4E8F951A3D71559CDE3792FCE7F8F010235BEEE75022EA31A70D5B2CEBD370E5C1" + "D7E602DD59C7DC79ED326624AB7B32027B524371363C6A59FD11C57EE3FA8350995A8C78F26D" + "8E151DB169DC347F7414A0BCB9B755290C9C75D1BF46C57348", + "F8263C56DAD889A1458CFFE37B74BC8A0902B58A753A842D1A1980DA34920DF104564992D081" + "1067396CA37566CFF967C3933910D550F028E6973CBED9080913F1BE5196631D93137CC78B64" + "6D7681F8831112FAC9057DDEF3251D08463E4EF0440E16EDCEC87D5E247AC8D9A32906AA9E82" + "FA0B9A6F94B317FF1191ABB7C8C50BC54B60B207C10E8B3DF8C4A953FA3E2578360695B314DC" + "3D0F84292005DBBF91443CA2CA1B855D85D508965765FED30E9788BB51C0AECF472677887E18" + "DC802283E94F5341540CBD87537BC913C9DDBB73AB29BF1ED17E897BAEA9C01999CD2106A799" + "3DA32FA612B5452EA35F45138F8D2D8614E979B7A8B9BF67B0F64867BF6DC6DE69847C8F670F" + "B4313C934CA3FC62AE2095A9B3D3EA1A4970235EE3D6126C00C35649C97EFDA9A426D64EB1E0" + "C4CD1C6B9F0C63B2BB457240A0E984CC3AB3D08437633C8EC9E880C9ADEF2F9D17E006FF808A" + "0605710C654BC67A06222302F31E953184750302880FFB003F45CFA7BDAC9808BC9B89E63761" + "085E6AE1990CB828127516EA6E3187CEB1C599183C6B935B212CADFBF49C93561801B2435E3B" + "D6207492C2BE5E6CAD4823AA31FE299649E4616F873789F10CB3DB1DB7EF3093786F37ECE8AF" + "6CF4B9430DA58F8E4517D62BA5156A432FA62DE4CF2B0425DCCCC01CABAEF48BF45BC7ECA6AE" + "76EDDC9E449EF6570DE98154165794BE0A2009D8C3F08F7327179BA81C56E88F4B865BFD3753" + "48855D0DD50EC29A29E1144FEEDD0024A10F85E1D9466D4B0360F523E2FE54A918FDE68B841F" + "026836951E85189F6EAC4C47FF46694FB2CE82FA0BCAAB04A62CD89AF123D5F09B9DBB438110" + "7B93E31085C5267BDDF5049AFA444608FC0B75B1368F19F6464DC6334C53EC7E448084DBE9E7" + "4B38A078555844E64E1F34FF9B357629B4E73044085A4C9351047D824962D80CC2C5A10AE572" + "8D6A048289E976F63FF98D142C88DADB51E320FA75615FF8E14451C6435A487EBF52773CE973" + "09B944F1C8C2219BC8F36B3DAEF9236E940DF50CB9C5299D1170DFE31F5D62095A8626528BD8" + "08E49C94B52B1FCD9DBA67B8011CE0019BBD69C8A3AFA060A76DE7CEC5B97CEDC147BF5F2A89" + "6EBB9F9D619C1D2E43E50160C0C7FEE6734FF39F2FBC2654FC8369FCD284DB7EA851FFF400C5" + "AB6AC447E2A3BAC8AB14D82A1DB7AA9FFCEA0D70CDB37724445CA5A1BC03801372979C50C195" + "EEBF95EA245A946EBE7DA5378F61039BCC526AEA75F92C58474E843E31607217448A56FA759C" + "88D2FE730778C7979C38FE3A718FABE5A360A790F2AD556695A1A8341D6A79934BC11C5E048D" + "A9391EB2EE9D0DC3D18D8F33FFDECFCEFBA09C334D159D0DF91484B679DE6387B11CBE523C03" + "1326CEA3C57364C8C03C4A7D388DE1C67B9E6D21289FB0B9A8B2CC3905DF73F37BFFCCF1B18B" + "C3B0B9774D789C95B1207A3883D2C99E56B82C1585A966AAB54F09E506C5A7D5F18E5C7F1C39" + "E9E31EE0CE7F4B1139AE5F6A5122E84E068C7C2172E21A349FAE57564A33D9C086F1ECA5BE7D" + "76295A2457A9FD77A9830A39E94EC801C03D85A53A2224EECDB30EB0573FF955EDB8541B28D5" + "135DC547E22356D5A3002FFF8A157EDB214B3F96C13F2A643DF4F9CFF2CE677FE3030680A7C2" + "74B83986B9F9DD769154FAFDE283B73E9DA373E7B6E50605F5C51396BDD9800738801DE65DB9" + "B3F8D4AD293927101BD14A64615A9046BAF8C7FB0E88B994A39D30AFB02976C49F75BCD6CF13" + "D98443138F229D90CE973CEE4AFD7E125AC2638A22871FFA84", + "C3552C28CEE2C365BB25196F6AA74FF7645B8D3BC652E57F2EC00F5716EA5E8E614188BD8537" + "F33AE5466FDFF7EBC4BAAB4C951D79EF662F47BFDC644A71262F656349277703AFDFDE3B14FF" + "9D06ACC9823E2F12073A35B63558E40CFDD2CA2918E0CC59EFD339FE7F1BCFE3C473D3963FD1" + "50C201E25B800C4085FC03ED7AF2FAE26FE85896123D6E00DF2A5AC7422D02E448E6CF739C6A" + "C12309D9936882DCBC71B76A26EBD8014C1F95BB3CCBCA5FD429557D8A86124D6143EC4D37D2" + "BEE4F4EE49A48276D2B5D998BD0E2B42B5B1DE9E2D198EAD27030B6D43500C8731CBCC3E1D5B" + "D86C7C09894B9137B6E0B4FA7767A985CBF6603DA2CBCE59A50458402BEB97C1C15692D45E9D" + "354E1963BF9EA439C70B89A0C2B1DE906FB04298A33942DC94E503C3BD25D18736EDB07DCF46" + "F479CE85245CC47DB8683CB82A31E052F3A8670B61D3CB36E2F10658E649AC292EB59B366B5D" + "250D6499C69823D1DB34F2E1B4398573D281E315074F05876F88CE89285CE78BD8BCEF836DDB" + "3862E92F70F029CA4ED0A7314650837D825EE350C1647438E7095E7F71A61CAB2E5E8AD25AA0" + "E0FA75F500868829669CF4D16F019BF4E86579BB97CB41DB7B2274A4640F8D86F6AE1F0CF4E3" + "384C02B0ADB430392D5C662D1E5EE36B50B51C2F4666EB52DB9049649DCBC9DF52FB2C8DF0A1" + "AC9218546FAAA50AFE94F4CF376A7E0CA006F5D915BB638F4ED045B266E43120D58E73BCD9C4" + "89D02D10B8D6953EC01DAF121A4685FD91D7D3D7ADF00FE8408C007691E010C2A2FF1A72F388" + "F1FCF63F9FE732FDE68CC1C62514D2EFCC09C6AB1B6B1738123D1F1064CD582E7FCA371EFEFD" + "703BB924B1A9BD192394898EFF78BD19BDE7AE2A4CB55748F5FBFEFD98A9D733FB286F4460A1" + "9C5E95DA3ABC00DD3FA9D298F72C7689BBFCB955BDA6293769B0D1DCC50D2AB0CB73B5BE7DF1" + "FB5B58B16E0DC9ABCC6968E4ADA4F2C604981161259499580D93E43582CC43C8C507AFA81572" + "ACC0E0721592C36E7A9763EA067D7DFC62290F4862CAE347510BDA71F10667722725AA337249" + "3F11D5EB29BE70E0E67B69089B2F9C459AE8A435547C59E025ADBDEA22C6E12AD018CEA285DE" + "BF8B886A09149E0F7EFFE3F980248BA17991BE0F50C9874B28A476161FAABC307ACEE4983EC7" + "4D999B31DDAB267A94F3CF91A900B108E02969B313B33422E390851DE6C57341C122293F3832" + "6555FDB0857A2630B7811CA5C64E2A4FAAE00F86C52FAE33458D0E9C8D51EB6169436BB17651" + "CC835F26CF8DBDB7B2FEAFCA64D2BD1EF3855BD02A815D5EC66D30134C1960113A0FA5D2408B" + "52E6059C766F249902A004DF9140CC53D9C36EFFFE703EC56A02DF1FA0A82FC7DA02B51BE073" + "FFFBB61CDE5198144FD9002A04C927B371CD033A5688125D2F82E44034C1964065B31BD5D40A" + "A05ED50E7BC5EA59329FABFA6F6DED8F9B27D6099C53746EB614B436BC5589CB858D1663AFA5" + "1B0F803AAF92A3931D29C40F686322F5086DFD553260E7E4A2241C16751B3DC5084E3A21666E" + "466CB4A038846804AC4F9E794AF326ADDC66CCCD971BE0C93B9AF061EAAFC3437128A6970C98" + "5783EC4CF42E89200CFE3FFBF783C94482B08E8FEBDD0A2B98C05AA43B1A22BDEDAD203CD1F1" + "556128BACD11CFA6C884B6F3383873ECA6BD5C47E4927662AD27227733047C72DE8457163A9A" + "309784A231FDF5F302BE374AF3B61A4D42703819AA7540AFAF05189E119A0D613E4D84D4C94D" + "243440C9031A792DA938B4B19EAC9D83B468D6D6FC7DF3ED6C", + "65F39351DF6DB03CAF38D6952D2C0A9D64A4F0C40F82747CBCD9693DF0AB6758925FE127B624" + "A8FB2292372ABCFD161F53E71A5A46774D59F70310F6BCB84B50BD902973BC6AB5F3878B0077" + "2E64D210A679C96606B07BA670F547378562E1A54B7891F4154FBC79D7F29594D56AB54BAD32" + "DCCBCDB51BBC1B3B5F374C85DDA49836928813A0A62DD3BFE3C82F92EFA8C9D4A498FC8932A6" + "332BA65613AB5E961427B5E193E203641E3D0B3D156515C03132EBBB72E8B3F2C9055E62FF13" + "639A05B1368A8CAAAB130BFF6DCD0525D3181A12DB484552E2BB7C812EBE24AEC1E08B9DA411" + "EA5390E5DD3F930EB174F7D62C26814FAB700825172849DB67AEACA21F8124D559D06EE78A8D" + "F1F169C54E505B4233F3B0B9DB8CB214AD38334DE631F3B9CE78F4C0C17D1116520940C619D3" + "6B1E8F8BAB88461179087EEF1AF4586647B6D06198D52D2919369BFD086CFAF85772FCF43957" + "6AE1DF354F4B3550F5D290E353A794F5E0D9BFEC44676F1744463AB2B775434FB64EF726DF2C" + "2AEED4D5C6222E8F6E62237FD9B07AF29E5CAC7094BAF0AACD2F2ACFB8756EA9C2F3F4EEA1F5" + "F3610BFD96C9894B4AB19860B6DE2661A2F58F77E109E886211D5D1F178D6CB986302904A688" + "8BE83032F1E739DCF8C67B2CC1CB5284D31DB9D0DCFCC42DA0A72A3968F8FB151E7760B9AAB2" + "481F8453575E6DB9214E8A4100ED5F28164346BEF2E8D70C9FCBBA709CA578825B9D10783752" + "47D74813EDD474AA212DB485818CBA4A0B3B6FFD0C8D55531516C8DA059C6C8FF467AA0934FC" + "D174EDDD74C8C03A8A6A8BCD0BC7826C047C987ADE428697AD5C86A65D4CC654C913F19252B9" + "315F749F413C7FDCBB46505C811496C1925BBA132ECFADCD83DD8ADB3D33B4CB5D2AD56AB29A" + "94FEB9E3DF2A82F891ED2A58746A1ECE2AF0E65DE0D6066939E65084B2674EE00D1E1CFAD563" + "DCE9409BD0AD21D3D6F08C0EF9AB2EE625A58E7CAF868BF3D54EC4944DF15246DE487FA491AE" + "6D50FBC969B3D3E2E41F0230F2526B95034B4A96B1CF53C0DB6FB8AC9CFA6B72004D4003B864" + "804E59BB761E3666F41FAAA4C8A0C26F53F24B8A24A76499E91CD751439A5E3A231D1EA381AE" + "CC43D65B8D7A0A370F78C7F89C7CA7E16FCDFD44BC3BA425DBF68180C7C3A35C1E726F6C9604" + "E6B89000C267092D64819BD262AD6FA89FACAA7A16AD45868843A57F45B67B5F01F1B0168423" + "B8773492A25781F1AF0981DFB908C896D4F8D48CCF3A18DC6E52B13D305E7823B057A4F5D3DE" + "F866525CA4BB911E263914A3C40D9E8EFC5C201FF6075D40B269AD578F39F4AA9FC24D94149D" + "C83BD85EDDE1AB2220FFAF07384C41810CF5F1F86E06DF2F5BB63D1A4B6AE924302638098CD9" + "434974111FC62504095B7C4EF8B71831FC06669DD5D915BCDB13E0F7FFDE0F91B67B51375772" + "CCC07F1831DA3EE47DB5204148C7F1105D258536632038C818492EADA4B178DBB5E9F6C0EC3F" + "1F5E6103046439C1EBFE0889AB0F76F437B8277250536487F2AA5F39E3D56B2C9A0575C0DFF0" + "08747EE2F360478A5138C8F113BA4A7494CC3EF7975E4BD41B883CF419791A94EC7630B9E662" + "563E56D226213BF70321EB1F03D48A9259DC3B8842D01B1F01F5BCDB45FD4B8422C3456AD0BC" + "AA6BF22BED6A8C97B3024D6921CC8600123ACE40D26DEC9CF0758B87C60302DFB7484BB87A45" + "7F67ED0FCA7C723FC61DE1D8A0BD63B4D78466EB038AF17188B8F4B38515D6712F324DCA48A3" + "A49F95EC860A264AABF05ECCD8F0DDBB34E4024C3B80056400", + "A8B820DBB46C10A3F17FCCA96A941465E836E769CC69A30539596617097527F8BDB08AB1E2CD" + "F455E540F58CFC355C8C00EEE23DF3AC9ABA7F10D3D824F50D88D0A5D15993861525921E8873" + "6A7878C98B732E2DDAED54FC06DC98F22DC75E88D216DF236D98BBC1782249C5450D9BBBD778" + "E4236846FF381EE6E0BC14988B6018A86CF7DB6F40A44E1E25180C4161CBEE1F6A643FC40E03" + "4097EE2FF1A46E37BCCB3069A30AA9380A86992DCCAA04C4C892B85319571B361155C8AE0E7E" + "E44DCCD3D406154FF98D8162BC26F242CD72803DF3E1E96EBC1621C44999A2BB3760727B9EAC" + "1A25546964BF0EB1AC3BADB358ACF3F5D179A3BCE66ED858BE230C4FFEE62BD8F5543B1E3902" + "B6DC6CFC0F119311E07E6C76DA8138F1B8555E37A8CEFFE46188FA3436ECCE7B8B3D175F9E6A" + "359B6BB86B1AE1FA4D2C5548B06AF3BC9C0DD9BA8B33244708D07AED2F0F9F78029D66849EC8" + "7A8D03633FE550C0579667644EFCE0EA275510D9B1D531943A92264640AA676932C2A0392AA1" + "8B2C19A67BD8EC4B1FE8EFD20580E047F84CADF0EFA70D04603148F0E44A05EDB7DE6C2A300D" + "A232507A0ECEF039FEC42D884E3DD7BBA361454724883D07BA336D89F6D09622F5C7689E3276" + "C07E556EB768E99DA3263C3CAD9C22F0934950C39335174A1623615E48379611FCBAB26B9F78" + "8EEE006275587E635E054F545F668F1AA21B7A3FC95D21D0CD3539418B2C672DCED82F4C5052" + "AD2A67FD1F8A106C5BB6083A2B4B39E7EA5AC86B7D37B1116B6931C250992D55EF9DB0B3D255" + "B6DB4A4D26BC1B398496B41C74259C450133B1ABA500DF3F6CE25A92CFBB1B53182EF6B3F306" + "EF0D304369D8319DE3266E58F5FBFFD127BF57A99EF2419605532A2B099EA5273A841BBEE8BD" + "9FD6C30DA0BDC5F24CF1646ECB059E18AB8F92104FD8EDC65A1A60A8760867EB2E5F6915FBFE" + "3FF57E68413B574C6796E538EEC052E27002848E7301DA2DD71A655670DE940F9063A5CD3C86" + "7D5240B1C7E612D0FA73B288A8A810B994226E1AFDDD71D8C358FC1AD9AE5A95D5492B65F918" + "8F560F3136757B1F63A3A162BD5C8B2FB2CFDFC244EB2621ADE4FADDEBEB65A1A4C5E47E04A9" + "8A2AC058954BE3C8D0650FFBC7603A9DDCDF2A64E43C690800D2ABC7191BF2543D2B7536B0EA" + "DC0CF9F8AB867F4F40D11057636F5D38C715304B386B615DCE76830C4B8BF596758D490E0C04" + "7D9A01111676A4AB31E31878D6E6D9364F7238AE2931695E2B4FA01839457DF2D1D58001E3D3" + "AD72F1E0006AE2D3EFA8A706017CB51EA5A3251D4713BC9B26D9DAC78631E335495B9A222016" + "6F880C1C24AC6B9A6BF4748C305B9CEEA1B58734832A38C72EBDB1BA8222C0BCBF987547E7CC" + "0ED5C35B2BB52F0A93F62638F552C004258F09C9953ECEEE5701B8F7FC2982C4F1F4AA4680D5" + "1465481F89E8C96169B5F5EED7C9ED611935C890FEFCD37D344EAF51A17171BE37AB9B233C1A" + "BC4627E9B524AAEA569D66D60FC6B0C6E3AEEFD61D910A6742054544537397C2D219F8E34092" + "AF984F2CE971827C0A5EC39AA9963AED16E0339C48500391D280DDC729DA798CBAB720859FAB" + "FF1FF7EA25BE9D35F9841B8541961698EDC6FC82127C75461E6834DD89A3CC93E8EF416C30DA" + "FE6F45DF76085739295E64351532A81A6093DE657ABF7922FFF7EBC69D9931EE6306E5B0832C" + "3DD833F35BDD0632B6377CD25691CDBF3EC02975637320288E690B8E0B5A4867360F592C94B6" + "DB6A92F3436E7DEAAD264290E325B5A2237B2FB584D695F9E4", + "8417EDE38C430CD24F6F17969110DCF7666946FC9209B11AF62A24ED9188C01EEC3192BF9B7C" + "53E1BD7574811F179251E8E78FF6E2FD2D2442DA6A499FB0CE14870B83CCD9BB10D8D08C6309" + "14DD3056AEBE2CFE2A921F47C445656162B6F284894C951C0D11D9589F6A5EBC7960424D9845" + "D9018FB66A560D76B22B9165436F0BEA0F1B592E917FACE569EEA4E2DEE13F4559A828779F15" + "41E96096F78B74A81B6120AE52C69DEA21C2FF114FF519B0011861CA15C707C47216349B894C" + "3343CD1D3223DBD1912173F574C40FA226732DC85F90C8A40500B0224107CFF9E3D5606FBABB" + "8EDE064F29697DF9272E0299FE4AD8429BEEC0DC9E93C33652A1F9DD0F39E1773F0A94D98792" + "F27606EFB28436A4FF3280E9C93F7D2D29E4C0F6E3BABBEC0D578F3FE7C104881A01404A2613" + "F427699CC88BE0465D5F9D091317B78899716785986523B258D09C47C1C750A70C31001B315F" + "E511FE8708AF72C694EA090DB02A5DA3DED20D2F0551F3DC282B3545F90EF68E4AEF2D4E6BFD" + "12E935B1E0AFA1ED854D13A89ADD60D4ACDBE30137443364840D3C7AF4ADF235371160715265" + "22429EDA8D0D4D4447C5F092A8FE68FAEAD4197651218C62163611BB366783A1C250E61BF324" + "ACB68449697E8EDFE3CE2F1493D1F1025D5D7B0F947DB3FA93186EF00623136E48A8DEB11B20" + "927EC52CCDDE761112D3D1EDE4966184638F6FD043F908AF7FD67A7CC0DC261905019B51E08D" + "68ACA6A2E895365718B953DDF42A7A0FF6BD6AAA7447C7ED316C15825F98818D2558073A042E" + "B096250D06BE869ED848758B822622EA8BABC7FC0FCF5CFD86DAE41DF27D7CC715BEFF0214D3" + "A3013F85CC7CB633A51228EDB4075B994E310CFB84FB57ACF08B3B3B92CD88BC04741883F06C" + "A7708CF3963B84542C0E233B5EEA62902A33D9EEA1137164F34161843327D14BEB30B23E90E9" + "B7A5F9F9BEE87694781B451095E08B26AFC10B1303E0EDEB1B219BD931A1C3A4B1618F69E93D" + "2B3007098C499B1E71A3DDEA78BFBEC243E71A273825E87026A7FAAF093DEAEEBDE4E2EF58AC" + "350F8C5D777D52C0C44B85CF7C45D5C5EC941233BF69267D6CF33ADD182A3436EFFAAC96CA93" + "8354781F56C8541128B7F03A7FF56727D5E4B1CD9DE1951B28CDC0DD77EE825C814D845E0F22" + "1698AC795F527ECE6E9F2F14BFEDF3858D16218696268E341D460A5B119BFFB47C1946A228CE" + "F5861769B8DC5EF950D7F5F2BCF1B7B05FD47C4968C7F86187F8C5A48F8AFE837B63CF53EBFA" + "C2A7DE8EC765BA186BDCC51158A60F8B7FF662369418AE0B1C591A58611A2C6873EDFF4A3D3E" + "5D9CDF92BEA78D465A11341E886CA04E905DFBAEC0ECC5362A61EE6CE349EAF939ABFF9703FB" + "45220A84DABE078AB07254DA4D57FDDB0B15062ED733CDAF9925BF73120A4DE8EAE88FBCE874" + "88C0D2AFBBAE8C7C2B0D46BDD1C9EF5DD5EF243D57F9590385E907391639F090DF7F4795EEF1" + "639E36648C643803352F25E5BC61A34970E16326F6613635EDC1F0323420FD593441EA4228B6" + "078A5B85DF67E7E97B65C25F134335F4A2F9330861A0B3C9A3B2215DE6F315025195DEB7311C" + "0D0A88771A73CC43B94D83F0460B880F446CD277373443CD7AB7C877CC231CA676B80B6DC512" + "29731B4F8CE87F203172CA103FDF6A38CFAF93EE09D6D86FCEBCFC0FF8F57455D11910746B84" + "86DE585F582C291A435D08173806A92C60467E906A0DA32DF8F88B9555AF5BFC17950BEEF2A7" + "463A9B2A45D1594D45AC41E2B6602826190EC0CF979AFFBD44", + "41A7F3D22D47638553F7A985D36B67EE6C61CB2DF857A97E41DBD761CA9C53EA5BD046A53EDB" + "7DD90A30567D93CE7AFD67714270C7FE1473EE57160580B924AAF602262C044E772F9AA6A8CC" + "F05BE6C3F656FDDC4BAF33E8A93E58FE455A719A3A90B5CB935A5B5AAFC73DA6290A9CCAF975" + "A67D0D0283C5754D33E6972E6097BE0D5CF1D2B49BB70C5DA4B254B15254ACEDA49E8CEB3F4F" + "9DC3A216336D32538BFB22E196DF16B87F57BB2EA32EA18F01F1C16743FB57E17BD653B20524" + "1018FA345159DF37A361FC22B213A9A61994C412C83081CCCCC418ACB197E8BBB6EE9AC516E8" + "26DE0C5858770E65CE06602CB9F3AF2AD2A4604BCB182B9884BCC42F883EDD905356A9849B2A" + "17D4B8492B4CB2562A01EEF8176956AB2C3C686F9AE5A8FC937E4B5960418FECA4E7F2C08725" + "019B646EF7626D980A4E1034FE72537F182069AD27EC93F15A759F6163C34D56A96E81F77805" + "46A4D32D4921D2BE854D921956ACA09BB7C11F4233D2119D418D3D206254B54F5CF9D3406607" + "3A670EE1A1A307B641768A359776DDD17E98D3518233333810C13482329986595C84D443F86C" + "5ECFB9A8A2C5F180824A04DCA6BDE87EADFC2E6838F80F18574C574DDEAFE1D68FB698744DFD" + "1CA4CB6CC6845C3B9F2FCD7317925B7352A4A8D2A4D25BA30EDD92D4B8F3AB07DE90674E967C" + "CB2AEA3C140B0BE65AE9F5339509465BCE3F55ADA5AC9D3AD095C598E5AA27F1A7C9517CCF5D" + "23BBF6A6FC367DA0F33156559F4EE72203464406F55249D01A068EA77CE287FE30E428EE6BF5" + "E73C9BE6A0C509BBEDB7CA5620BDA57CA395386EBDB827E95EA1FB4D3863677E6D6CBA195EFC" + "AA1C6E2B44BCFE582E85B9B301D1B37D4C8A2A901E65211363E36729DFEDE32C4F280693CBC9" + "2D98CF2DBE71261FD76AE098EF5E6D6710196BE774905D08A4D53EC1549416B33BC4C52E1247" + "C98D31B949BF8B412EBCB433EA5C442E9E12704FB78DABA088FE7137260D039C83121351493F" + "7802FD9D2E2ED0CC08923250B73C8039767E018FCC0AC3474D72FAA9D467482773358BC7A47D" + "67B3AC5C8E48F7FD168A0B7F7855B210EF074C98A9AC8F27CDAC7FDB4F8158DD8D7527FC7124" + "EAAE3D2DFC7BE4426E718F13A0C3CAC6B110C73F8F64A53193E00C554A3B27C268868C6A123D" + "8CEB0162F66069BC2B1DFFC2F5E1D7A003BCB9AC78AC4E88E0EC97C34DAB19AB7D725A3DEB2E" + "91229EF505C3D2CDE30E908965C6FF5AB26FC98A25D1D29C4480215505CB3171DD5706054768" + "55D51932EA14DB6C8F8927185E0237867276C39663503A666A7450CADC3B04BD5A0A682B11A8" + "2CA0B57A41B876A6145CACCCB8158CD386DE9CC3D880F431C923E26DB650AE993157542DC540" + "C1D5771D19A7415508024472971748A327EC9AB5FEC74D2212E18F669787415EF28912E9AF78" + "B49D7DAB31AB6587D26E0E22E46A3C6B3A7B800BD70F5E87FF71A87B2C0CDE8D01AE637890AC" + "62C22C87C9B8A554600F93194A4DE3F9C6111AC6A7860B91E31CEC844FBC7F6978EAAE491C7F" + "C95D63763503E5B7FC6B67C9E26B2A3265C1EE109B543DFDA0A2D17FDE24E2746B9BCD7C4BC7" + "A3599DC825CC572ABE9D65C586A067E300FCDD380279DA149892206616E8E9737E803DF92515" + "909182738160C9D91CFE220BAB63DBE41C90F2E84474AF985A7AE905A3FB253B196327C490E9" + "4647B99AD0525506F9564A2174125DCFAD3011CD6CF5EE320EADD7F0C91CFB69E6336927A792" + "C029E4698F6FF729CD8F8D91094CF012A8A2657D9B17019B38", + "AA4AB8ED33144F5CBFFF43A2099A2525EB23A94F31DA03AE8CE7804B28424D6D50D1C6026974" + "9B4ECAC121D56FF68970374E9356CD884AA537073046BCFAA5F9F98B4FD812961637C4B4F199" + "E6387DEB460B155C26330033F6482D83FE1D223FE40A5228878F5E627CB1FBBB8E0BC5C94915" + "1D99FBEE95E826EF1D40B58BFB727019EFD05EAAFB0B68B60C8199F287AAB9F3832E7F9AA8E0" + "DDD2DD66F3BE927186D19A4BBF0B30396DE01D1623717F45C4E88C82694DE39595EE60715997" + "8B048DD472BAD38F66989441075795CDCB02BF5E9FEE0E173DA6353EED8E27C49DBB5BD649ED" + "BAC83AD81536A5DEF4C3D058F1FCDEF59F848B37E0EB0350072513E510D81DC993F34B2B1B00" + "4B03C5A2C48CA49E56D8B6F5A8277D16AE7EBB145F6963B1A9521620EB530AB099AC342D0593" + "8B9B78C8C5897EE7644C9BA24E683A43E4CDB46BCF8D3185C2AF2674B7836A954BB0865EDC8C" + "346E07B2F6B5B4B3CD3B41CF9AEDDE64ED2054996715520AFB2DC9017B6BBA3D9C105313237C" + "2042D3D86F2D0810FB13232820E6F1775B7A024ED37D412AA39A64A812DC99EEDD67CE0B72CF" + "34B6B5BD3781D8B0C4EDE984374AA55B07B4B993D50E8632C7CF58B6CC9F097059C91764C89B" + "9DFA468C4C7B67472682D0B0D66435432B5C11A12A56371A5BE8A375F9D5A2FB9056BDB46DA9" + "E494C48D168F03480363534B3F264EE06C229F2293802B035C1FB34487E6BDECFE3C682F0CBD" + "EE95B2A06D704D76DE49AF6B76E48F91C6DDF2B196F3A1C1DFE5EBF5034ECEA7AB8208A4659B" + "C72D7538AEC48347A66A3819DEA6A71ECA5904C45C8E8BFA3B11A2E01EDA703343F749662D86" + "3925F73D9AED2EEC1C5567F9D3073E7557853E6604C1B45B437D55E82FDE60393B7F46B40AE3" + "D5905EA5DF7E66E2A24A4E8F41C7777E34F919EBC7845129409FF112E1FF06D049BF30033190" + "EAA3418B5EF8719E663CB48FB1A1A5206FCB467E7E957CF5883383B2954846CDAB25CBB03A45" + "BFDAAE120D4DCB64BA59018E2C2ADAC9085348079CC5D7016E33CA57135E92916641170BFFF4" + "EBC8A332DC7549567D0D29FA87514BC96EDECCEFFBC31DA74D60B5A046EC5F84858FA618C21D" + "7B819B41EAE77A075CEF9675F9C5C438FF7BD290AC81848B42020BC94F0EBDC1D5F409DEE313" + "08E9337C613A44175C0A5C6BA89D363629E74860E4D203F0959D3C490EE0BEFC4CE637141D9F" + "70DDF641C5516B704C37BAD88D68DC69F548B92958E61E0FED4AC2B073C1939E3B56EC076DB8" + "343DDC29852B61C29883264A3400B41FE02D121B679FB9C01FEAD2F8A0D9B69DEFD05018EB01" + "166BDB4BB0670528DA0F0E7CBF6B5D29D0048891D5F2CCC72349C2E7A94F2A47124C20D5B8DC" + "47AC55BDC3E80BFDB539A50A804E3B0FB2710AA77B9F0A3FDC62EAAD510A22746E81D7749775" + "C0BB172228455AABA31DFE287CEF72A84726F86E3900A852CE56DFE80BE1DED51AF11D8ED582" + "1924712A794AF3A1C9627199A7D5C4889005CA5D6B7E9F38782D8A507306E96DEB34406B8C05" + "05FBDCB6CD828FA5ABFC01CEFCF36C245A03FC1680162932608CA1C36A50CA1DDE160EDB701B" + "B56E3CE4C1E706A1A95BF83C338D4A4E8957CB1D8B588DAEF619076B4551C137DD877CDC1476" + "33991FBE83B8491E5CD487E02593830973CA36365C8AEB1D281D74112E431F664B886463BDC8" + "17D5C1DEB87949E820216890C09A84A5EF7F8E11D1CFD734FB9D702F73ABC16CC0EF5C218C32" + "F8D090FD1BB102D6835972DC61EFFB99BDBB49E94570AFCA58", + "A3BBB282AA6AC4CF2580ADBD0E0DBDB45DB8EF539D9306C63AEF991A9932B2102E4F0DD34B85" + "807A48471982A2D1669F93E4BD6190D0D4B60D29893863E8A0B3F23575BF49C13461C1CAFA92" + "30C657A0AB9CD3EA4F8BA28D63FFC54ABB3CED6D81681869BBA3D02CBB6E40D35FA46994B459" + "F59BDC430F909BEA2DE7BBA772819421F206EA878A7FF6E631176A9E5990794DB110CA23B57D" + "E259D312048262C663ACB82404FE507B5D75D3ACEDCCCA29641DA790D3EE0776CC5F577D37A5" + "7752F9A0E8D3FE99C9662DCC8EEB8D5FE3635649488B1C3E4909176F1595B64F85ED5163A823" + "0D7C8527FD1AE887F9D265184A073C5E753586CB2CADFB2A6651592E57F9B38949099E9A3DD2" + "855F56D9EC971B29E6C67AB1B861E518F26C9432803328F6F3D44A189A5EF9C3A3B606AD951D" + "CB34F9D25F27D810CE021D3A89BB94A28BFF44B82F86AC2ED0F43AD20CCE9CFA92FB53750ACC" + "CC5E8CCCD42BB2B7D257CE5CCC12D70BC2DD0D587D0748BFF4514A776457AE101CC206F93E92" + "E7CB34EE2A6D581B7170E7DE9646148AF3DBC53300530A4D93C629E187635798D9E5363A4DE6" + "DABEA852EF165E6424A47367FA9D26A2999537ED4D34D86B2B9E8F3814862992E7F845D62FF9" + "284FAC310571A2ADE87C9B6A6A3DBA24249F0E3444A49AB1B1FEAC75DC4CED19A4E65FF2C5C1" + "67D2BBA97B2FBABE8CDBB81DF2C2796E09A514CCEDCD72EBAEB7829FC809074D7198D1904812" + "32E691EFAB7114C2236CA782669E55BA2319DBFF947855D813E10A6053B97779ED15F6427C30" + "8EF66BE68B4A65897EB2C09DB74D02F177658605A06DADCF3754A8FFF1AC51747C95F2CE7541" + "7A98C31257D4E0E18B20E4BF6BAB13F34145F18724652C1B4AC2C261AF49F27E59A2D1506638" + "8497806874B2EC3C9D0213532656267DD718D8326E72BDC76E8B6F6C1C2F6D40693CC8D59550" + "5377714DC7BE464B7C6B33431B67D4C09AB95F7A57A9D5D989D4B8714577C9A76818E85D2C29" + "3D40985B1550C3BFF23BF05AFC93154D060D03C843E413CE768A0646ED967F926A78FC264442" + "D8831AE92103358923B21A91F60060DD621615E5B18A802F06C2EA1308CCF50C266E7DE3180B" + "0FD74EAC0C3F1C42BA4CA8A97003FC01828E40ED5C5D4237665FB3C61FC9791D9D3169CF92CA" + "793978A9FA7874C0BF593A4FF5720ABAA29A876BA2E38C4A13387576F46370B3C0E16CECC2B5" + "8C567115ED3340B90906D0941D6CA8A6D429D18449320B209C2BAF0BABD994AAF8B3C58B6860" + "34B7E66A93876E72CE928FFE39FAF5E2C50BDC6C320085B8295DFD1A59994A403DE287AFC7C0" + "9B50FDF67BCADA6FE3361CF7E58E1FEC1162738FE9A8D7557CC3C6B56C3383F1FD1AC5FC7E0E" + "61B56B1E19F55758ACBF8E723441BFC38D3F79C3663FB2DA9EF37DF856C81F1FAF0A3DE01294" + "CCD2C5FDD4A0ED080261B1DE851A3D7AFCE3FF8A4B9A73B70E4AB33F696030B68D1E68FAA94C" + "DEAE87AEA1C8268264910C5CA15B28A9B5C1485B0484E81665BD4473518D6A19B9B4381E6876" + "317B7570E642918E3A2EB70ACA2AEA82757F92E4D7E81970F2FCA8F4E4F29A4F9CB465CDC4F4" + "9FC31E6FD3376215D1D5B8138A0C01FE0074A8A992EA11C7E181AB975F8680C63DF3B3218579" + "988642BA1B07A00A8C6D3D434235D830037C4AC26E248D660424BAC608DA111321F8F2B24FF3" + "4DBB13028B739E413E109E058305954649FAD07EE27FEE185546D0C815E4A1A5D0B8C0B72C9F" + "751470E95C8CDD5CAF52F7D4EAC8195F36C61666B1F69313EC", + "5EF2ADD1A70FADFEF36F503B709374916AE9AA8DD9C39F6AC837C36F61D0B05A3F6212D07E48" + "7D3C4DC0757F5738F3D3E6C3297AC911F92F03A4FA3407007AB61F28659392FEBB19A2CB313B" + "E3673FF6D75768943458A6A8551E721A575B688F17DE6086F75BC0EB9E6627349D31758414D5" + "199012274AD7BF909B8CA344466B088034D1529D91AF8147F42AF32597F156D6541BD8AA2A61" + "67694BC16B1C18591682CF5A457124F7D227C50F68121BEDF5203153E29B814F48A3949E4F52" + "CC6D8E5EE7EB340D849E6221559CA8D5B25DFB34899DE2D980F435151E7B88F746CD7FF2AF1F" + "B7AB71B0C8C061093DCA01330E8369F9ABFF6558AEA43C1263CACDA3C0D783CC80830A868906" + "3E3788A9ED7179EF728B32C4D74F68741C7FB59D67242560192506FC674475A6A6EF84EC1E6E" + "3B9F76A8594F12AB335F057F88FB71D0D8AD813D41495044882A4A0AF206D46C2E3B7C47FA83" + "EB335523CA6855BBE771D9E0DC87DD9596B88B98FD8292601A90939AE6B7F8E0B85BCBAC8D33" + "453BDE7A3ADE5447B1F1824585430404CF07AC0F16CD4F1920F095D46A9BFF567E5B05C33201" + "4EF242180C4C363B57B7E3D53FFACD8BBC4779E2A2B0BC066D1EE644B37EE936AC54E6AA1119" + "E486C0B35F9DE9C6D8CD2BC9E4A7144BCA07651F2A3012BEDF61205BC28F912FBC923A896BCD" + "05A26860E35A0F4A5B9A1951546F60A9ADAA3FA6933D50BF8A07D626E52A2CB0044359888B14" + "C76427F7AD4B91202662ACA086BA32E4B39199E75C0F6BBD8419EFA3C45B6BA96139E2A85594" + "68B0A45BABADBFF39B1F72334D166375FD27269853E1B5780380B17C9703D27E224D7A530D9F" + "2F3C73ABFAB80EC8F2F849F82D211BF168342E1BDB0FB04D5BE70E6EC5565D5A24BB243B702B" + "DB3DFED7C3962ED53DEB41FD30E728AF321F61101621FCEF1B8ADD823978E88C2AF5F1D099F5" + "C5BF7D5AE73D52351B9BEA135B784AD71CD73822D1908C7D7A045092266964FF214630DDA084" + "639EA63EE02B446DE377EE8D25AA1A6C84D2674A6EF92B9C1342C90B34AF969771DAE7603126" + "F23241A3AB3DE5A5574B5CA6123B01BE0EC30E8D5E17DD38664F6C33C5B641F680613091C1C7" + "6E9E8198B4D39545FC070E7B6160022C9AFA9919C11B990B874462E5FC3725BD578286BCC55E" + "CCFC5FCA72A43E71D6AD56335080EA297A06B4AFEBF36C9A61D06B278378A4DC9F29F0F1A1C5" + "0878AC5A19FADC7DEEEA0ADEA3AB8CCB01E4CB86B838B6AA0B13239276856C83562982DC9693" + "29473627046C9D1F43F181E43B53DB2ED6050CA5EA35BF9FBB1BF2B8D6A29362A275F7056205" + "25688B2BE2C4FCFB23A695A65D4DD2D4FEA492BF95A5D95D32D4B2E26F9F91A3EA688B525023" + "5077D722A364A2B58EA7EC6EFCFED62BD2985035BA6DE56E13C0C7E17C5C9B107236714A64B4" + "9DA0CA35609B50B724E264682AB68E0EB0E993C06998EAE2BDA82BBBDF1DAFCC2D1A8F0851C2" + "C787CA7C9D928F60F26B05C32C9B67EBFA96B02F4A2B808566355AB5C73E12A729FD1F99BD51" + "9EB0A0F55ED2761FD3A31170E84CEC41CC4CAFAC9A2003436F38701FD154E5968CC0BCBB71C1" + "C4864300B7C136D1E61B79330E5DF43D58B861B83EC06E24329D697552D3DE6AE2C12627B246" + "0373ADC774B4FA966849A1641CEA4FBB297325909B2C2AD258BBF763DB116A03BE32BCE31082" + "DD8631427F934B322485102F5F1884C5A20E759C75A80F6D642BECEC56255E73AD5F7ED1D7CC" + "85C7D7AA188B8F4E20DDA8EC7B9FC23404437C267A8A73865C", +}; + +constexpr char BEIDOU_B1C_PILOT_PRIMARY_CODE[63][2559] = { + "E77DEE8DBCD41A0E6B81DE9DD860D1B4CFF65B294C4E5E4DB222B5C2C7EDB2EEA4D0592790D7" + "88FF270545510D11BE7C9C459DABFC42EA2663F84833F4B81260470FEA4953D3A54C3D079E60" + "4869DCE1BDD75E4C2C8454A4BBDC10432C42A579869390E08123F1481C4720330EDB7C9E22F9" + "FB787FA68DB331023FEF2949F1E697ABCF656180676A9C9732B475029E425DF7826FE5FDCC1F" + "91425FB670762901729DD7A1888A7177AAE907B53C974304B9FDEB0C1C4E4991FAADBD1F4E15" + "5909307D7E5E032B69E77C3EEF55183C1BCA9EA47F6F7AF78D425DD0EF75266AB1FC259A3534" + "D9298F8BEFFE502952F5657C24EF364382B234B52E085721DC12D3DC13FA8C741539C1E80185" + "D186B6951EB1CDE556767AB69CFE39DF90FFFE13F738FE72DABCDCD54F671AF152DAC3174300" + "2F0739505C62BF907796907709D420E95A589A8384D9EE487D4D5E952810FFEFA3E329365958" + "B3487F1AACC95DEE17748563DEBDEDFC4AF2A7B0783155EEF87DCF2DA980F4FD7C19213550E5" + "F17B6ABF1324E47061AF7F3A4185D2795BC12EABDD1CA2230BD7729D0128DC1CDBF48513F067" + "7F4FEC83DF7484F2815C5A99D272ADCC030D4DE7ABD2CF1F2529EFF881199B62CBFC3DBF3E88" + "F27DB6E19809C470251F89020E1392C33D4A8469841077BA4A54426864F5D77B0E772C240CF3" + "C178654B979524AFE1C40C903A5F98243F8CC8AE847FAB7344727CFB1161154541C9FE23D613" + "C934164AEE9B6FC6875A889B64F4E46529B4DFE65B160C3772F703ACE0B0567B62EF7DCEEC5A" + "16A3469665A5A779A53F288A0C8AFEF612D2E81385FD9175BFEA5A8CA5D0382869B4AA547C18" + "28F6BDB8F6A3E793C10F65210853FB80D3597A0D1E0478F372894C9068F2BF8F8DFF98A9A1DD" + "058E16116423A26F90AA7251B84A8C024A88766E1F7BB04BFF737C384703563187485FCDD656" + "3FEEAA0E22173599E173CEC90F9DD60D8096903AA9D2EDBB6FD564C189AD71DEE35BDA702917" + "4658288743CB040F67257BB49BCFF366142C08CD8B626B0EEB29D17C69F1F244C081F21954E6" + "89192458C88D45589FC087B801E653D4679A4917B98AEA63C6203F358A329A952C674C782CA2" + "F34ED5DDEB6AE91EA4F78A606236607331225D736D0D7AF932DA3063F8406C6B93530701BA0F" + "7DD8B3392366457BF01D1061F857B43609F05A5C57DC3E28CBD476819E3790548CF01CB61AB7" + "962E4DD2654AC4D226A95BC2895B3F296788134215B199F9CB02968D4DEC7E586B83B43A63B5" + "096BC062E7DB6029F83E35E739EB1F07E501B6F9D180F5A42B71970B7075869F8DECAC5A5034" + "E7E6636A10B20479A53F36A450F6A55912C8D4A992EC9D1A7B561B4E03CC4A827B1E605B8AF4" + "C51F0EFA8E9683E41B0B7A87E1822E03F7A899B1273346EFBC17603832B2758D8087F18316D3" + "27D7AC2DB3AE912333819B1181947BC95E25D5B5EEEADCB3D14D078CB98D2A5653146B3F0118" + "F195D4677A2496798AF299E0077840FE46A8AC44C689262459CAA613E040C893E3E58FA2E535" + "DC3591B46CC40D0A19B3FCF64B77A939BC0834F0B8450698BA250396F6B1DEE3AD6460C9AAFD" + "B76DD2E557025A406C1AEE7C24DCF3A1E66B3A111C155DFF1A9AECFE84B8631AB038870FB3BF" + "F48377BE1D9B8454900C5487629395427D917109A21A1C682EE165467FEC7C7F53C5824CA453" + "B3C7881E2C17A6B2C077F2842129BC20F279F15BC76F5BC5060F8A954B65850702E94C5695FF" + "6BA26FE87205D2D21BDFD44C14453F2967B969699A58B15A14", + "C1B81103F2CFBD49C8D9491E409FA0281D78444863BCC3C51353B9727501F3ECF1BB965D576B" + "BB2F2BC384318BB2D64DBE69A1DF3D7874C625400937D854CA24A5285EBADD03C3411FD6EB50" + "B0793F9C12F6DFED5631CF53537380B5E6128FBF475C5986C6E3816047CE4B33C582DB9B71F8" + "4FF61F771EAD8C6517091C8F194210632D3234634EF49D0D1627A46D87464CF2E94B52CB127A" + "A92C66855DABBAA942E75198612C28FD0769301E35D0E3BE349C46EA0A0A42F913D8CDEE415D" + "D8695CF4E79B2F36AA5D2D4CDF25D36B6BB35AE9790F2DCB306D89895BD8054594248388FCE0" + "E6DD362053C906975D86ECBD1AFAD22481095E15E0F78E04FB6CB936704E4FBD17198D46EC16" + "9D3BFDAF0507AD80AFD27F2377ED16A28F9768898BB9D9A0570B62556776A1E6420F04ED3D60" + "49E3CA7F4F20CF44D894D5244A5CDCB13FA392FE7EF2A80C5D2BAD3795467E62A9ECB5D4BA30" + "154F7E7F49C5FC8D3B3A5224AB291B22F304F2FE53C79206BCB720F04267856EE6AA46D0EA05" + "9B9DD19116E9F14568B7EEC4FE4BF501B5E0A0F5BFDCB9683762B198E8BDF2720E6C9D36DF20" + "71EF07A87A9081244B5F58BD3761BAE96093CA046CBB67073F11C12429A2A01BDA9191B60CD3" + "B4F09E975ACDD6D6CBA4FB32B4BA556CF4D9E72F3A961BBA8277B31BC89F4250505762392C7D" + "C70BAC780C96E0BF143486198AE742955DD5BAA16634955E48D34AD2974F3262E1B625E468B0" + "B92F72C62C4CB4C6084298F13890E8A631B578EEF86FF21F8ED9DB41A3CCD273E20681C76361" + "9A3AE2FDF14867AD01CECACAF38C6AB7FB6F4839FC9E0D0AD76BF882C3C0BB5D7A14A524532A" + "1BEC9002A4632E1EBCFB85967DB26B4DD18C21C3D4F4DDD6EABA69DD8F37CF80AE4E9DCAC8A3" + "C33DC612221EB81405F90278929B1392BDF34FC0881D832E5EFC86CB86047B5860373CA02210" + "DDF3A99678DB310E6C9A5F3CDD849E05E41C97065D86F1820703B66F10638DA9473EFB506F7C" + "B20EFCCDD5C6E997C3576BA303B38B9EBFF62CE1791E3DCB825795553D05C39A066DABDDB84E" + "F84713BF89012C66FA0C4047EE3E48FB5E0F40F9B0CF27C8C2DBE4DD8EAC16F578B83195887F" + "E2006836BF817C9F01FFC5441D285FD9FBE5982F731D6ED9231F21D0A86EA007D807E2661068" + "B0421DAEA7F52278920BA5232B5D3CD0CD0DDD6E5210DD07F46B26C0EF5173F45F6219EA6666" + "4C90428415E6081B5AA93D1A333CFEC877DD5B4D08074EA007D25472C8B50311910629ADBE53" + "B1519B91A85EA654F91B5A163832D099D7191A9D4FB82C409B092315B8EDD67DA118DB8F2C17" + "C69AC1CF607C4F2BA4B2FF579D0CEF070D7A186927AF76C2CE686DDEBC92C30BD61C0EE6173D" + "5FE9A4BA9E47C0DE706B2C7D069E3B6310B7CD76E3B518921B204683BE572B131D732169838D" + "0B5B13E54CAF42B13B3151B94FB6B28C11311815A269C5497C00AE5C02165B577DC26FE7998B" + "1792AB5B020CF5042841264CCCCAF308DF45F9D15EE06C9AC5FC1761094ED776166167975A98" + "94BA0923C895FCAEB70841A2C10CC8FC037C00AEC2A1709F18936ED719DE8334FBF37F429704" + "547FF01F27D03FAD82C008FFC2353183A3D5ED06AE3764FB68627C9E61B3E05E0F5BE24F8EFC" + "40460BECC690123FB91C43EE43B77AB6CC0B38741795553D483A778F13D0E68DFFAF3A39B818" + "BADD587D32EC757667EE09A7DEC15BEF9C52B638C11ECDB81C0831EC374C1D2704F40F243767" + "9F4B26CE119B63CD32B9F7610880A79D80C35BC40C3A6C27EC", + "52E5CCAA5136F61A256F6D62F8105C92BA0AB8A7E97E65D1296395688AD07940F85EE068332B" + "881FF719446E930F758413DCFA1C7D6B4487658848BC6A246E2597ED188D3441CF6B7F9E1B61" + "DFF41C05D6AE24428BADAFA65D323D814D23800B4A8C78430D67C69F0AC5147250D98D1D6D4E" + "DC38A660106C17CEB9D4062C974CFE993EDA397AE4E3556686D39246CBF07DAE36BE644E80EE" + "F6A1A96BB83EF4B86691827F6A3DD44050001423439C3486783A6B229F14668CC7CC82B29A09" + "93FFC0C7059AE236E26AAFDFFB90982CF1DFD81E2ED85AC6CAC8C8C811D2A0E7851B7E82F1FC" + "EAEE9D7436A169657C7F1469BE6F263D3D99921C3BCB09E69A91C3D82FC9663839382A67257A" + "C614A1121D47B068D763684810991A22F507015747FB5AD5B669C138DF8F825F6B92211B9E6C" + "F58888422235E6CF3B10893ADF483E3F639072CDB56B5BFC5D501C15E88B13210242D8DD62C1" + "BC570910A50C6BD49CCA8393838CD27E8378712B2CF21A7B87093337978C9ECFB2C51FC7D4D2" + "D0AD85D72EEAE7F1E82FDB143CE0A9710262626A6C6B436E8F037F71E683213BFF7EAAC8ED88" + "EB341C607FF9320B29A8267C662CC51F289ACB83CC258738588500014045778ADFC8312CC3A5" + "EF83BAD2B0ADEEE02E44CFAD8EB7C1FA6C49396C2CD558E4EBD38B6F932FE65D268C0573AE7D" + "06C100CCA3876E56D716336149C5146A1F2C7CD61843C62A5A003896503789974CBEB6BA2844" + "8EAD740705FF70DB0F3FDADE7045962316FD348EC48AC7A24234DC245AD7C70BE7790435DE11" + "2EC4531DFF023A9982C0EF43E053C16A22D538D29174CFD2FCA3AA0BA9274103E8D6DED48B0D" + "ED914AA674E94CB3AC7003AF480A5764CEA68E9B6A63037C7D6BCAAB22DD6ED64F801FD485DE" + "EBD158988F164003B88F80DD9DF78BE009FE5CE9734602FC57EFEE0EDA193E0CE166978E2CC2" + "17D1B1ADB27896D7D393DEB042FF4DA7E6DDC24E18500C0F88E33DF70251B4762B3170B73724" + "500B818419C04D8B372D5F364606D6BA962D8F5860647F581FD57BA00899A0E09D6AF8C0E369" + "876F8775CD28EA165B6CE6E27E9F6EE0CBBCF5F1CB658BFAC298D586E070DE376553C435F29B" + "F252365AD0D4F36DB8477CB76D4CB665AF96BD52CF4676C892396DA5D910D56731DD659A8A7F" + "676BE7380A1C393DE89A001623DCA5B12A90764DBC1B4C5F40DA265F73380A4E22D40423C293" + "D150FE3D77A10C77FF5E8BD9A49EA7CB97AD4EBE10F77684C8816D722B90BBDDCF0035C77756" + "278FF203670B4550E286E62C6A7693F6B524A13A8DFE35C5B6626D095CF99E2C8A1C957AA4E1" + "44D1E67CEA42D919B68EB1FEC5721492B5BF25B958D19D851C2A8B439B013FC791ABBB8EB003" + "CEEF7427513ADA044C85BBBC21F5CAD7A74F95E4966F45EBFFB8C217BAF1FC2A2F250F1080AD" + "11C940733BE9916C0BE8CB60F6C9B825523694EF11A001645EF270E140739F5B9BF945669AEE" + "339AAC226E96DA71244DB98BCD2AF5A7D699B4CADBB4FB8876DB3CAC2D69B1293F653EB08F2A" + "9BB1EC381D86AC650D7F469B4E3EBCF74C1DDBE5F91D9CDB69A15C52CEBB87DB865B1C0C7D5A" + "E41C166440177AAFE06BF898186BC6D1A575AD8189B3EAD3B346C80E608607402893B3B43A33" + "51B8B62903BEF31C47C0C02861C90EED9F96CBFD0835EF272FADA47936D6362FA10CD1C7A59A" + "1CC1F2616DC1DFDFA8FD018B3A5CE9FE401F47BEE6EC07C4770009A3C4646A2F5DEE84AFE007" + "C9ADDAED13554F5AF8FB03195B65C595CC9BA9404BD70038D4", + "C413A861EA10D23C94FA41D11A2CB7A50876544A7D366BEDFADBF070FC6E509474F5938E3668" + "D214C7A8AF88F92859456AC5C150FDABF1AECA1CE48C27090599C741215EDDCB95599A1E6E4E" + "A58FB12104409BE70CB77AA977D723CE0FBD7B6954D58BD6B19A07B9D19B5D4D44A885966D60" + "51E9DF2A32A80DFFFD23599C1DE53D91A5C23046B78DED2A66B476079C81C18628F83C9C790E" + "8F110D4BAB9F27682E01DCCD2D65333910D9E92AE70D7C6349AA5D589D4CE61966003866BF0D" + "7CDCEF28B0A01F1E9AD8E54A40F2E2E0C9974577C88B3B97C4F52E6F0570674CE82DC6421125" + "3629D4B9830E8387BA76CE5E87BC882A3ED5DD07311D7785AF9BB39ED0A2160BDB233D93FEA9" + "2FCCDC33790F179D912BC1F5A63F1D4A3119906B5783C0BCE7CC7950011F32D4CC0FDF7A4999" + "024EBD063EA4DEB2CA84DC50846AA3B2A0652D7F13F94E53F91FD694C0A9B8AAC42147642A69" + "AF64AF8C17AE4813324BDF7E0665699F100153C67CE7A0783D5AC133118A571F8CB5F07A9137" + "3D1E13D987667E92AFF937989B7A0D08A16F39BB3EB43DD7119C17756F8A8227BC2F4E6DCBBC" + "382E1833A5728D9491084C7682E65CC1D41ECE95E47D3B9A227DD45D3260E8E9E04A54E36B2F" + "1F00A1A29EE767D61FACC3800CD30CE65723574AB258C7D61CEA92F361139994D69667700E82" + "DC9F3ABA56111E2E13C72783E28C3070273C0DC5ACCA96F63DAC418874B13794F707335897FF" + "F602A98A9F72F140D6CD3422A456575B3173BC0B31AD7A356552DBD7BE0E789D7DD2ABDDA61C" + "FB20441091BE34AE4ECF0B33553A776F50905C7334121C8624E70A6EB1FAB7E150746AD45342" + "93E23EA2BC650962CD8E3935E5C5214EC7E1C1FB6BF6FACD97CA454DC214BDA68B11704BE527" + "89610AF0C2B9047CC628B8F2E35C2A00ABC2A8DD78F6E46AE9B9257042FB91DBA8AB0F2660C0" + "C79E40AAE2AE3652FF043D7C72D2CFF99ECD5341F46619DDF22B13783BF7CC9C7ABE82A5A9DB" + "26044B8D264A343AA80623AEFDC5A7A34234A19DA86CAC81425209BB439C9830DD0B9E60AF27" + "F2CCB4F0F0EB73849002A807BD2C304C84EAE31F1EE8C9661A8E700297B3FFCD112D435456A3" + "E642903A79A8611A96FC612CD8FF30EE7B27CDDACEFF078DBC0C18258794E2760176721DD4E1" + "F58D5E5D0C9A11CD539872B643C1F252BB9F666F0AEA640029A793FD73CC7243AE65B79E8A75" + "75605EED627CA42F613B29B2192ED46F0101EF6B1EE83CAD2FB4D272EFA0CDBFF1B593BD337F" + "3BEEA4B1DBA24B29458FFF7EC8B601A48E242D0BFE74A3487B744A575224A8C1A37320724EF3" + "9527B38B344D9F6E093D5A2AF1F752924489252BBE3D516AF241DBE6C8B3473792A73DC93813" + "3B160C54912BA948BB784B14B9FF42D091C49601B44DFBFFC68A5349176E3495DF73FB32F726" + "B63FF6CC17DD392CB7D2D4F05DE35BDE0203D8ADD2613653721BD094F91ADDE81ABAB945E7B6" + "99D70938CF3AFF27965000995D43D99BE775293E0F09B538672ACE2164C2E9EAC6BE1CAEE139" + "BA01B91CA7869060C0F6C783FDCD6ECF9379DC33FC6CD218FDA5621856797025099F15A8AB0A" + "D222CFFF37A50039C5619A4C5DE3E31D5C84C830D2F780550024873B5C3C3CB4CD3F93D419E7" + "42EC3064E70B7641290A04D4D856E614B10B17968EFDD711805570B14992C74881936E169505" + "F578E4CFBF707B23513EEE6198BE0B2ACDE67FCD2D38FAF083FD29B1D51D5409E78C0C1993C3" + "54576E277D083A92765D589DBC7AEC550F540150EB1D3C7450", + "DDBFD813B23EB4287A19FF72F74F976F546B8183035625C2AF3D955FE0559BC9ED61252DB969" + "41D6A1D5EF6AFB0A73591F07D83ABF11A69C27A83AA061FB7EE4BA65ACF2F3DE49723078F997" + "A922AB7161C667E79D6E58D3040A1E5C9EC28E7876B97C3D2B1C91E9A9CCF49BD0285DF3B473" + "04C6FFD37AAA9CA2D95226E1185E72EAEEB51C3719464D3A8738CA7965DF39A5DFD7FC90FD8F" + "6A9109CDBA45600F05269927D66A85A95485931B8D81F8C5189DBC3E682E7FF70B89C399DD9B" + "9271977210501F75C8F6D12D95EB6C025A034EC737504A27D5675D7C6D33E91DC787B0CF3159" + "2266008D3A539B6B5278715AE9C062ADDC118DEB81294801D097647CFA66BC158E521A297D3B" + "8B5ADDC7A05E3BB5AD1DCBE94584A71A83D665F3E26E90B80129481D7B1883BB54603975A8E1" + "E4AD6D9CA5CB10066449A8CF30DE1E3B897CCB63EBAE6ABE4520AECE372C05A4036D7A9B48B6" + "F13AEF80A084EE98E49D9BB99C391D0EFFE74167C3DB918A31F81B1D8C9A12A95A1566BE4996" + "4A0F006A25DB3908956F1BF093FEBFBA59CFBA69E531CE15CB26298EC38AD77574E7A1887644" + "A9B4539555ECBFF6320CE2DCFBA140BD92F3395978938D4BC3E9D6E1E7143793A785020CB1A7" + "6B9E7E663868ED54495E99F1E0C4E927BCF4F35A65D277EDF86055C15E4396588FD5C1BE0F89" + "ACE50DF56F7AB856B82969DB4A486B793D9AA07FAA9BCF543A46AC0C181D62AF6E9F2EF4EFF9" + "85E142D7C4DC81BFDBBB2B75314DF150F99FF6B9FDFC2C7C47CF979302742DB148428842C2E7" + "D924477630F2AE47D5D4739673CE0A918AF04705C56C852B2A14E5BF0132E9D4B41A72068CBF" + "75ACCBD726EA45605B7139D7711B3144FEFDF313D6CF1AD0EF018651525C9B5FFE0DA7AEC674" + "9F6ED250AD58B720AB4442EE07787D289E810C72A5A9D9C7441E017B722373B04872E9C13DA2" + "27EA0558C88688D5C1A151E5FCA499C2C9B5F6E73A328B15EB76D35A05D3B4C958A6A18390DC" + "9F0F0DB4B6DD23D5055EA63144D11025F1CE07C3317A65016F1ECC4998A4104BAD0F5C94B484" + "8525F55206D83E08C7722A8485D0EF0166F31FCD04788220F6AE841BCB15559B0A5CC14930B7" + "35976FE649BE6618BD8D9B403B0EA4B5EB3CA95142949C97788AE7783D4FA8C8E73D2052ABFC" + "5AC574FF227A59F0CF4328AF132447B597BB1994D7C38911E4E532B2B8A54C9B231ACC4D39CB" + "FEFD87044ED19650C23ED189F6C31C7FD88BD5313FC1063AAD2A828E18A158592425A0511D71" + "140B484934350A30E282A96AB8C107F91957A237FC7186DF2316F88614D316E441C37EFFA739" + "6466B189B2654A3A9A994E4F112387D65331BBD35BC44991EA2985E61F34BC89FE5D46B47FAA" + "940979CE262BE5783FCEA23DD2725285152A79AF5A4AE1B805B3637A30CCFB24CFEDD359DA19" + "250674A1B35551A7B042EADE08823C4167F19ECD01EE174242A89DC620F836C0955F4942425A" + "5275E16BA4104A332466F1ED014CBD1987C0E71F4811164518CAF541578976DA5B61E1F27613" + "830ACA35265B9740B596DDAF51A298B9CEDF5B2687324A7F4F150B075622C2263540AFC88B79" + "072E9C241B9D889DBD00F045C7372B4A9C6102F2297C3DC0EE8445AA09DA356A1496EDF25CC6" + "EBCB60FFF5B2749514C301EE16B1E6D7919F7EFE4519B11DD7391DB40D44AEC9D7A66B5DFA62" + "C09CB05A572E9901FB4E50A9A9426D4741C41EA312A0E79CD39C5757C4EA9E18DDC44937CE86" + "842284251B685C8193D3E7C47C687F7F3ADFF33E151F65195C", + "4FE5A223C16B8499835744FE0A2BEC8A63E8188AE31A834D0DDA8915ED54FFBA06F515C568E5" + "F9F687D8DEFBAC1F5C6541D5B1AE3CAB05E3627130B7878ABA9895A7AC5D3F509EDE206119BC" + "AD42B85A717FDF88F0A6B60B06D595D0685ED5A3AA5F7E602C84BE2329875E33804F55C7B12A" + "4B32D9EF9A7B9A3871A26A0FD20C18C982EEBACDB773C7EB8C4BFCB15CAE5901CEA0541F1495" + "2428E533B3D87AD865745906FEE65582B86BB65E4E1724208273F897333761E0017F0D101D90" + "EA16F67EB4608AC3BE0B4CB0AE0AF493292958566DF10B10049216AC5DB65662D3DB99832BE0" + "B38B64287F968BEEE7D57CE57E7E5236E6F1E547DC31663375672EC17F6AB0D43AC0706AF960" + "1E36B5F57073C9E87B8279319D9F246AF34E59EAC49F373193C83BC2F279C1D5F5AD8F00D3EA" + "C1C06B8561AADFD06E9CD5D98CD1877C54F1ECED894FCFD4E7D57CEEFA2D3FC284DA39A0FA98" + "333B7968CD4DB746AD0924011A11F6CD4352929925EA0EA1A67A0FB86A20C5AFCDED0AE13701" + "161FD000F0DD999D23F9C820849D0E4F4DBAC3A8354CEFEC1345D4C36BC379B994E28495251F" + "0540AE70134EA751A7FA463AFC79DDB66BAEE8326306097E0AC8B1C38B3BCB3EF3699A4A91BC" + "755E40398F5C32988FA42680CFDF4AB8B56F42C175356C1A0DACA1E23F7FD1CB43A856A7B310" + "C08F6F215F9746BCB5232BAA3C3DA191C8D8F41AA78EB1B57054C75F06BBEF637C2DF3F4E2D4" + "7515EC0BBFE556F5122B7616582B18EA2302F8CA26FA8A0FE45D5833243AD07888B4FE5DA83B" + "0CF647A3F268BCD0D0A799202D58C3A1D38C89FDF212B5DA301C3BE193A273EC8A1EA4227D67" + "1C8DC60E97937EE8E7223B78E923B48B94A4A33B166C6450A53BF7DCE2B5DF3C837DDF194A45" + "667BA3564ADD028A99589E6CE3753AC009582EB07EFC86B2D176420A5465493C6351432BC954" + "7DD0E1E008D60BA40C4551F64DE2BAF0EE216A2D3BDC8CD80CCB0A2630F00970E4BF280E7A4C" + "A5491D4F9B5CDB5A92423112567BFE78DA3A9C6145FEEA02455C2843A622C646A811138DC320" + "327FCEFB742300D5F5CCBC06AE8CAD58037A1B7097F3271316C5DC3ABDEDF25B1193C696BCB6" + "96022BD07C9D6204976FC7EC5A9A8BEC814A088164521763F0B364589B823C2DD6A7374C3517" + "C3B57FB037FF2EF80A750ADE261978444EC874E0DBD85726E91DDBF74688FA0820EA8FD029C9" + "DB3141FE22AB6B1F00B354F711B7F5E85ACD54772FFA8AFE8581FA007F76D25F653E99C97F55" + "6DA071BC763993EACD9E1A884561E6CD5F2671B8F63816DAABFA4E65F29BE92DBBF8017E0685" + "FD457FD3B8AACD685EBFB623BCAB3403E35B5511FE0A336E4E502FC55C10417C458BBF6EE25D" + "93A86F6C1CB84DC8887A6191ED42B9407DD3FFB037FAB70FA2B0CBB395AED0F10764689B343F" + "1BA1289A04414A04DF456568DF8FDBA4811AE4F82F5101A5B4F5A58F2623693EDEF570EE8DA3" + "23933FA43B617B006AD4C5D580F4CEBEAC0310BB7DCFF930130EC7222055898D11970850EA89" + "015DFE8A18E5716C79FF79A9223109256B6CEB67CAE24A94C979C053F49C3A403C3191434CC0" + "6CC4EF72D15A11DC3D751EC9BE2A88C09741AC401E1C2EF8AA4F530A2B18F24A98A94109BA2D" + "3584FDF835D06A400D72BB1CD9E46A654502ED49AB17799A894A63EEFB04F3EEB51CEFBF7294" + "2898D9A3731494A744B7125C7B71139C5DFB27A5C18EC4E39AF91095E144DF3917261F70E031" + "6EB5213EFE44C72E170C6AD01267942C2CF4593F1789BCC370", + "55EAF66F21AF6BBCD8E25CFFF26427C3BE710AFD992A5356EAD315B2102F4633A6249F95FEF9" + "E08D91D5B5B3EFD01CB223F84248B609E8BE4D6D4061EB395D075E90CD27F03A370349B8D149" + "AF1E5FB01B6DFF4EFC963D9B478C7A07A619179F008807658D2B3A7D4CFEF85C738977276701" + "31D4A17D0A8C0651DA27655499FB34EBCEDB0CB0729C688445E386D2DCF667949DC0A81B3920" + "AB4487FD04A7C0D885C7DA1E4A2832BCE984427EE91577B8464E122D1A480F2487048D08DE39" + "EFB9B6BB332808B85B5E6122157CBBCA8A575EFC6142F96ED58BCAD1EC37FE9DA0A50BC03B25" + "6BC90C5740CD8A6926F3291575939BF6645BF6EAD37A270B375DD3BAADB050DF647ADC8143C0" + "5282251296DB45B532A2B9C04652EA8940F99F1C72F1BC868D8BB37644118E0BC622517BA1B0" + "D8E1BA59B24226AB768AD72D2BC1D521C3C5A290D52D1F925BE0789351303A9F3CF297D1BE8F" + "79692B80B39F15E67B979207DA3864C2CFCD0C98716F8127A7799EA3E73407525A7BC5F62FA5" + "3CF3E570322B24781F6927E2D2AC25168F0E12AE0F52D3AD45BB5591093669761C6C36177A29" + "118F41C62089BB3746C584F63D38E3E67C0A455D29880E751532B68B6DA5229105280F0A04ED" + "789BEC2836D5772EEBB343917B2D5DBF6889BF6726BAA2533D925946CC0BA8C24F5A93700F42" + "9416E5FFB0DE2D4F46ADDA7D0A18FDEBA9454F74FAA11219EB687440533375B677DE71EC42C4" + "838493C04962D121C98877BAA25DF908865CF5305149E16F8E846C0F9482FF848B5412736054" + "0EE4A799BCED2D871E888458E53834C36DCF5CB37E64AA9B916E2980C542FA14AE32039B93BA" + "4738E87DFCCAF97352C69B804403E7A261978178C78B66F1A4FDCBFEDB6037E9E3D64A2C764B" + "03B1703F92CC25EB82EA735E180ADAC9F45E41B449087F1134E02FDF36B6AE26C41E7DFEA7E4" + "9197318BD02136A32D5DAB295266FD4239F70F90993FFCE91C6CF75BD613D9BD5EA9E17C674E" + "24E99CE2B8E208457292D000F5B7450319D0A50E6E1E0D59554200E0CB96B0A804CA9CA4748C" + "A6A3E4832A541BF4D3958E7C22DA9D97E61BFFA64A9458630DA0323A4BAF4F6165685C598435" + "FA02FE2FF1E28E1CAB7BA9EDB78231118633668C9D3C677A5C1FEB3E14233630EB35C40DB9D3" + "0F38DF3193550F4A9D8DECC66A3F46E580C4505701AEFCA3A4DBACFE5E3117E4A752BEF4B4BA" + "327F953A5FFFD8F8A103665566C80C089C97DE3542E5939C2D1851A9B5947095A5AA69A5EFBA" + "B9FF9CCFD169DBCCB50AD0C4A87AB25656D7293B06DBB3869B7B82F9CB8812C3D6B7B7059D28" + "E600A456B43E9A347E2A7B98685ACA988EB7A46DBD478EFE86A903449EAB759E86219B47AB53" + "9E7590404FEB3E087AED8AA8DBAF083E6BF90104D73CE56AF16CC230BCD76ABC91604AB0BFB8" + "F15EDB12F6B88CA9AD0B0CEF2A3F162CBE16B51280338A5CD076F6B5E1A408E9CFA0EF6CB0E6" + "EDB06E4A75B53526AF0A9185A85699EDCB45F99CFFCEAEFBD2CB2AD2D48714D6CAC50C5A1CE4" + "D3A1563DF49C881809B3553360428F8DFFFD2E54FF262E9697BEA57293F4463D3F9AED92E29F" + "BAC075051180D3B17E2B319BD8DCA9785564C67D8E7865CED811D66B863662143E6BFC1D2F73" + "1E5C98B36630C44620F6DBCAEF6A9C38A3C7FA3FA02FD610CD1D0B5343797AE92E2602D8630D" + "14A932FFEC33F4DCADA21F38D4E597EC152A6093E2B29897129CA9900A86B4E9838021554D58" + "3C3B385285CC605176D78005A4A75108238EA39CCB9239731C", + "BD2DD2597D6E6C3CA865D44EF382C13BDDD9BF358C8380CB6E936424183EBD6046EE44A3483E" + "8AD0B97AF51B103C8D8350E2E33167037D50A5007351804AF831FC3D26C69F5128BB2ECE7CC7" + "22915BE87978E3C877C04DCB994A3F98C356CAE19DA5E2AAF96A5EB020BDEAB957EC43BB02D1" + "26B6BD59B691AB59AF7DB4A6A92666EA8470ECFD5B705B2B70B67EA698E2A12DBDFC56FF4BC7" + "24484E0D40A0FE9C1EB7D147CA183601E355C91AE6044D759F08B37B3372ABE4F98BF8579A30" + "28844E4B51CBF19FE33E0849C828BD1A7D910998948D3BD81C3EF16E7C1DAF5DFF7F6C8EDBAA" + "F392BBB60090052F644736A2DA5E5FFF901EF627B74B88173B4C4949C550497C3E2CE8B6D1C8" + "1228562F94F7BB209433FACFE5EB78078D992C27C9B95DF60861C60D8082A04D6FC8CF5268F1" + "C3412CFEBECBBE27DA76B1EDCED924515ECF7A6096DA6969354CD384E86FFD92629D4C295402" + "A9432B94649BFF61721CB32AC96965B69065EF37A8A249B73B78D6E5BE47DD37D7F3482C38F1" + "64AF313F6B2054101B06386106FBA9D93E43499B1E01ED7A7F35FCC2904DDEF29F46A1448138" + "B6D17347C3E920AA3929232DCE811D2EDE46F7809FFFA7A5B456CE226F4A009006DDD49CF55D" + "B7136FEFFBAF5B83E768F7C381BDCB129199089BE58BD141392107CC7F98FD38AD27221140C5" + "9EA1FD19F07D54ECCDECD10F9AEB220675893AAC7806C1853E28BED78397F0502B0721224E3D" + "2FF6A3FBDB4854719657E6D0ED4DA0EDABF370E2157666495652DBEF59AD5896D9ABD6D648B4" + "0DDC237EA9D57BD040D7A569F5547A5B987536AC319FC5299D3B203EE13C71E9E17DA8944E33" + "E7374DD148AF96364BC3F8C1F52018ACE00A50ABEC0E68CC7470AC1B13C08D8AF5E9D0B517C1" + "2C522776206BD7C182426C976D301C131ACFD9BBBDC8341CF722BA6153C3676BE9A4BB4BD5F4" + "6622AFC98C24012E066BADCF241D6419EBEE0EC817233B827263888E03AEFDEF085B89E36E12" + "791C31233D39D0B5E821F1463F24D6BA2FA5BBEF4E9869C2AD1E00A8F5D812C50CADA669EB0C" + "217DF77220BB74BBB17C5C6A77771BF594FD28D17CD6B57E513AF998F9780E8A7EF4C393D980" + "6457AAF4A8FAE3CC11A01F9392847BBB9B76B228E15691D182A717D28C0884E5B4D309949ED0" + "E425BBE0EB4E108E3E771E18ED5185C365D7B373322E5E9B7E5B84B08C587540B008E6A4E845" + "94057819C2303CFE34C341AFB14AE1AD242FEE44C430C6370C50526B2CF34B8EA15EE7C4AA2E" + "C46369DB13102375604376149C29663C312C95ECF52DB74D76F62DC641F86DB19BCE3F8BCC99" + "3144CC54F41676FC04F5C33F64CEAA00CBAD8D18F55C47168643F0AB8A56021080D4A3AA1F84" + "C2D1C4755E31636BA600AAE64DF9875E407EDCD05E546645193267A3F8E7B31B6C3F04C768DE" + "DD65DB695E6F52691878CD287250DD840D5D881191B72D8C46E8AA47CEF50AE3A59E69AC9414" + "61D8C6184644EFE8496B0EA51BEB058658FE781887303D4053442E4ACE201A055C34621A43B4" + "FDB2F4E8999D9BD74D8743156E30F1DCF8E210E5AE0FBB484E16F25321965B4E42206297D1CA" + "831712D50E289ADDB3BBBC429393F00B10678EBE2A5EABD44C033793865EFCA2E03D3E333EB9" + "14FD5AD67D16297E535FB1DDDCAC747D1BBA5DBA089DDF7D0861AF2CCB6A614690375E2A00F1" + "6A872C32E5EFBB4BE8BAD649F8C51F082F5A1739798918713C90ED8F23B421EF7EEB80E2238C" + "9C83B989D026E0EFAF304D7049E76BACC0E900486327EA88CC", + "EB467DE72D3BFACF5C1043212413E34A6DFA048032AF8843D733351B0095BA1ABB2DC27C3DC7" + "9077AAE058BFC2822D36252A02AF46FD3A19568CD59E0B8794681A784A6D467F03A5C545DE8E" + "A56FD7E16FD8E46B2E8AA20C4E3DDA62F4520A735D9A10B183AD6291FC7925BAE4457E713BAF" + "F88B31926E36D5B69F20E0644567845455D364665754EC73FD2B494468DF1874AE550F009B5F" + "CF73D2732C048C58CBFAF437D8F551E402BAAEF3B2BB03D6C390B5FF2C34284A9C2C9D253156" + "FDF176C6CAC243BF426BF25A784587DBBFE243139872CE275938CAA506BA301E3B2FCE326848" + "531D2C3F13142782E0D1629BB9CC3EF2FC18EF501A46FA85920BBF7BA0CECFDA17BDE17AC359" + "E33D68B4F44F0ED9A9BC2A27D89C8260D7F4B7961E332867E81C3EA5244502E10DBE983B3603" + "8EBDDE4514F9EB944407CCB67853909A7DFBC3A4EF192F7E7104B1FAC67B9EB1C7865AAA1ACC" + "3A5907EBFF16B36FD9791A23EA05BE879404D921F45F4279A9C98A321EC96A4AE902409025D4" + "95A4DE131464E56790BE8BE126C80A785F6815F11627A6FDB35A3FF5F826970CD615569878E3" + "5E7798D7E348239FBD263DC970F7EF964272879B4CF8088A75E7CA289EEF5C701B37065F6C21" + "D02889295F0E05F985331E1A7B4BFAC1904E46F9150F6566DC3C8BCB45AF31E6B0D7A1EF7A16" + "FCDCC177BF74126857D89602BDC60FD3DF0CE77651A2C1D0790A323F0D2E328485931CFD371E" + "0317582954C726B91CD386723091FF76F868879693F590BF7090D4D8DBA3EFDAA3292E4D0E54" + "850B0D3FEBC270DAF0375373DD575009E2ABC6FB0BD7F4C68C480D3392F3BCFEB6403C2A9D4B" + "863EC588A4B52FF38DCABA9989B2EA8A8879A88981C13E5B6ADB1D92633447FD77239FA889D7" + "69278FE251AD706342166EB394128BD196EF1C8C11545D3589C6FDA1FAFDA95C5EE8A8E9703F" + "98AD948796058A78741E6ACC5AA6172FD8BD5015291B2D1050FF4681D57B8278EF0F90ED3756" + "176A40362B333AF0847D53004817ED94B1F2092130820EBCD7F72D39EF98B5E3AA5AACAABEF4" + "7FB304425B31C29D5B8E578B532FA48F885F9BD256D18E8AFA60FC00A373727141CA668EB275" + "D3CC1F392CF2BA2C989695DFDF6C5D32AE303946B8124C27BB6A17797E3402D620D647340174" + "3AC39DBE21A39CE1F55912EA12F6DA77F3919B173C96C9ADF812D22E890896B112F2201EF069" + "962DC1A47E5ECB67CAB5E0B3AF5D7088E2F18024A3152AD2C274AE2A0AB862A80764657C5020" + "410E5D24423F0938A764A17428E8747BE8E9A09B4D7DF2C6F61A414DA142E44BDD47A85AE894" + "D3B56FC7B05352F9E42DF18FF09211A8286623CD2EC94C51C3EBABB533123276D5FB23B011F9" + "C117E33A99BD3F3EFE443DB75DEEFC075153AB605130419D8C3934B3AFAE6964E18DCC106450" + "36AE545701FBBDD76DE113FBE7E5ECCAE63F441CFC406E26FD5B726246656EAEBE1C51949BA5" + "9E2330A0AC42487F8C7DA13CFA56506F1FB56E5948BAD0AF15DE913A142D9412C37B1A7DF596" + "C82CB8BEF170B8A174293728E487E21125D384102051F5313700AA30EA82A3A9721A5AA54629" + "200C7A388875D7AE683D6A9F369BD3F12C1DA34CB07BC0227A446B48848BA25A40FDAC9B49E7" + "46CC4E7F72DB7A42BA44D57C39CE2C23EDCE1AE17401671358235A0163F4F742B6EF219240EB" + "14E063AA65D1B7DFDD4B48C9A2EA79A4E7C19E5D726B8B329C147276762801F832FA8B8C5B52" + "5ECFD08F892FA6568F538ED5CA1C66D211066FF17BEAA9AAD0", + "013C55BC39AD864AA07C8B77EC32BD567080C183349957DECC2C4072D8DC136880D069A213AC" + "601887D3513CD624CB930BD4FFB47D11817A377DFB763E4ACD5830004AFD075BDBE8ABE3B690" + "0DBE792BE2A5BDE1969A6112C1074F2EC7AE097D99A7E0ECC13C2100FEEA91F081419EE4D4A5" + "7A6CE2063293CA2D9DF0D7037DB273F3AF0197F9E5CDA471E4BC5A52B90945C5E3318FF62D27" + "76D0AE715D4D8D501D4AC80F98679CD3E53E21E8FFBC83403F77224A2062128C818110BD3E17" + "55183C696C69238F7C9D73EDAF7D1A5712117BA426EBAAF5EC56C25D4CD86EEC6BE258CBE541" + "38C0DE671221CF1C4EFC2AA0A391D6EEFA543BFEE2394FA70F0B0528CCE914E7C1F7EC93CC28" + "8CA1A9CBF791B541779F944BE3792BCD91282EB776DCA348AC92683D25AE567A9A2B93A2988D" + "F5BE86858A227B0A5787173DF61989E35C95C8C6174554FBD81377A15B35B103EDE8BBC2A576" + "0997BBE51C891FEBF9B0CD8C1340DFF9BF4B175E5BCDF9FA755294F5035A5E9C20CC582BF8B5" + "55A3FA834660872F4B5811E52955CBF3F67B4F5D1A5FB3FF6059063661B3FAFF122714FBBD32" + "0DD4A87BA2F6F811B59B50BDD9037BE5545D0C62752758F2330DF79D1C3D4A1BC88A342C2FB5" + "F62328B93A8B2BCD4EB49782C926A258A76DDDAE8291367A93D8FA453F3DD055B13DFA72B0A6" + "22867926FDF07CE512E662941A1E1CBE5388EFFB854BEEED7138A0AA87EE471E70891CCF6063" + "9054FA6348FAC6EEC36657486D46F5EABAEC84BBD1091D4B17DEB6F9D727DE3892C6D2C78315" + "5D0F97A11030262908C08A489DDF805827BFE2F08F94F9673CC33E026A570156365751CEA16D" + "DC968DFE3198F4745213A94B47A4F1C4B674F3FD301EB9F9C9B7D81D61F7368A79298C08E6CB" + "D4A564EF305021F12AEFE010879066E0FCB337D20EBC6E9E5C106910CB2D30F7B4A8FA93CFB6" + "012DB8FAA2FB7B5C17EA400183566A4F8DDBF7DD8BD03117C5BFE57A193A648D6791597C2300" + "C6B908B2C16022D9076369C046866F7D532598306021CD57A986FDDA27C0AA4C36B387B54790" + "113D2C231FE80F2A4E1B36792237BC79C007FFADB9D93421A22D8A1F3E662BAF5D30AF480D9D" + "F5F521435A3B58DDF009A25CDE9E579B27D72D08D60949802A85115BF06B0D6F1ED650BA10CA" + "7B40EC967DD6330ACA0DA72ED9625D080187115A32297580313BD05A088BD6BF42600C70FB2F" + "38FB8E363898AFF584BB855EC89E9595FB560DA9DBAA88C1C268BA51188EECC0BD85248C98AB" + "1F37794720B254ED76898F5C3F6AA799909B4FDA87F79CDB9248D16F70EB7C275E7F7822C3D0" + "B6624D8DEA406059AB16BB136BE936A258E7301C54EA4AAF8AFA02A84D185D8F7223D65173BC" + "F62A0B055083D317A36D2AC5F9695CA01C8F6870832FEDF0EB2C033CCABA632ACD5319754CF3" + "00D35C3EDFD304385BC4E014EA5A7E8D52DB17A32F042A834151BCF73A29AF113BC6E862C855" + "017D47D5495CA8E0339C6915B25F5B2375A3566818095EC6C919B42F0D107BF9EB90FB5C3BDA" + "2C49276CE7BF856FCB642667955BF0EBC645BADCA934138A7BB3E35464C49286F40CDDC46229" + "74590E0C45576E56C1AB7EA6A5E44DEA877486BFD46471B1C77C73D37C38C0190BF5AF444168" + "2F723006BA51316A23860042E91A6DD396C14D4331AEF9A4DC0B794C217429ADE3DAC3583F6A" + "228550064A41AC42D3AF9367A9E5ECE916403EEC6B716B0A12BEBEE6C04BD432EBD75199F3E1" + "46D11610B26E76D7FF800E78F7B11279B361C953C05FE310D0", + "2872F997C576AF07E509ACA43401AB31A5730DCFF11DB8131B8B041CD1CFF72B6F1298534E91" + "1A55A72DBD738E0EF18F4AF1C68F8F642586E715FC809AF1868FD18C1DB9726C3852CBD660D9" + "19FDB30370E2BF04E8475BBB41DB7E942A56EECE28641BCD1D272C9FD3704559660CC6A9D6D1" + "E77C84C5F196008058D63E1BAFBECB0CC1F3014F3D8C42D11A9B4488BF56D09D730C4C2BBB28" + "E6B2086A07A583CE400E93466C2F41563B3B7CB192929A8D7AF39B6BE00AD9316294A65B4112" + "48CC0A78EDBA6A2457380E18D6EBD5D80CD2D26C495AF67A6A51829574028CD41D3A67C7D08C" + "13F2588EBADE1D8F5276CF74AEFAA4B56545E58EE535C842524F67073736E401C97C2461A104" + "1F3D23E45BD60E8EC04ACFF574C3D9CD8141C21731B9044C884D84E5F5BB5F4E43642264413B" + "19D08705036737865D5FE6A406E2E0D7B44F8979F0410B0C487D27004ED9D9C1CDE494842759" + "4EE34F454D5A4ABEEA5DE6DC95E370F6BAE2349F906217C7CCB9705662805D528314ACBCDEB5" + "246C9696603757AED630E039D448ACBB6E3CA066249105B4CA528D1936A00FADB39EBD62B292" + "931A7DB9B8D505E86CC592E004E7834BC0AC209ACE29BBA864619D7216D5FA2245B2B1168463" + "79E5019F0661A6FBEBB0F8D6340200D31F46427DCF16D72AC660CD35441D97F269C97167B04C" + "28E6EED4A852FDB705BBB5C42E41FA8E1D819B7F31360CD7A694386C9D3B706317E2C31EB202" + "7F51CEC3484DE3E2C71EA5E31EE0E39D7B69CB54B112E5943291EDA9DFE7167041A3B1903B71" + "1FE7619D4B19AB00584A6B214FC1EADD47D33E9C2932DE9AC8315313E8965925707BF5DC7D54" + "40909D9D5F68660B33F46561DF7728FF3BF5EDA66DA3324AD4EBBE422279159285C29857570F" + "E09F114AD22B2922C539DB6880EF3287BCBA565D04B4244ECDBD6F6FDB89E3431C7E0F7B83E1" + "EBFF4C65BE24BCBCF4AB0BD5C2A45C8F1195D69876B707F2080E5536455E52EEB718366E94FD" + "2CACF01EB29DF03575ED090BCC2A4E0837B24D01885BE8EEBB61CF06DB165EF168074B532032" + "AD519F4A38353529F0EB43F89D370F816CB9246652132CCCC649CCEF8B29926EBEEC3F6935AD" + "3F1A3E4605496E746836741F582CEC01A6155606AA8E10E923F5957B7B5ED5FD01A3A2CB9B89" + "CA8B826E04A321A8AD1F7E7F76F5258BCE1B952B9604AEF785B26B528579CFE4E962AC2308E5" + "73E95DF5F2759665DFF2417B6E68FE459987572D308F1C32F1372E0F85C75C9FE0CBAEE4BECA" + "8755632FA426076EAAE1164E70D5EF39CCF0B96F04C200330010C83DA743CCE73DEAC39C9A21" + "D55DB819097D31AAB854DF49DD74C1FE4EB8E87C1D3B23D30E3C432D3AB866689FC59DB7A093" + "FEE99A6B93EBEEA5F3A9C4310D51A5C9FCE7A852B593687BDD481A752A761CF4692BDBBF9FBE" + "2D456131481D907454E47674D171602FEADEB7B7AA6BF125C21C55581AAA19600DCD06BE0B9B" + "058B9DA4A8189F163F2D6B25BF0DDF5D9265347DCCE498CCCD32129989274DA07C3B2E47F0B5" + "C3E52B0B0714BE62AD530132B4B805A3DE9A36D83CE1B75DC5F684602C937B041C950CF4242D" + "EBAB03EE535E03CD4D2FCA5D9B063B5DD29EA89B2A9C0413F83B5B865AEA623C4E8950EAF435" + "4BCF4F491F698CBFF5E1F077BC1F8E30B1E476FDBDAF6CDC890B482E9A974F78533DC045B6E7" + "28D1253512D4A23E41FC3ABA8650E8526A2791109F75CAD493316D996DEBF73FC53BBEE1A98B" + "F3341985BEAE6E42408AAF8EEBF783A9269A45F232A304D65C", + "C4BC4E2DA651BC3EEEBEA756C3A45EC3C594353B78E1FFAC6D50EE74D7B037C9D5476FA662E6" + "6BAF46B7247E8BE7AED898C902A1E3D01DE0AA91E17174AFDE906F65B9CB024D375A97F378B1" + "B7DC043CC5353FF06613861C3D74D28F32AAD17159A1C632A57ECA0441C1AF38C8ABCD1D02B0" + "72C733D9DE6FBD0CB10C2A8AB151103C2B6A67369A87A253BABFF685EA14C1D5BB3A46EF8D8B" + "3A01D9E88F8D22B7B937EA9A3B15352DAF5E3753DA5FF8592FC90E0E65D524D303BD9CA731FC" + "14095DBC08FCAC6423308A4604F74C4002CAE78D2D16B5D2A2CD9217330B6C24D03BE126AB28" + "BFCF93CC3B7527954351AA80B46EBE8EBDF4B0567F6BC3F2A728D1025189DC2A85F2DCC0D988" + "9ED0DCEF7835240F73AFF24F5CB73B916489D3DE97588B099FE0C907969729294DD2D5C574ED" + "9B0C473FEB593935AFF9C461B36E5D475697652929D2D3C1260FF321A235D2F797224D13B9DA" + "75E49FEB9DE049583DEE7616F2233606769F42A8772314811629CA9F87ADFCD41A5F7AE2FAEC" + "5A02AB158553C95DB86793E7FA29AAC90FB816486DA199D093668A975AD16963CEA6800465DE" + "40C4A219884C6A7E207B7520507F19CA737B819649574CE0E127E9343FF4B795D8F5EB695951" + "B8B2AFD93BDA8963E22F3700B9A363EEC4B9BB570650AF42DFFABB948BC2B2D9CCADA8781115" + "1AA2A8611A617BECF73799C69C1A817167AA2639EB070440A6FD4A98C70B351D16AA99E2965D" + "7870C390CC1FF95946784077DB1A3D9FD2B5D96481A73B4DEC12F7EA5D1D0F12AA0F70178F0A" + "81263236EBCFA2FC49DAC5EBACCE8CCAEDC55727D81BD65CEE156C6BFF0E3DB958534786F44B" + "86D5CAFAEEF87B14CB68E47A4633EEBF0E85BC917542B8622C6E7C1B04472BBB7AC2F49B2D36" + "9020C77983F3CE0979B70C6CEB1C03755EB178D59EE585CB51B4926608AC85946D18809CFE26" + "C98229CE910D80FA20E12421FCB2A4EAA677EDD1DC195FE1D47D6DEAA563FE886AAACBD3F868" + "B524A749950FCF6AC36EE44C689A984CEC2A07536341AB49F95871DC560C0D68BBBE21829D20" + "CF2C0A27381E9E5CBE7A403D261B9EF712E1ECF65282A24A5693FEF7F452DCD2D8548CB7E4A4" + "67261573FA5538B7A6584ABCC83788E8A4C6DE1850E188C706808DE80DC5B85D5EC9D7D30CC6" + "1175D94A1D05A1F2100647DD2399F1D1702A0E141EC0623EC3FCA044C095A364D7818042747E" + "6092FB16294129BFDE5B5EF592CC6E2758AFD7A3EA31961A75CB7A780DBA316484EA7024A5AD" + "C3B8CCADB49C1FD31DCBF064D0C328258C3D23BB186370FF7D06F94186C9BF9CD0EE8B12521D" + "E1EE1292345DC2CE7F64D860A7D82FBFC3B18637712F0C690530C2C983F4EE32FE0E4B6D4CC7" + "70ED69490395C849A3176C0797B4EB961A6315F17AFD46B91D8CD26BDEB69EFF6520A51A37D2" + "419F8B9080607AC9B16A40C8814FF0DF1180DE0A1C1503A2E3E6712EF8980213E1682E14A6EB" + "A218CC32FAE4DEAE8768EC05EC405838C461C2861ED8C945C47B04CF5486997B472A97F3AA19" + "398949FB4C4A86D2CED28BFBDFF25A949150529BCDE1D23BDE76192F00979F4E9E5E0739140D" + "3CC12E50611F7745AC0C1A8EE386A7E4B560B1B2B8150DCC8656458C89DDB0D5BCFC2A64B949" + "2B4587F2F4D555845FF1A955EDAF8AE1FEA60EE2EDFB9955C9534FE10921C117C06C225CE510" + "64D91FCE40462D8A684D4419924B62B4E869DE6AC7A35EABB00E35CD8C3B67A41CF3F067B8C1" + "025B2D364BD0D7B7753888360F9D8D118750ABA24F685C3F5C", + "79628D2EE6DD505B3FDF023B1BEAFF8E65C527D9B361ECCDA3A6E159D94386574DAAAD6187EC" + "FBACF7F08CB67E868FC4DA9092C6C4637302312CBF295740C15DC2EAF3CDEA4BB7043E09CB2A" + "085075823FA090A09B9339D6E53CCE7B713C7DD37DDD4189DCF51DF27215BF3017A922D4644B" + "795A60B0EC2E82ACA93ECF76C31106A7C31EC531E08267C62BFEBEC82BCAFD5C2BABCB8EDD66" + "5F1418C9BD9E544390699198128C2170CA21E1819CA00CCA8A73DC453CE1452B334F53948881" + "7FB8C442CC9A31B5583FDF72DA0F4AE6DEA1C85A789B347E21DC1D4BB09CBF84D1AA15C584C4" + "5161C1237D5D400E5B294B74F0EA8CDAD943922DFEBA50B6BEB34C675661F009D91F0FA988DF" + "09310F6073D453244ECD506B71770786CD4C4F18226BD9D6A89B74AC859C03CC279516585F9A" + "74C8F57F52FB0690F5649171E6E57F9103387B833F217009495A3C25D88C91F1A14A3D8CFC79" + "6BF6CB619DA399C0F0F7870FA0A7E6C0F188101B3E6C0408C781B3F282F870F78781CCE2DCC3" + "69B7EB4F1F98DE2942C7C4988DD21E2D494807427E60EF0E6044FF53B3C744935784B06FA57F" + "5789972CFD0D3454F219E01CD09A976C8AB5CDEB220C791959B0F077476B0559B9126515E703" + "7846487D88CAF87C4DC807C335731966BEB6852EBFDA24E14DAD98AB8797694A6D38015D5F62" + "41C3451190D1D42AC590FE9C86E95C1DC23F166C8F2D09C2BDB3A9782DA77DFE0D56C62C99A1" + "118EFF408894E579666A51439E511DE728A998029CC0C3C229874218240CC4CB04E1153CDEC9" + "8C147D335DB8E9EAEA1D5FA9EA09BEBFEA31F32083C651BC61F2B04461B779BE4A9AA0BA1B86" + "832D4F691315A24AF4067ED42727DC579DC8C15DDF65DF1E476F399E53B5CE64EC828482FE20" + "D705082A69C83E1076E92BD9E7ABA1DD4181754A7E9A4620676311B1A484AD91F8B0BF369887" + "F79AEF9BF0C35AAAD97530E14DCD43B2E2D99BC366CDF251D338FFABEC6E207DFE6D055DB3BA" + "58A34F435FBDF7FD7BE1281F4E66BE2CBEB302CBC421FAF0EDEDDA958F9311DA6FC1DE8BA1FA" + "CCE825D6007669619933DB86D5A3896F74C7338521100097F4D971033CA9B1052DBA110F9672" + "E8A2C573D823EC87ED2E1395A6DCCC5949863B8AFA42EB9A50855F34D1B34FC9A21FEFD00EDF" + "2D057D0550847EEBF06AE2E43D5A804BE25ECE2992A3820EE17A73F5D900D0FA6125676479FF" + "FA852AE73ADE60A120579EEFB55B9527ABE1689D2507F84D96A9CF5315F7B6F62FC3BC4808B5" + "E4C7748404416F4FF86C485195EAA35239067A95016CBBF0FA155F5CA1EDB3D9E22C4E814642" + "B90DDE15D8BC7D916AA4D5E0B39AA975176F00061D0A065FCFDB0DE93C804CE47BD5871D57E9" + "6BCC7A1CC927010B51975C18321B000D84C183AE98AD080E493385E33D697EAB8E1ABDE27320" + "13C97B0DBF3FA6050B86000F6E8AE9559CD07AB255689BE3D1BA87BB09D4262817234479BCDB" + "7853AFAA85F0FDD3680A95E609C4AC557A98A12361FF2F68220212EE327AD10123DC3F46F6DE" + "FA8CAF39569B21FE0A4B91687D5E4A9DAADF779EA0485067B5CE754A15FFF9E26E6A4865F0B0" + "09BAFCE5E877041C54994737A47D2015ABC2747560FD77E210AA0BEA0B4FB700BF7F84593F2C" + "D8B2CFAA10A59D7425F51DC61929A333B65A9C874B7E137C41BCEA345174E69F0885DB4A08D9" + "53CC08E9B2FE9000884A1CCE32EF691C5AB61DBCC9986966E006BA417335F85D17B83F65B88C" + "9F1A95BB7B70F5F8423D340CD7D347D6672F81487DEBFEFBDC", + "2F0E0B80EC34841C0E38C115603E31E9F30BDA7D0FBD3706CF04E9D7850DD087C1EE5BC71A69" + "6D282310369BD216450A0F9533A0644132CDE4CFC4945489442F0F196709EBE50F4B71EE530B" + "EA3269708B663A9742F3D674403F4C2BD241E69E4AAC3038816632D79F860F1F94A4F3AFE521" + "FAAFCE17E69DF15A0C482106618B3846185CA13CBEC7B4FD2CC6868E0FDE3EE96B995DBF237C" + "BE73CD4A94B3036CF87AB64D272B7773324D4CDF3CA123E028796CFDDC6A446930ACF0E1EB6A" + "B363A908643F1711A4EEA2D23F38B3F0DD8F675C8C2035D489D90226C914F766A177825E96DA" + "A4F3846CFF67F37F596C74D70DAA604689CFA2197BB5E71CC5C6B00BA2E801BC7BDA1C64D8C6" + "2218846F2A4F30325E83145047A085D672E40BD051BF413E6249E05F216371C1764B0305BD7D" + "394D342ABD51391654A6E3183BC1F6310276F332CCCA4A8EEDDEB1428D7BB7715253334CCF6E" + "408C6F83DC18C7652A689C8ABD542CB29CBEBDA0C0D26E838EC684FA0792467C82FD8A0BD027" + "4E6BA105E20A28C17A4C0CF254F6211844631B26385BDE3D801745D00D63A338E7ADDE9845F3" + "91620655B0EB2E369AFECFE6FF3621CF255B697A41EE8566EF289364409B912BAC04313AE6F1" + "BB0FCD1CFC4B45772588E8FC261095C6CD56D7870F350C9622563BBF369E1407C4853CFB32B2" + "4CCEEED4E4B26D5E1F36C0CD2952B3CE7D3EC4FDBA99D6977C7BF071616334BF2DE37D3C853A" + "18621CD186608412305A8FB967E873F55F84A7F5CF2529F8F061F9EB4C66811C0C3552796782" + "4BD432FC022E6BCF42E95C66D10E964C57D0CA778ED2F0A7D790E698F0F422912A2923F327B3" + "4C822605CCA9F050A2684BD96C08C414B69658E3DA7783E10BB0A1EB9720F360ECBDF0BE5BD0" + "CF978C7C06A8831C7038212C3701D070F4996ED660E452877250B5A0E626F07212BEE53C7EB7" + "6323B2B3D413D159733EEEB98B390DFE81915FB520AE418318DB5E37B0FE23C6A2E8281FABBD" + "08A6DEBA99384976FFFED57F72200C6BFD61266708F37DC6287D23476FA00D4257C9EA0B7C5B" + "AD853905AB1C00ED198B5A8AA5287A4E77109619C84FE317D1453CE8E53FB2D1ADFA7FD97FE5" + "A35EC5F0CDF4D64C18242218DEC5C1C2802D6D64D1ADF8EF9F1E262AC8A0623AA1033B5DB8F5" + "996AF02044FDD05BA6B8308D1C2509C54760C2887565BCD95F4B8317083FECDA0A8E5E51D466" + "F013BD83B7B5D1AF0CB95DC717D9EB92E8E44F799E88153DA3E9ADFAC95AD4DF970F298AE430" + "1DAAAB603602EBEBE5324CDBD5547B3CABB671C5506E1B190FD7CBF02B65FEC42F1DE2D4B5F4" + "BFED023190D502564765D713F96E0E66FB066DD18315183176CC1BECCE0ED3F91D74DC4D4815" + "61318816FFA5F5A568F71E846FF4DA81FA7D7E131B0EC15471CDBAA79BC5557B664994FAFAE8" + "0D80DAAAB70184EA329E1D3F656B526BF6B2F8B795022F33DE44E2E93AF37D1C7753A61EB175" + "BDB837B901ECC5714F4E2A0B66FF821D183A5F5367B4D5C22860DC54721487162183ACBB4177" + "E44081EAD335E3B75B9810AB88C0A26A8C8F1F3EE3F6B164D6D6802870746F63088483064D65" + "F661F46F58B4EFD37FCBF6B169BF94E2E794517D18FE42730D211DCE4BC294AA2B5A3316E007" + "1AB4139436BB47DA0AF27D485600BEDC5897C28C77D9E21CCC90D7FAC60089DFD56FFFEDD243" + "932BAF6CA217BABF0282E8AC788FE1BD8F5B6318304EA095BF51302FF6139A33AEEF99D35179" + "0579A9B898DDAFC794EFA909C1EC8CE0B5A149DC2944E0CD6C", + "6411612E81920059149F81AF514A5F0DE03F57ED365D7D87F8C59F43EC9A1BDFFD6452F4B67F" + "AE6E522B42570F5548AB885B7A3E6B2C63E9E9F65C81E95F185A785D40CA412C2507B1F51F35" + "0AB92A885D5A6E892715B3B90DDBB359750B84870A73F50FFBE26B7AFBFE346F6363330C5335" + "5BA5310B0F3902B34E98C280F371B47FA81F7F029D41106B8CA59BA907806E5E87C7E71C89EC" + "070FCF3C8DEF5843BBC7CFFE6DB7454372A38C32504DB94FBA54A500E143E84323F72CAC1CED" + "6F17FAECA0B2930A7946EC037BBEAB7357974922022BD3C5EC57B64F54397A359EC5C189FB70" + "4F187247C54B2E04BA9C0A9EADB4045E3AC5276CA56A9F8160438AC6C36416FA4FA724D653E2" + "28D231B01BE91E2523C71BC14DD9400EF6688E666DF0A17CEE48385DC87FF1F8189050FAFE98" + "653EC3294B5089F6AF37AD91C7BFE816EBBFD6F0B6D6AF77F689DF812D2D44FCE8A4BF340B68" + "1AFF9695681889819EFBDD5281CCF1A92D13164E53398F3EA2867663E0BBF501C34430C22C38" + "0AFDD07C66E61457CF19CCA7268C8B4958F33814ABBDF7981901816A969FF5816D02CFD25173" + "F22B4B481FB916FEEF56B6D0F6BFDD76817FDE389B5ECF56F910AD294C37CA6197F5F0A09181" + "F8FFE13BA1C12773E850FB66671166F70029BB283D8E3C4A47897D80D8C4B1447CA6B24E5F25" + "F6826C36351C20681F956A536E4A35C7A202DB57950395D2074D2A3E24E18F20EDF9183A379A" + "C5E9C2AF26DEA37A3CBD4404492E9EACED57DDEC037629E50C94D05375FE8F6B7383534EFC4C" + "217C28700A52A5DF29DB20A4C31C54EC2A2EDB67FF3E3DDC21AF7B13CF3F0E0379138E7E3E17" + "A7601E095D9A531D60882B940FEF815FE2D8ECF01431972CD409CF0D08CA5DAACCA30CCC6C6F" + "62C7FDF5ED647DFF0AFCE50E121D0AE9ACDDBB09DCDA8E491765ABA11549D50ACF8AF8DE0A43" + "4825302BA1E5A18FA97813A6F9797C634D67C5EDA11D512AAF0EA42D44A7675FE6D2F4A26BFF" + "BD85937C2F9A31FE1BEBA6CB7EAFC07B0FA528AF581F9289A00498174868826C968EDC36D6D0" + "A1679E9D25B573E166ECE6F7C09E21B350A312798EB8AA9ED44C1E3AD385FCDB8DEF65C0ED65" + "3AAE037E2628D8B5F45751D7BE0C998B5EBB3A1B7A06E0D40F1B65A5C06568326AAED8C51ACF" + "108775B01F9C5538E8C137F53A8AB253FDE4ECF92E03389F45E72D52D44768DC08B8082E858B" + "07AD363BD8599462A60E20ED97D949019E860908B9112344D4614A50BFB65353EE475C0EB28E" + "4D4A9892B4D8B8271BB5990A0F00E6CC673729A910024F314E926DE1F9646559D32184493A27" + "9B60DA8611AFE2CBA4ACF21780C935C9802B1784FEE5539B37C1C9178414FE9BF49A2B79006C" + "E09E309AE452AE3A61E1E18AAD5951F63A40412E9DA4D55F9B3DFACDD11766BF79B3F5564B72" + "E90404B8DF15356AA30F0F0CB8EA944EB218F20E6C013DA8B25FB2FE5043D12707D9B3954EFE" + "43D1A80327592603D09E6A4BA68FEB10C2B60DB3C8B924430997354C4D3F0F6C92E519E48011" + "2B29D9CC66CE01E0A1335BB1C83A365A9232A564E29AE075C4EF9594DBFA14A50C564589113A" + "2120C2F3012537D36E08E0CA8C533437B8D96BC1A342E8203A20762DC4569569CF45F23980E9" + "3E6E4F7F949AA2B95FD9062E395473F01B5DC211E6B14636EAAC982D4C074B4DB1E0560EC0BD" + "B0B9BAF5A33260FBD715D45F5A3628C8FD80EAB94D6E074DEF63B67F4396B8F06456F2AA3AE3" + "3C918A159B08F207DECE6ECD0F9D5B4972F3CD0A16D6D876E0", + "ECE632A6E99835ACA260BCABC81BF5E679ED246A37892207A9C353EDA6BEE30D3E5A376BFD0A" + "2F935F89B501BBA978D77ADD53AC7A40DE461D6EC2B9B2CB0C9BC27E3B1E18E372A4BB93C801" + "9B9361654BC7F94B903BBECDDFFE80E0A82E5758DCEA8E01940D22390105C09A86C4E00F798D" + "550EBDF540FC509D04B2DF6600B1854F040B227688EA41BB52F1371672338A1F90B4CAACB01C" + "ABCF8E7F190ADF8E7C3B9544F2A3050002B19DECABA4F1383B90A21698130C5BA4BC6733516D" + "D4CE3BA3BE508596ED9E589AEF9FAA3802C84127F6BAF626EE4177D2FFD6564905CC6B07347A" + "FBCBE674D974519DAE7D605C8F19D5B0CC9500F240C5E54A1B4B6D81FF178B78C98163C41FB5" + "0164B378E0E6F38C2C4FECB0C95C8504BDBFE1F179129815EEAF295F5DFB664D6E5C376D5229" + "E526BC9F70EF9875631F2A2B97FD3A8A9F18D5C33EE1DF27AC94F28956DD874ED64CDBF75F52" + "9EAEF5032913D1F0FFB7A414275261A6FE468639ECE0E3D9A4D015BF0478D03263DA3D1FF036" + "DA5B0A54F46049E0152661B5731E2740D7CEB73145D365CCFA7BEBC59C1AC674124D4D7FE97D" + "D04EEC8DEBADFC904268038ABF3EEB234F36ED34214FB8BB8E6576D1599CC7A4BB4619032D08" + "A13B8391E4BAA6F731A8001418A9E4553B87CE3F6A131FCE3E7AA701A6AA65A13F0A3989CD1D" + "91E95BB04AE22DC89A041E5431A00CDF69A4172147E055F7AE155633DE00E46C2B2074101388" + "9605300E2AE7635D4E80A0E02FFF766FBB813A53FC7A54D0D93B3002793BA4A9D8E30F1B8FC8" + "7B261A69B3A86ED70C4F604BC6B9576BDD63D2BBB015B23F593E8A17FADD8B4F9618EFACB6F9" + "5872BC08923D8AC496F3CCF5FB027AA7A0C8A6B58332ECA98CE6FE520D3E364CF5C189BBE708" + "9E0F21849AF0D6FF2ED322AA613805C9E251354C5761CD42BFE56FC8B2C6F9BC27AE850CCD50" + "001F5C9FD20A34438D935FD0BA63706670788C4786CE25C1994810AF7628B25AE1BF36C3E153" + "B1237DBB00B954A6F26A1B3E26784B84AFC076ADA8AC4E9FD9814C41842A5280D6C1C8D01EB0" + "18DA5E9FCA58B79758137CFAAC7B3884875BD3F67C2411714296888F44DE6D4BE02FC3BDE76F" + "0949D0C53E06D335AAB62D02C8BA441CB7DDEE75768CDA51E561A27332939FEA3E0A56A2AAA2" + "892DC5C96C19F498EC787E831F1357ACDFD6CC54AFF7E80310D5F6B2210540F4EC688BF33CCF" + "606959DC3A6D08C258E3765F5488BFC362CD933C9E2B065E3408AC3AA5895AE2DE756B4666F0" + "845938556A80086DF02274B695C4EF752EF30DFDA3DD7AAF6AE053D8405DB5DCA4D69F74CA0B" + "C388EA969546FE01FD8AA5A55C470F414CBBE5AC94EEB6E8086F281D5BD57AEF16FEC33DD2BB" + "DC8EA5B4B9103ED840055AA87268843D998B5AB9ED1D6A469570D440B1E98351E4F326CD1B0F" + "F444ABE9BB1C690C42D970EE6A581BCCF33F4458DCBC0A821135BEAC23005FBFD4A8CDAFECD7" + "AB23E305F878DC64BE60DA4E8ED245155515A941F15FE7253339161A9E296CC5BAB9DEEFB4E0" + "89744D02D1B556B32D81F28C2E4A43DB9EF70FD01F4AD9EC8BC445A50A3A2090F9BF2F6B8484" + "7378D57CFB206BA7B4694FE5E96C6035E02C4E0DAC0529508608CA066FE5C8D456D5B80FD487" + "487991F361593D94AA740376FB12372A1F0DB3F61D693451BBD4204A660E91CD8788C4783998" + "3B19742FEB26C708B1412FE4EBE0002ACCC285D790F67D8D344FDA9FF50ACE1BA8CAB2291E4E" + "80721955132DD3FDAC3D648613C1E4439F76460EBCC9B1F2C0", + "61515F8C238D839750169362288C80A1BE8D3342F5429C56CDD675EF847A278D02BFF070A893" + "8FD07FB4058B2867B0921C4E1E59830486867D79396D1A0C35B9787A2FA1278264F4D65A6E27" + "EB6E7842AE8B64C289F66996AAD5A743AA080F4418D921CB6F0ACD5B20139B4ADC50FED9F506" + "783E384410E61E448D99DE455A7636716E55C02A24C716BAD8B1C8CEB38EE3C9BE7988BAB8C1" + "04A707A2066976A5E7B474E9666063A1135A7E000D62168711E764773995BE8AAF0FBACF9A6B" + "CD830CB136ED7B41F6E1CCC332B48A4419337B2A8AE40DA7930A3798D66149DFA1FD3AAE0D2A" + "30DF52633C0607C4746F1DCA97BE25D9B8EBD9EF875BD9A4CF4F5CECEBAED319419BA39F6B1E" + "256FEB1859B5A4A10AC99AC32DD3C1702BD0F952D36FC1828A972E117FA049A94A9CE830ABAA" + "157877B26A7F4923BE7D33600FCC8DCF02832EE70D575B115B8F2A77363F05948A192A1F8068" + "99FA7A96F4B8292B8526A48B2F94092D43155116D6D1155185692053E9A24AC943A9283A5ED2" + "BCBF322C03F0A930A25341F8D9DCA9E3B511B5D561CEE98281E76267E00D997CFB8925FCAC9B" + "DC3D50ABAA182E72A52B240BFD10E9D2A28307ED96953E17A81D07976986B326A10A4B5B3431" + "AFED48F1ADF38BB3053196EBAE6E75E5E64B37B5C3EF37AE3B3748FBD2A771EC5C47C0C0798C" + "95F618A960EAB97F0BF7250CD633D8A193CB604EA2A9BD993044A25A9986670EDF05BD6ED91A" + "618367ACB3E6BBE1EAA2FB5339DC4DCF11C2D08D6000FCB5910B8C0CCD2E5C5BCF4ADD2CC08B" + "C1CA41063ABA233CFB278EE39AE6271A36BAD1C648A80754ED1CD8DCB544F7336244F0CE1044" + "38F83CC15F36FE1476A5B39009B566A1EDA709363045E020AB85CB56AAD32CDF22864DA2EA84" + "3CEDAFC8ECB4D65E4C83C90BE8BC3D3B5860B16D393D7CC2C2418334F0E470921BCC29A3405B" + "FC17E3922A1C1FFA8163C8BC43EF5CD766D672855E859962FB0A0262288D92D015D383638863" + "F5150DF213EDBB70E6478B69E007AD3A51B38B88BDBC19FFDA614C1F04137831C3DEF2810D00" + "EC25C9C56D6F99064C0338EF77B673D003BE7E5CD39DAB0047E9289D7CC62FE8371CA8B4B6D1" + "5F52F298F9E88725BB766164B3827621ED041D10D6FBF003E2D8B3F54A4DA27A374E5242A849" + "7F71309D856F227B8C038D9D62FD6ACD2BD835C4EB9F60F03D67EAAFC8FE15BBD45BCEB7AC51" + "BBA47A129067C1BE190ADA6EB8B7EDB66E9F3D7DE97031C1728920166A74F2349A887EDBF018" + "97D7E9F9401C1DB38E7A1E96647880831C838CC1C678C8330757AA1D44EFBD13A377B2705F4C" + "952A6418D24F37461EE58480D031BADA98FD662C99619692C19B78A1F4DF79BF37ABDF93BBA9" + "0886B2A6BF3E15B335F166ABC3C28C50F0F559A3EB336A1F3F595358442577727EF57B3F67BE" + "CBE147B660D25A61A64D19AFC656D76302C04869DE18BB3C92C609952A4CBE83937BB1722F7D" + "C8AE157AB83304C798E0CC704E304047899A5E179C736E0E00A7E5FAFA4603F6DF84564B13CB" + "959A012453A0E303A5EFAF3E5D9B6DFB475D96D4261F60F98252178977628D7B5CF68AF76A1F" + "C4FD55F9AF03C1BE75C8EB06F52CD5AFD1AE6C700C77913DA86E4323BFA48550929CBB17916C" + "94ABF346D1F003F7DAC22E082DE11B907349A19BB7693845E7C653D2BEA2DB4B454E3B05FD18" + "CFAE4525F880356E72CE9F9F7002F39B7BBDC7300C98267DADA8E4E90DC02C2053DEF0E307B2" + "083E0CA196FFE60F6F44747362972D7801E5B47899C3B76DF0", + "B92D115D1DD483FB4D153862EBF04EB9ACD383F30A7E8511251C54BF8B51BCD7B05702190192" + "E10006CAB0920713764C50B32AF73248403A6868C9955B5ABFF4C0AB0F07699FCD8461433BE4" + "258643A6D1C6548A3D69E20931D947ABF2E39335E4DBCC9A77E9047838D81FE7E2A7E1B81048" + "E10B6CAD91C5BE437C913108C97EC36BA44B38DCF6C10614E64238C2F4AA3D54D4A8029B15DB" + "F61A24BA6E3FB915FC7A86D0B1039B079BBC5DAFBA840ECF35A47672751504B4C3981E30E1D2" + "1155BE51461FF8E6D7BA17654ACDDF25B2601298D4ACB2A9160030FE27276DB05BE824865EEE" + "D7EED3DBAF2C9520DFFFB27919B83D1DEE1E1A9C824C72CAB25ECD30B4F33BC66C455AEE05A0" + "775AA23663DCCF2D0CB37A4D534E324139587877B8BC1D989E4DFFFB04A934F5DBCB77EB777A" + "612417DA0DB6E4E47F0C0068954D352B1948064DA4FBB352A6E85DEB671FF8628A7DAA884B87" + "0C7819C32D20A8AE4E6E25ACF370215DF5BA3DD9E0D9C08D0B615E3FA89DFC765D24586FDBA8" + "D940152B2ABC552F431C42672860836F3B1CD225D6C37E93108C893EC27DA389B536D0871208" + "1D87E547E7F81B1C1E2097EE5933DB27ACC9C74FD5E29B8C904796BC512A638B65C261A427DC" + "C28621B3F996E0F0D5032FFD5ADAA99316165C02124CEF54CD0A326EC8E0490D536000874980" + "9840EA0DEB3D8AD1FD2A38A488A17E50CFC1CB359D720FD7461CA8B2DFC12BB8BA88B49D2DE6" + "2BE28A212BE0B68215578D14473985E979093C6E1E76E8E4E33ED20E5E692A6A319DC2F4D28D" + "93A329ED7C2D84C7AA32151BEFBCA8EAE6EBC20CB0DD6577BDA004533E11263913A629E33F35" + "6129F515D47806E7C7731163CFF7A7679E5A4765C981D761F93A85E21C0E2EDB451008D8B9A9" + "E2108F4CF3AF31F706CFB24B9E9D2E56A8AF74570A96A01F6D7AB6A967F85E83972619AB80D9" + "C7079040C909365C4D78B5D88D2607A9C4BE8634BC1FD781DABC2C3D9ABC89B5C0F66742B6E8" + "6CA4181ECA9EAEC0B4A070A1E01381A679499384256C73B1A2AEF38A1F8FA64BF93F8168E1A4" + "39410931235E44C5A8DB173BB4BFA36F256C13BE82C902218AB4112935DF59AB7689D6FEB674" + "C99467D3BDDAD597588B4ABDDEA6F490194DB08FAF8FCEEAF840D7F9E27CCBD1751B2D6D618B" + "7AD34CB5B7383E47504E5012611D415296ED244A6F5FFE0C58A4F58487A479AED35AE4E9A306" + "39D2E74176178EBC9FFC6E4A7171E5FC5447EC7E05B62FDB513F44E0F98FE3F8FE33E0E45F91" + "5B7E8DB40FC6FC4547F4F1D1CA4EC7FF27AE3D0DD05CE9738C18B2E4EB5B6EB3C4BC2435E4A3" + "460FFF5ECA4496ED29505710C9014E415C4F839DB5A6596BDA30D6D69B15D17A67C8F3FD6043" + "EAEE7E3EBE21B6530125ECAF77AA5A235D356B77B97CC53265CDAFED722DDAB35F75929105AA" + "308812682FB906D49ED8BFA5BB9D1B62B4644F589192105384B0E2D03F93FA4CBE3F0A39EEA8" + "B1B9C6D484393253CCB03900F0A1C0A5A06EAF2A6F0304A6C2EDA85CCDE075B227AB378687AB" + "703D7F07A58C2FA472BC0C962375A3D6474D921260413C1C73603AB30C9D382F43FCD2ADABD6" + "DF00AD2A1D45DEA2AD4E972F3A49BE6C1DF19EB9E65E2108F2B3A36201145B6E8E0708F42B93" + "F0DD703274DC4B4F3CDCBDFE78D119DC7CEC03C57515F290D59F98F28CB9138C910F994400B7" + "BDD4D761A6087AECEAE2A7BEFB15098ABC643687D6F298B9362965E877318ACA92CF4E096F98" + "E4E2EDCF0EC79213D2F4339C45163D55082DA0FA908A28FA8C", + "590BDE57CFB760F9E657E37EC75A946D3E72EB68B00991A8180BA27B7001EAA490F93D0EE700" + "918199B4FCB1454752F89C52DAA37B395DE12BE13D28FDDCC4A339C96675F5944672C8BC1824" + "60ED8E782A6E7A74E5A15E9FDD86B14E217391D4C3CB0C460C2BB1D1ED62BDAC12B3E2859928" + "26B45B2B6F3B44CD08FDC01F216AFB268A9E391A1384FF5A3F2D1A34D711C3130A8E63903025" + "1A0E5466DCFE38E7C73A23D44B3DB1D964DB4C5D5964CD8266E947FAC9891F341F6A2D7A4471" + "225E2FCBE7D545271BCF5FFEEE65036C67EFA6D575FB77F6CB9958870BBA8A98D1566BAF692D" + "75223074975F79BC4524B6AB099420F411CDCB8622CCD1BB8E1043C18ABC5359AF3F42AED373" + "54008C0121F9391C33520D9962EAD7786918A96666B3B9F32CF54EDA85EE61A8BE6CC91E36C2" + "3BC5EECFA2827E111745F1B78CA54E7EC9091D811081F5B5688268C68A11234850CEBCDED02B" + "9952C522B9F7F97FF382D6ADDA1830E01C30616ED5AD073FFA7FBE75128D2A67502DECF5CC28" + "4B1221458C59045AB6BE042206E2424DF9CA94C7B63E8BA221F90517CDDE8F710DB1E24CD9F4" + "5619DE856DCABCD33E7735999A5462587BAD5D1A66C12B30E2727E1200C400AB3B2DD50BF3D6" + "6B28F5460F0821C7762CCD11874ECE20BC10A64355B49288F67BEBA4B83112BAD25BD759AA2C" + "65457743846A674DBFBB7EBAAD97DF98DB0299DDFFEBCF63928AAF9F4FD1E91238897AD15BE0" + "B3E2464D7F8A5D9906CC9A6AE8CB6C9A6E36F348AF11738F9C71FCED98A9C16290302719C543" + "230E23ACB162D3F16BFC87216271E545937D5A13E00EFC42CC8B73DB5368B5905266851F3520" + "D6F51ADE2E3750C188C34F0CAE273A11CA3586EFE5EA169CB979D95079C6DC189060F44D3988" + "A6BEB99A4E73148CEEFC52F21F521EEA737B156D28E47D2B8A8A34FCB6660624039DC2F27C24" + "955E003B79174060562640345B5D39F2D8A56B8DFB1FA99E7C1BB7CFA9EF426B334271CB6E30" + "2E477F2642D2CE69F63C11AC5FD5A094A802834FEFC16F60E81F9B991AA00BF71A5DFBC2C605" + "FD500FE5F8059ED38257421FBB3DC2D2F85F60C1A7D7A770980DC0311060DBD82EB9C4576F2D" + "39ADD55D2A926C48552EAD9D95713379BB3175F8984D431A3E6946532C087DDD718ABCC6BEA1" + "98A6BC3D7389E4DF5B968E74614CE795675A7BCA88BE8587BFDDC4C0647D94D314E12ACF7C35" + "31E15455B5817CC7D525D47510EA29AFC4A813746EE70FDAF32EBA352D215D072CE03869E1A0" + "854A0E3916181F3484AFA63681954DA87B6DCCDA68D6A11F6272C1F1444F9649300B487B82BE" + "834BB100DC9ED361841B7BE2E64B9E1DD72A58564766905D491208D7FD9706FC0559E01D4D2D" + "9B31B956CC7B25ED1855D50C5BD26F19B54EC66CDA595C03CD501FB074DFF58824495D04B371" + "350D2A75DC3CE933A3EF6C10C365BC9D8046E960BEA0EF0968064934F91147C1A7237C42B58B" + "2D99DB6F0AD954C0B632FA90967C0C344E38295082C3CB2E039A705D425A562EBA67ADF873BB" + "17640A91FACA2B845715D255F19F40D6D51543C6561F79AA43946594DF130191DDFEF0D0BE88" + "A9EF2D7354F399431738B4ED7D93C8E75E1EB28CC2BEB19EA8C75DDF081A65314B3E2C61590C" + "8FD7466ECF664754DCDABA55091B24AA5D55DACE5A7B7511CEBA0DED83044601D80C8772F5F2" + "C1837D0FA5A1DE6EFC217520E5BCD00FD3F8055FD031A1EFDD2C77E802AC4CECFC0B837B41FB" + "F960A00A9482D5FD1AC41E37CB39A5A1327F713A063B69C720", + "0A517804A26B111F884FF3641FE43FAEF3348225DBC8802D8EA7719F30075B1383D6C9949A3A" + "D2F40830985B4BE2FE1E25D3B5B397637270D6BF375A4B538DB93E4F2E46664957E0AB534BF0" + "7694DDC1EEFD13C66D96852FAE61A1C16F82AEDF77584021DA127F5D8A91CD984EDEA026F66F" + "085C4BE590C850A61E34F1C86892E707FD5A5EBD548DE9431793BE043B70B2A51B612D94751B" + "01B6914383E2C09E3CE9DD01DD26D625F463B7C8E854224F298651BE9DE7FBCA2C0B5D8D63A0" + "5AF6D8DBD6763477B54F7250C1F5200CF7717D9C0C097B1E97E8B48DE72FD28CE64864A508EE" + "BE43A8E7A82301D12A204A1EF8673960F79803B68610F972A756DE7E54084F4EE8E3283E10E6" + "2582D001097E90800B41A467087C14C71772F2102A7E7B6AE54E9F08616DC019EF069CE61F78" + "5204548B80C415E715C27D7710A5261267314BF4E7B12D17E978DE903039BE8EEF3004AF830A" + "4EF2ADEE2C6E6BDB1B6F5A05C6B1BAD03453DFE7B97D8A6194F2442A1713EDC62FA46B64BB80" + "BB973C790347C1C2896D80D8AE29B486D8A54D0EDC207DC9E8C297B12ABD7A5ABFE0E7491613" + "8F2878650A1309A7D23A10F66F64057B7219B38951BAFE485B84021AEEFB7541F683858675F4" + "A169B663C8BF7783BB296E0FD2CAD507EA92666274F27C9DB1CAD25AECFD6B0E4EC6E9CDADCB" + "A4787F47D2DA190C102F4B5C5929936BC1C8DAE00CF98EE571B40113DBA4412CCF75FC27F826" + "CFF211F888D645201E8A504CDBBDBC6CF24C37F29B809A9F334C0C14F3DB774D3D62EF882373" + "84DBC53F8B85BB92DA1CF7C8205B41ECAFC5C89E6AE5E83EBC7CE807785BA13AD23BAE4AF749" + "F9E0D80697D125A42CFFC033B354BE734819B5A786E51B215F8D2ED1A64F37C6F8D30176953B" + "4AF91085A243044D0E68B4BCF5A4A72FC6FD47B990E29A62C79415AB4F36E1A877BE219262AB" + "5B8EE7DB32CC89A89366CADF037E3F634F67AD1632A602980EA1A8A40C9589838EF6A5B3F866" + "8E5F7A4DC3897B764E79037878DFAA6AE6D55543C03447514A8B7B89E0FCD8F138E20BBD4B22" + "73AB43853F4D6FBBCBE1FF3323379312E8C1F80A238A23753D2103D036C9796801D10EAE2DB6" + "813B55C274754903410F46EBA0CD9A158DF0E3AFF3703386AAA68E315FA5B846C08320A01ABA" + "C9BC51DFADAA9357A8BE54418F823B0403FA26162889256A3CCFD6762B5EA0603D594CE51CAB" + "3D98AFE31819A97585CF40C5B1D72CCDCAB9C75DC3F84FE310C1361779592B2FD8BACDF8C755" + "5C63F66BA37E9A9353DD0D906118FE43F8775C73AA76669D71B4605E7435D2B30318FEA3379A" + "A714E6535780C0AF5A8DCD7E678AD492228D0C8BF8041B883E30454FA2BD592AB6BF7147B26B" + "AB00A098206C43B4BF518E2CAAAC3981D9FEB8E1F6350B3660BAEC5E10581255C5C8755B902D" + "B68EAE117002D3D26D8178109795D88A388A03F062E9193D98999FF0FA7BBED65F94385AB9C8" + "9A57BA08E391E367E0F23BDA2A515C45807855556CEACABF63C3D813CE4DDBD238764BDF4E2C" + "C3F9B4ADEE3832352604A2B0AE03280CA98D16BCDE58DF8FD81F6A6CD922B226699B7CEE3B5A" + "A8C9308FBDC2B0ED9E5AB5053C68CB28E133BC57EC7E9CA4B5E7A5A2CE16441848B42113EA5B" + "952DD01963EC7D9E4CB16E963F509B14EC3CB5B30259CFA559B9807FE684B4917D2C0360F3F2" + "5DEA4EBB896B90BB43DC02E7C7AF82F4EACF22747EA6F05B40827DE70B693BB43A3F947B6439" + "D8823EE8D7965DDB79E50606599F2B203B29FD8649E6C7B7B8", + "DA92D72E2936AD0BD6B5BDEA6EBF688583C7075B8B129F38B507C16C9EEDD395E4360CFE68DC" + "CAC0C3C93F5482940B5C82FC94945FD219C80C3AB85A4FE04FD6BFAA99A5658CDB3A5116EC41" + "0F98E07D823737E604A22E1681C054EDB359543D973B148525CFB4E8088C29F027EC1072EF1E" + "2FB33AFC556E034BCD65B747963B22A87A165B1243D3A63F2F5E38E7CB3634EAA68DB89E196C" + "E149A079BD728694BF24BD9F993527242A0824D5EA4E88A8E873F79D0C7912E43DD7C77C0E4A" + "F6177D91348DE529FFC0B104ACC475CC21E3045E1CC25784E35E36083D8BDB0B57532645A9B5" + "DA5796EBF160F77A0E11B81EC141B454A2C51DEF54C5BF1F1F8FF599028A260BB1404051BA0C" + "8A281335FE3F1F1FB4655EF71468A545B0506F03B10E0BDDE0D1FAED3D4B75B2B44C995D5A1B" + "7A37820D8F58E43D48670F4418F08675C466A411A07FF294F6259137DD0DEA4E07DC7D7784E9" + "13C6173DF9C2E2A22E4AF564820A849C95933F37A49FA52C29D7B3C0B250E6D30F23B62CAAE5" + "8D9A7CE38F5E9F8CB978491B4D0BC2A89B8D3C5DB4D67A580ED547EB99BE8F1EE9C106FC81F2" + "862202E5BE7494251B9D37855359B6E540702D0E88A40CFD9D8837C0E33E1046ED114B9B6634" + "D4B32ABFAD7E40FE4B43AB860273097F452527E8275A0528255F9278606A6762CFE60D84F539" + "76EF26D07C15A39F291A3B5C1C783422DFAECAF7B5AD7A16AD928E9D692B7B9276B6F2369014" + "3EE96884479E0F6363775BA8A2267BBF5E74F9463E62864D8FD88C909E8B619CB2425410011D" + "961DD730D89C6FA88C3A8FBF30B36514887C00F09AEBE2B5D30A6A235A78D14850CFBD397D53" + "49AF98537E8E0761E03E73B213D6DFC7A373D00E26179E8E4616FFA64942896108B7D1BC265A" + "26FBD74AFCFA5F38B995D4F5D119B25005DA6FC0C25594C5329650661CC76BA8E883DA4EE4D5" + "96FBDB49A2E83710AF47955283F5C140B70AE6C7762C21605762CB3DBBE568978641562ACDB9" + "05BD183E0CB7C6CA3F84594B25C14A38AB02D9A88DCDEE243F75776B8D83E8252A6F01B4CF58" + "6DCB04999C026684FEFD5713EC90A727729D3270950E86A71A6200DD50136F265471792989C7" + "8158F55CF1EFB1D7E87DB9671F4224A7CA9FE794F66EB6AD9823B8691D5BFAFD31EEF0E79DF1" + "7331803879DB08FE2F319BD4F140BC244E185E56D8578B0564D99E00A407653A7E92A19FE833" + "AFF2C8A9C22154F099C5FFEA9B926EC0AE079FF03B0128322E9B0AFB7B7D4365D1305203703F" + "E781D40DD927655FFE8E643CAA110E544D3FD7305FE61525F9729B809401E66C9A8347A86DA9" + "E861C890F40A3CAF6633D1FC436E787006333A3EE79C3DDE32FD7F6AE258771066D5B5D9BCA7" + "9FE54F94910BE39A76F85FAE37DE3CEABC6A078E46527A38A993DB202AEC0119639585C2A439" + "32E53B939424DF23AAFDFC859900E664834ED82BCCB603D952905F06C75BBABBF091DECEC456" + "6D0354714A0E934A6887F14D8FB4C1F062F68276CD51AA0987A45A9F76F34D1BA81A10D1BB8D" + "9D43B40A0EBF052AA78BD423B05D164B6F7DA6AC9DC96F045C575B8CE19829A5328CA6A90C0F" + "D96E802936622EBCAEA67473E97CFD4BAF7D916990F62FB4421A450A4997FDA189C5E7A191C0" + "2F3B178FEDAF213739F01E1B81C5FB2867D64B2AFA72F7CC284A2C796B1159432EB51F5D643C" + "00F844A29B3433F7C570C457D8E46C33AEE1A6E20020A90934E61B45E424C46FC6C98519F18A" + "7CB9EBF7799114576BBB1B1BC1E788845A5DF0A025B13DB5B8", + "19A735157AE06BF717A3984C0CA5AC04B39995EE6BE409E598B891CC878B60BDF45F8312671E" + "9584A3A5BF4526F31CFDBC047BD4C1951BA0905A7E86AD3D679D796CC74D499C227097F05596" + "A94545B7D57422D7753A9003E3AD123BCC5A4A77216CB1EE4649018753331B60AD67C36D3B04" + "F3E1729A39CE40456FDAF194542A865AE5A68947D83EFCDD1998BDCF557EF26B3B7F893F3F41" + "DE14B1B48B2EBBEF04812904B3D8D347BA5103E1BC1D14BC7D54728C7606BA5F9B38573AB48E" + "014CCD23F7CB07A4D89D5C6EDCE4795BF3A6E325BA682B19853E07433A47B20D4CF580DFE86F" + "BF37851451160C302F5531248B85E3AD8C90686D2C0B25F6012F5E5A47BC8C5D7F7A16C2BB9A" + "725F5CDEBB093EE505947BFB5322F444C1C7F5C60DD2672D04E53B564C938FE27EF714870AB4" + "EE2B33A5BC14952F2A3CA866881F83D1645C9FF052B5DDDEB2653BC4F065092A7C56BE80958F" + "076D6C60D54F624BEDDCE5C877B06CB12CFE19C0233FE5BF53F33F2BF69FF3100E61FCD234D8" + "37B84E9CEEDF491BCAAC18DADB83C6A405F5A8F95242983C8F729935EEEEB5283FE4E89A2F07" + "E0459854F153D2A4A0F6973351DCB54384A3BDF91FC724C9AB729C82D3992EC18EBF8E0C88BD" + "132B7F78A6829DF24375ECEBE93967750DA17BFAE8C4F78969EBD201BE9340D2D85824C6D71E" + "87449232ABD030C1A228A287B3F7D85FEC06BCCAC13789730B81F28663505976931D973F6A78" + "9CEDD8EAE46C97834FBF12CCCA01C4B573A87367E97581B8C538AAF8F4A2E0F61F0229778B2C" + "6F3482520483DF75D244B634A1EE0BF3F247FB73593DFAABCEF46662ECFDF06F8A45969D6985" + "50A8A63D6FDA8809CE71653A1F3C8372DB0F9AD41B63332B86024989DE34DA13B94968CF7122" + "D71F002572BBAD10BAAFB68A8A55A6A83FA43910E64ACB8CDA7AE79AF2D585F968241762A60C" + "AF7880F6FCE33D928BF6971486A5E3992307E8BEF41B4784CE2474669E409F59DEA6673480D6" + "94C0C86717A3BF581D7AA2B3966293C2A499EA91E39A74CFD2FB91BA7513F99591B316170CA0" + "E0DBAEA59C97B451825D6269B564FA5E17F350F3A2ECB83B1F007F0AD50E9F4B59E14AB22619" + "B706809D2B1256E115833699E1B4A70DFB4CF63ED59665211966053748C0974E1D56141D12D2" + "F21A91A5938A5838E9C0A9F1536D2EFEEA8E454355FF51447FAF7CCBACBC5532C4E1E11DD688" + "19A260944F40C85817BBC89D2FA5F5EC618146251CB52B2D9882A4070F7FCE4B6A6858420095" + "B31908E15AE820289F584FF8BEA6BB861BD7841390461ED86CED0D330263DD1DE36626057D45" + "037FA5DAFA4AA5B3970139FF52F00515326FE22422D0C273E3F9A142B86C76BA121B4FEDC3B1" + "56E257D37EBA4295A89F36532BBE43288BE4899BECC893E88A613EEA65367C8AD4A12EBF65F5" + "23B546E1DBF96C242EB71B0EA142CFE3E72185A21223FB26545007A57FCE4074E6D2A92FADD2" + "FF60515F50323363DC5DE32066585B9B0DBC3104E410F5EC30EEB2BE8FF90D7C8A020BAD4388" + "4C66D480210D0B2B6939FF787012A08CDA6A569C523140C31BD7D2FA5C89EEF40D0981791483" + "22CC08B5DC43C391A6551E9AE99F7AFF11457FD5615138ABBFBA5B6547CA81CB8E0D28E4D2C4" + "AC27A5A45C14355C397481897650334C425334D5BE37996FD87296C3CCB660D443B5246A5C80" + "B076CC3226A943CD697CB855A87F007C6E0E9BA2E78567F43D2F9356CB235D20C516F49CD2BA" + "ED838298743466C4D4CFE4572EC4EFA5F9972CE3C4ABCC92A0", + "2336E8C22132CA85CF2EBDA7D9792D2D5F5AFB3B03299A8394450D61CF26D79EC40F7BC10F63" + "FAF1D85B111E4D705A817ADB4057C95DD48BDBC5678AEF7A5B74627E4E178D0B3740BC244789" + "3A1C9450FC209B6556CC51F557068123EA8B4C23363F7CDFD107C4F9387C78525064DDDD8DDA" + "2AD1B1B37CBCC7D5A2A46FDB6343E4C8581BD75684283EBD5F9720A53322186FCE111E5555AB" + "041AD939EDC6229F7F8191834CB454C829F4853B42ABF1AE97AF0C9008DF35DE05C579A96A79" + "4684C673115106C07FFA94A3EE6A057ECD066DBC64B7ADDF84EF7E829B04A816C13D0BE3E80F" + "65309F754F1E10D1CF5E6CE822CB126C163E63BDB04D6969A238A674BD0690507357EE1BA40F" + "BEEDAFD471A92F9895DFABC1FC4166E62C77E7525E6B3788B9157652BFA6D7CDC9282A07EC87" + "1D8870C36781D7C38F595A61EFDDE02F4B8711DE0912E47F7DBB2E53B1E14D9FD6DB6BF9B287" + "8DCA74DDBEFE2748907B88E1D2F407BBF7865A9AF1C3EB81E6C30E11B8E137E0541493B3EB65" + "FD4A6EA89D11ECD67A4AE7EE346766823F83D5FBA919F4958E2BF5B77DF025D877EACE0A0960" + "BD2E651C459696B20DBDC67C683648D34417367AF38B0878F2AEF90CA6F017C7D0BC83681520" + "D9417EF721FBB5ED263DB660B37EA05677C5295FFE03608A88CE6321629E56959EA3A07BACFB" + "100930F5E9758FD542DCA12F94132A2D32C18981FEF94463B79C9B5820D5AAAA788873F61844" + "CCA504E9FABD7C14216AEBD81A1327C2C6DBF62545ABE33D3ECD8D8B545BB1BBBB260A4A1E3E" + "1C9F23E08BFB3EFC6CC432D157C48160EAAF8A336AA6D9043F0A29385C91E2243D02ECD0B1E8" + "727E462EDA5EF751E6A3DBD12BBA93EA02DB5E815A0EB27888DA1B8F5FC6F083DEF02379EB64" + "F384B0A229C15994C0DCDF5AFAB4B49E9BE5BD74F3A1534C8443176CC45B49DD02E4FA1FE187" + "6B9387C7A11C86127524B313F80461EA183019DBADE493ED3E3B6E071AC1539195052E3476CE" + "DC0328E7D454877818BE819B1FB7B7FEC25EC711E913A48512DC475BFAA9EFC8635899490A8C" + "E777F8B980760B70973C65D0ED13FA4C423ADAB296D57E150FB14D12151A63F7528538CAD649" + "2F1F11A5A387C827259D484E8C0D54CB560DC25C6EDB2FA9E4C7C00AB9DFDE85195277B5563B" + "A19DB7969120F62596C3CF1DE0FF93F0B67B7271A52E42DE18C97418210BA8696786B6A39875" + "CC2644EA0AF3011E5B6A7EED7BBDE109FA793764EBD342406233658F41DC50AEC801F882D335" + "F828B51B6EE011890D611BAB4D133B24AFCC0717A571E9B07784D1195C2C89A9A086648D1C48" + "20EA089F0893E92590AA513AB447F53866A116634275194C79FB66FFECDBF3C65315C858CD10" + "ACC395FC45AB914AA13492F9221F220AE082471624CC20B2B226875311643DC1B2F1D4BD1C06" + "7EA49B99165ABB10D6123100EEDB15A283F5996823F0026EA147705E34D988C048597AE4DD93" + "CBF210F7BBD6EFCADB4F1019EA0AE44C8675C338ADAC3CD2C2BA108305D2630F684E94B1C9DB" + "CDA1F93FE0F71E786D348DE0912D3DB730BB8D55BDC953142F7F73AA007C64F2BE9B6EC74876" + "0D5A6556062E4257349C827C38B4B11F1E924D6A6394295DF8CB15091651BE150FD56D29AB6B" + "88464BF916E174C79D21DA0DC033A3FDDCE62A12532358C27EF2ABFB5C47691424B912F11C6F" + "486FFDBDBF1B302FA303DC25457CE298076E6DC58E94153139506B1C0EDB8F96F924F6BB7301" + "830AF0C403F919A495C90C2710BC7C393ADC30FF0BE4E81770", + "22C886537DD8187239134A96359C035AC758E9229BB018FB1E0C0482E967055F1BE522E4C781" + "4E4C84F3A92243FC5BB671A8B63919C1A14DA31F206FCB5F67A95C0A7A5BE7AC579965B32001" + "086BD3295A7C9A55E2BF4D9C796037636AAF8729A4DBF766732CA961BEEE6EAC45BF50CD98AD" + "E78E21CFA3D7AACFB0114E1522CADFFE803E0E53EE700B0BEA157A829B2B4CC842B8E817D767" + "FCF8D833B3E1C56CC6B1DFE87C2B0C3D67D94F66AEF2563E5F4550C31B90775C60960D382D60" + "BA942E1ED52C57D504FADC524A40A262D327213B48655A67B337D9C1CD4247EA23888D28CFE3" + "789EC4D487D4E287AB5188FA8C4C2C4E4BE8DC6931C7C3D38C5B1654BC89390B9800BF414F5A" + "6581825E7CC6EF0DFF61EEC67CF483034CB5E505FA0033A139227A54D1B4639787C7192C762F" + "A4E4686462BE2315ABC28E57C25646F23D8FE629622388AFC485670737D99BCCB54C25B909C9" + "968C8A04A49476BE4157D46956F0E852BA0D683960D20C75DC13B1861545F4F8D49EEACDE537" + "CD7861A87C2FF71AC66D470F9B98363E7FCDD7D02E3A842665A9B282BD50AFA1A01CEF94E0F8" + "02FFF6A68950E5101BE6ABD78BE708E3CF6A336615FB446AECEEFB0D2A699CCDDFB64B29C3EA" + "AD8DD80D3C7365FA8F54B27CB52997AC2100099B4D33D46BCFB4BCA0752BCDF5A7EC09F18B65" + "0B073138DA2B1CDBB47F84892B9E4264E503C64E894FB1F541CD2E824060F1BE301BB2892E35" + "C6B5807358D2A591389C30377D94C2268996C370C8DC39872E6C737416A53B05C04BC58EECAB" + "3BD2BF360FAF57403EC1BF152DBCDBF141337167FBAFCE31AA3B3A742161F8F0890A211FA8B7" + "632A52B4088155E542D152D45E4D9E712DB75061F59C2CE2BE1F8FD639558D04F4E3FF624F8F" + "48063066E9F026C61ACA585B287138934274A62D987A679DFC86A3EEF972910E2F98D082F928" + "01032AF4B73019B2E20D22BECA8962AEB79346A6CA3DDE925078F959246E09C7CFC653C94BD6" + "09A443704BA45E5601C1269D28241B20F49BECEEB9A34B73D6CFF292C38B91376C43956B0D1F" + "0AE701F974AA1CAAEF5158A1398EAA33373DB2CFB517CE5D9D62380665F00CF40E3360B5CECB" + "8A3BC4EDC3EFAB1FEFEFFEFA0A4ED9C40B3C1CB5E4F41438EA7E5E7BB84EC4F9BA6A2DFB3509" + "A5743698C14A4E655F6590868B4ACD0ABFCD1139EB481918E2743CE5B9CB527BE8B756127F97" + "015E992BCE9D50DC6E6CA55E1A39818135EE1E14A5229763EAE9875056539836D60DBCBD203B" + "3392D2D27337012F4F6C1ADB06729A82B865D5F1BA51294A1E1DEB206067161EA94D9D8EC2AE" + "5CF5265EA03A7F921ABB45F792B4E769CF0B91C62604B5E7222CFF542CD4B4584269BEA99C94" + "A0C65B0BA9642B37ED159767C8DC87779E9F95C70A0BC9EB4E0F3408E6DC9417DFFDFDFE357D" + "F0EDC8F71474DCEB41B31C0BCC03E9980711AE6E9CFA2B7CD36F3B33155C672146A2BDD54E15" + "4BA7E039D43E2C35AA708DBB227470D253FCDAF3B4B1675DCDF64BC13609052E5920E01A9E89" + "7483B089641AF4A4F298FCF8E41D8926A7C782925EEF14D958B27B5D51A454DF512C11D36603" + "3B4BD530200527D042C67F1C2253A7DDF1584FEE7997866D194B90B2472385368694D618D903" + "E5D9831804BC7C91BFF1CBC82C6AA71AFC7E1F51CD0E6BE182BB6D239E6C9E8AD2A2D0A9EAA0" + "440B529531BB457E21142443C7E1A10B973715631CFD77F9A3B320A3F6CF6D2A3F60DF00BABD" + "7C1B3F52F7354DDC68F480E837295A0BB38D9D38670EC4C3B0", + "8F984D0F178BDB8DAB56DCB46DE001FB911C1F6D29BDD4C45F6922B9C1011C5B3A1945D3E0DD" + "5F3BB8C118BD6D75E6111E4D90F3A9DE366DAE2C5CC7F2E717FB5D141CD44FBA34F576D454D9" + "2D679946CB9803428CB53AC42A0934D600D1F4A854F416879D2532A8393EF81488258D6E4E3A" + "8A45541686C8B98AA3746C19363E592907A2F3CD3BF9D3320C5778BB259C87D68CAA4C7D7D9D" + "B5FA7D628CEF0A7B14418F94E06AACBEA809A96FE9993B2EFE63379D3BD422C567329305533D" + "BD19508B3E6772953801F11C14C2F2ECA7986CE15F9CB21B89AE03E1468C396A5B41B920ABF9" + "52C9320D4E9791E1810C472188B8DEA332A7FAD547ED7A4F8027A07F2B94A79D0C1570606470" + "8840057E490A6B09E595239A7DFE3F38838780350F2BC628FD5A95894E2E7E437F14B043E75F" + "A91FFBF6836E0AFABDBC6997BB36EA8235FA582BAE956C6B65742F77F0105C66133588D27286" + "9CC621DF0A2A82AEE377B7C199D697F5CC3CC990E8EBE2223EB8B84C99E19D7F4B5CCC1F6F76" + "3BAA0AA287DC2319CB0A72588D664331D0407F77A17536B1B54BAEA0D2FD620ABB66EF4CB1ED" + "EAFA83B60B7EFFC4AFD73E106947F613F3A3948D4AD5F8A31EA785600F0E08E7E3FDF2CE254D" + "3C86B28493F5001088713030754185CF294EA7F02F200F92F5BF155AFF2A662BD8E88C271184" + "0C3C4F4B9582649A54FEA824EC16D2B4E18B143E03AC8EC269CFD439B0CF29BA7A1941C47C00" + "E54A7733E68854C5EDE655064A67351A215EE5CF6633FBA6E4CCBFB4AC80ABE9AAB0394F8C11" + "46F287B98A35F2FD6DCDF5F192A98B5F09CD26E8F75182665CFEE59E7A2F04A4D3E364C1B176" + "2A8CE89B0B4155128AE393B58D208940FBE4E0AA6525CF0B417950A97C5803596482A11AE569" + "8A1600CE9B14CF35A4D9515B757962EF9159C145D6FF473A7F19D1A3ADB363DCAE784D93C443" + "3D75B5E8C418EEE7D5D83E5D14C2E6D1C4041CEA24B7D1195DECA5B7C1C44EFC003DB169DB76" + "AD8EDE8F478590CF8877725DCF9B9383DE2AEDCA9BCDFF17ED241D34EE4196B368EB1E058040" + "F19754C3C0946DAFD72E7C6F967C04B9C5B0B81167D72F2D36514433C19F727387258B3F3E89" + "64ACE29A1EF0B7B4B270631EDA73F87301C341DB4EE365E25A52408845F666FDE5DD83A31722" + "50B6D494A7ACD1941D1097D7723E0CB0206ACF7522DAE6162358528076BDA1F5EF36D0810775" + "A2DE165A06FE65ADAC78008FCF2CEC838D69053FF96904A466209FBE7472838FD81F01D4AF4D" + "9AA5CCC2E7B4A5CB390903B4F62688138E3519DCF3ECF666B0A648D9E824227AB3E380E33B41" + "74C9569237EEFB69CD3EBA8F1AEF20508BB17872F49A89609D686A210D5280058D8C929EDA9D" + "B99A1D4FF826B64A538AFD0D975C3AED1581A8B75C3AE9B0BF51CA526D641FF2B8599DB95B79" + "4931B1A0014AB0845616B90691592F4E1E8DD10A04F758F15D7CB396DF77EC496A932E82DCC7" + "01C7CD5E4424179B12650D666F37CF3B98AC71C811646F2DC0909CD3A52DE74333A559B2F52B" + "80F81BF1C14E2E7DF904662520969FFCA096B1C13734F3F1001E35B5A67F605A687B45AEE081" + "0B6CF7AF85BD6E014A1AC468675B44AEF356040D307C4EEBE908B8298B35E5292B6D0A44E8C5" + "C1BBA7BF666FA211024A5A47A6C772DB82C380CE1FCE5B78C60E4D2DED0F7859473526917CFC" + "D1A4E1CE4EF983CC228A6CB4F4EBE6881D0DA39D203E69F63E74EBF5B62903C32AE98F0201A0" + "78D716CD6982772CB824B7E8FFB3D953B7547BC1C9D9F3BA4C", + "B7422E3412039FFC28FCA29C67F68AF776BB0C8581FE0DBAD0262E541AAB725BD01A2B32403B" + "A124E0D9DE30D8168EFF788CCD7121FAA42D0F712C680AB8F811019C8541F0B5DCAF3BD2ED76" + "2B8BA74E1658AE88A5D1AAD718EA4FA11D8CF92DF840B187D6A159C42EA73C342C75CD33B6FD" + "182480B74A47BE6F82641B5817A3614F15D7C2F9F530E8424C9BF69BF2B434A2F91D9A329684" + "10C7F7D5C9636343185ACF17ED88260CB6CDB549CE77787BB8F7ED3384FA0869605A5745BDBB" + "56E345EAEACADC48645D5F97527965655AD56D2C673AB59E5F43F8DABE8C0EBDFA2CF8380035" + "369B46E84D94B7CD473A5BF62FA0A2245B8D020A6452581DCB6DD9C31430E43E262C6D047F4D" + "AC6C97C5F4A45DF9571CDB2ECE9E7E13146654C046F1650AB0E479AA3C08C5353A5FF83215F6" + "5AC9DA95E6B653840149B2F50D992B61DF8965EC538BAEAD985C45FC75EC4A96ED4A73C39D4C" + "59E8ED5D5D7010A2DA0004D1453BD62E029A9F1FA782A47A89F22BC4A83CBF1F2B280E8D7B94" + "5164000B68A101D75756E2F346573879CA56ED2A46F5C7F4474336AEBA3946F4D23F70DA9336" + "15E9B25004394DACF52B726B4DF50983FF4B959462078AB3C4E1AA14D1EC40654CC5190FCF2E" + "6E9B671D53F744A5F47D26C6B65F4416C68C8F84E185187376DA77034944CA08163B4488A0BE" + "8DFB4B9C567DA53642EC5B2D95800383E68BF7AE062FAB63F85F4F35AB9CC696D56B54D4D3C9" + "5D3F5744C2476A6AEAF458ED5BB7B45D4B40D2C20BE43996FDE3BBC3DDCE7255B66DA60C8236" + "FD1E6B431858D8D2757DFC61042D298B3713E8A585A9FB2DFB264842E195F3E87D751E50D8BD" + "035B04C83ECFBC4A5DA0248317EDB99675C685879CAE847350AD7C31A043F693E63710BE4AE3" + "1D6AB174A22EA34D0E5CBA3A8DD6E97B9EA775A1F05427301103E3AA02C691DE1684ABF091D6" + "6623DFEE2D03618F7360E490BB80499A8B017B49DAAB054E8C816BB60FF034261BADDDEA2DFC" + "C728A7E287FF3809058E885DB8D93BBD1D5CC831BB8D2696D81F6B2F3E9EC11A796CFBBB7DAB" + "0EA1D43EEBBF50D6EB7F38CD2227C66366C091C242182C8E5114B822CC69441541CC2A14DBC8" + "7ABE36154FF35BEE4A6361B1ACEEC4C1EB0FF45302AE6F6AC11C08336259DBDC4DD2C577B2BC" + "99FAC395E6A870DBA011D43EE9329BB70AD444BC57301B84850634745AFA42640B7D8441D124" + "E127FFC6D15CB823C701104761859D5F05EAC3211EC36CA9788B83D3CC9915647E39D1CF2283" + "F329138EBE0619DE3AB54C7DCDC082529AA20BF8EEB6B8FEAB40C33608F852793E86F9803067" + "A4D2710063D0AEACC678DA112813DD68FDB28B34CBB837CDFCD1BBDB2B1527D297F7AED7C986" + "E3E644FDFE58175751C1AA5D65500DAD546DE14A1ED8AAD6C02A9AE9560E2BABA069FEFC899F" + "1D864FADD7BFA52F92A3536F762CFECFB0774CB34536FC5AEF2052216C798CD5D42F1802392C" + "979830067D85F279287C41B30C0B55FC75B5DC7F41156529040ECEF8CAB571EE6181F5C72253" + "3F0513CE2E71F89AA264CF2F07447A54DB0DE2130D5E83EAE6861B8822038F1074EA2D8FFF92" + "1C922E0886FB4099097D68B8B18284876033A8F488AD43B765325DF0AE20176C38559EA70D7E" + "64F537BA8D2EC8EF6E691B3040E20D5BD9D50328BFC35E0C8DDCD6361B1949DF6B3FCAA1B1F5" + "784F6CA150CE0AA08A58CD1074A229C4D061090E240D9B198F9112CC73FB5DAC2BF75DF0AE15" + "C356FB777CDA79620DE5F3D35BE06DA592C776304CEAE2F770", + "5AF52EAE1A4B6C865C493957CC9E185BD1C359D2D6C25D13C37E1ABFEF62A847578FA6C0B063" + "4711305DD059DA1BC523076799FA17A65D592D5FD34E0F0E54B5A16BB59B72937636B02EF8F0" + "54D37B2C9B8D3902210179A9373038D3AF5CD52E9A2AD6737225E505368E8C0586651F062578" + "C3D3815A0024E7B7BF728D5C8E9F37625EF132E8DCF1373811FC88C072827CCDCD9B93294F3E" + "0BE7161E7C80311995E90CCEEC84C980E824041DFB4CB18735F8DBC1416BAADDD4438D9B6A7B" + "58095D84EBAC76EA3B36A0C1E18EC37CF16405E269F2C528FB7231260DA4760150B4BB462C83" + "3F39FEE651451DF491C8E54541054F94F1841298313C56D437984D27290457D7183B6AF42224" + "CEED4D294165D8725AA7B9B8C86D2E20C2B8F988964C504D3D9574AF8103DE87C8EE2D547FFF" + "3BE739669AC4BFFEA3C1F978C9EF46A53537AB35ABC09C21354A31D8858102B7FED4081A11B8" + "C52AC843903D5ACD5ECACA562F7931E9F83C57FFD2359669CE7DCFFFE2AB47713E17BC081F52" + "EA9BCB20A3269119F1D430474B6131D9DE55A4E1BA68294B2B77324442F56DC18EBEA2094E4B" + "219EC2B6A3C8C1948218F29F2A082A2A713892FB8A28A677F9CFCC13462DD2D0A806E25B0648" + "C4EDF14A34F9647A0268F3EC3718783056CDC576E35D721BA901ADE56D9B1C22BBB55D68283D" + "B1FACE18D32DFB820241701932137733097A9988C013E7868E7D07CF294C9D9B3B33E414E031" + "13F881CEC8F3B174C8F7A46ECF9713AB14EFDEDE724005A81CBC31EA460F8A661A031716CA0A" + "7A44ECE6B545974AB3AF5CB1C0CEC959E8084409CB1D934DECB2A0F1F740D6C6EC94ED9ADD68" + "5AD2A70F072CBFAB49ABA65E85F99E6E0C4A3D85B9A0BBA0C88E2C60D0365F1EAE21546F7FD5" + "87EC3C8BA436B4B9AC38BDA187933EA9C923A6136D2587574AF5A0DDD9A449E1F6DEAB2E7BFE" + "F03C792E3DD7A1A511E478F56D93C76A93EDDD7CB969BB287B2304271075F556FC8F459DE326" + "870652F8148BB5664968A41E0E508E18FA568ABA5A322B9F9FD579DFE2CD90933C301BBF0C6C" + "9355D5A3CE5A35427469E5CA6E56328B5DB15F0135A7E04D5778C4DCD395C575F54F2F3884E6" + "D86D5B4539F6D663DEA324CC2F57B13C993598E05C7317644C301F9EF0110992CE2B62370DF6" + "24DA2E61C9377D7E689F8A0D5E4AA340A5B94CB280D510E89F0D85B71DD472014499BA813705" + "D75E4BD3379DD1E0BA958244E05E743BFC0A097BBEE6F117B0F64092A5A2CDB93C97B7ABE76E" + "155912BB3A2469B7A5C96B25F861E0704145088BD61CEA035067C06A9450D6A2E78ED188D7AB" + "BB3666031AD747408FCFED3EE525F1AB3660433195F10AFD36C35586D97EA11F5319840CD9AB" + "1F494EF96FE7E205C5D6B180CCD9BBABD62316E3CE8AD61452AC07CC1580AE70D7A22145041C" + "0F0C3F49AD274BDB2C48B9BA913550EDCFABDBD2793B668B4A9204DE1BD11ECEFBBD20A07FB8" + "5CF60E448352BA0F1773D997A4F5D741D902BB3245009C5771DB4361F22E1156029A653B4A05" + "8AA4F560A3F22CFD7DD9270CE8B648DF61D88DA8E69321101EF3F018644DD19C740E33593279" + "1BD5E866498AF78CD6DF3945B56C36CE4239E9E55F5D47539676463DD5640FCB5901F51B75A2" + "98D4ECA74F2C5C8558B4E78B5755926C61FBB018799213668FF73D57F3F3A898B4BAA2D4BE30" + "E214E0F04A2D24CD5BA2503E94C1C2C98F7345E27ED55F5C11C84189BC29BB2D3A7D776F92AD" + "C7936D5E3C4F114B0BD778E93C781EFFBCE9AAF6DF0F244B34", + "F4A701B8832C81591489B15B4C6630BFF039FA9F01CC0248BB2F1CCAD3C2C1F92D8D48415DEC" + "F961FCEDB9BDB386E86D8499E747FF5DF8E81876A04487DF4607421AE135A341E6A538563912" + "3B597EB8F1FE87A928306ED5A24D47C51D3D505565368CFDA9602F99AEAFD06B9E21CD14895A" + "0F9266DD4FB56F0A67B24F26455EB87F7F2CCA693509CFECBED4540CD21DB2E931A7BA47D9A5" + "AD65054DC22C66F5D0523A6A6B94A7641201C94C7AC2A5F88AAFAB95B0B738C7E967429C7A47" + "464F21BE3C6F710C69107EE0C11E7EC5CA7D12872BF6778C66159F671C5134D89DE015D5E4D9" + "9B3EC0B61D42B59EC46979EC1F782E7A3F03E6E7888400363195EF07F355AFCE48DC5567CA60" + "1F72CAC7962C0197CD27F1D31A88421D023B7C889F6E205C2108AC65C7F259F4C01A34F1A9A7" + "7C0329F3551D8939FAD567F07BD4C636001088F3B3E07E2F3A0F7C1BCF4B11BCD6A15C3681BE" + "6CCD93D5D403DC8D96451C737CD43318F737EA70A45F29D1BF3C4183BF044B18477B1E3EC279" + "31712F1CA1734BF18E7686D4EAFAA88FD2A1AF1949C024137294EB2B2E2505D7B31A21D95053" + "5AD2CDF12EF2C64BA6DC25981515BE9BF9C8564B299A7F7F0EBD51327926F3287B56F95DB324" + "F82D489459C23CEB05FABACCFA034ADF98B65355055E5C51F15922D5BB060A4AF0BFC78EBF4D" + "6E244E350E52B3C162D643AC2170317DF09102B70C0B8FDD7FF173CC90DB0BB0E6DECEDB9FC3" + "4F9BDD410958DA4FC1A1E5A99C7A6E892019C07CAFCE07FE8633196D46C8944D409A608EC072" + "97CD2F616306FF3D5FFBB6624359F330535361CB3FE081F666806FD6F5A0A30C0972E20DBCE2" + "49A0D86825BC0E2C27C77A47F051ABA02972CDCC4499D926B50B4ADE6452F448429B31FEE144" + "36259ABE65582F25E738E1624FDD5E3B3E88D491282E859908B3763C69E443A8FA70D84B360A" + "0993A419370C7F71123AE2EE54664621E86E8AB71CB3D80AC9D7F04DF5B56108CDEA08B38BE4" + "9052911599F3FC71A6FB5F628E1D17A898BB654B47038D16FF2932BEA5FB918158BAC0486137" + "CCC1D3533F9A985F0DA106575B4FC74E223F291BD13819D040777214C8AC58299009F60F10E3" + "B098C15454E64DC58C23AED75A1BF79F4C2729E772AA31C6964B7B6812BCD137B265BAC9C7D1" + "3536B36C75AC2F0DAEA18B10022956C1A9DCFEC46047A820E41FD816747B9B3F9B45DBDB2B70" + "98CF8AEDE2B07BDE406D804F59DC9B983CEF5166CF2FAB5DB28DCBBFF752551DBD72C354FA8F" + "834BC16740C3C7D800CFD7C8A6EF76513EBF3001BE3C302E683D2C1F15F2AC34EBDB8AA4AEFF" + "DD3B14DBAD5F4F3668AF73C19D97B9AF201B6027BDE0D47B751F3190ED4DBDBA2D9FCD9DE2E6" + "81BF8270415E206237F3B95836A944008D18575B0F435AE36CD6CAC8BE3935DA64DEC8B3D481" + "6DED269638C554EE794E432F9EFD85AEB75C431A3B2672A2A83190DC708F06F9009941A35132" + "84EEE020B981C8BD894FC4472E3F2DAEA6085B0FA1959FCCACB8333EC8612035D1A8189DFA57" + "D4C94FF68B1C0E2D2A6DD1915E8B87146FADF658E3FCF99A8894A0927D1CD1057B31086ADAFB" + "20FEB93501BCD38ED5176178462662A77475C488EFE30EC9825C990506CD21B0E5F15C227963" + "C6ECD1099A17414892B117CDC7ABBF246871CE7A4F41AA67D59A46C22877F8CD942122F4A267" + "B52D0AD649B992233B34E9405D58A0FE25EE3E434703DA4161B0592473DB0474E9030C505AF6" + "BF601666F8107FCD386CACA0CCF9AC2466DDFFABCFF60C686C", + "E042AC595B951B4B4BD3CF10A2AFF252B0211AFF524C221D79B845721FC83A0A595FDF679772" + "6DE883379372438FBF2A61F0EC3F9717E99AD9D26C053E3E79045B8BAB3A73C693D1A9691B3A" + "FEB81E857603FDA0F70F05255C6CE1A524E53479F6884845CC08BE37BE5F4F5E7CDB20C93CDD" + "8C9534996F554D03DE7A637B7B54EB7BCC9730B679491354ACFF13840A13381D8A5F3FB73FCB" + "7746FB9CE2C0B83EBCD7ACA8E6C588BD4324633F4AD040FC31F2C6BA2801C99EE8EE50BF8505" + "1777115F693593DB3E62304010FED8CE332019970DD777C157DE3FBD1115BDD094B91252219A" + "D01D8DBE81871A3C7DF7AE42E5BE9D58D21EE5D5F9005CF2512C872D21796B9AE97C33D07D73" + "5AAE01550BAB8B912225AA331C92E121288C52A88B1013A56AD48B9E84384A61322B2EC8365D" + "BC6F87D57CCEF9B13A2ABB43BAF8B321343CFF19A6C2F438A6D2890449A728A76C6A156921E6" + "28F3FBB58C60CA2DA4C29A26285C9A7242CBA3BB87FE1DDC5D3424E593A1464594325B453063" + "1ADDFCF14678496A85636E514E59220914B651C2F436598FF3C2C84CD1F5DC2DD545C8D9F733" + "EABE1F63DBA6C1374D44C86521C2179D12B56A5C808D1154A311484874938CC55A44489D1D5D" + "0AA80755ACEBE0BCC3E9759D69E84B4E1348A4F3A009FABA7784B1AB97DA74275EFBE3C58E18" + "17DB1B80B59844A489D290BBDA888BDFC7BEA83EEEBB0E99804CC731B7F08020C467CDBC9AC9" + "6FA88EEE8A0A1FD0A7717799380145D634F8C3F020B52FCC624C2BD11A3671535EB3D7C1D034" + "739DF62EED3FCEDFCFA51B81CC85021C8FF352AC8929E6D0CE933DED72ADEDEC65E7BC0B2AAF" + "6992CA931BB3C9304DB3E7AF2FA7DEC7D1033A212116F9E2CA724A587363AA4A0F0EF05BFC06" + "EA1781D7F5CD896958BC963CE5CD5D1DA209E7C7CA0364B9B5997E8E9FC370F8654FDF1C24EC" + "9ECC117B64EE9E6FBFA9A505C13F84EA21D9EB844324AFF58840D4A4FF54508F3CBD2D2D8A9D" + "A9A354207729A63459E038D6BF342AD2AD2D62DAB7D1B732B1AFA87A4A93CA1D7E395CB46AC0" + "B0E568090806373E11435FE2A2D9E56E8F15CB0FF13EA49A4CCC4A954E6A4C5C50D6B22FD2F1" + "9AF07E524321BBFE3873ED61451158D3A3BAB7B60C230CA8DB44C4C209B78A3A7B2BC00D36B8" + "773E5EEA801000C54AA64FF8F8590C492D50DC3777FBA2BE075C37184C83F99F422AB8D96A9E" + "C3F8E18E948F159B994B516DAAFFB4532A3B5B168D83511F8A0196500257C6E34BA365FCC7B7" + "952195940AB502A3EC3BF1D0CFB1EFD87408274F5993AFA00F5F469246A73A0C2054527D569B" + "0B9ED6418921FC3D851733556798CBC73B365AB132F45CCA11E08759BAD92E4A4F56760017F7" + "091DBAE848AA42B5DF7BF47580AFF1931FEA035C5FBDF75A84AA242EBB7121DFD000DCD5E4A4" + "E936BB35C20F10A6745E991AB4D9B9C7A633CD5599D143787F092304D6F3A1B2D57C94540860" + "B9CAC492C5F5E00BEB9335E5C8205C37EF1BE6171FB86F8A815AA053530953DBC67F4D8BA58E" + "C7D48014D300A3F1158362D1B5B8A9945BFEAB6D15A533B351E252E30E3F86F2AD343AA885F3" + "3F826431D875C0FA8BBFDDD87615692461343E3FE4CAA546001002AEF4F9DC3AD96007A9BCB8" + "A3DB20864645B62A618860DBDABB8B963511450D6F9C38FFBB098494FC1EB31E97E89AD61474" + "64ACE552A46664B24AF91FE1A751E2ED4F368A8FF58510F9D8C021202D4E1A06AC5A7538FD70" + "A792A4BC2BEB1A99DB17DAB68D696A96A859FAD6380F3458C8", + "AC3937843A510E9D187B7F65CB837A68361BB5C1C2A522177591DD0976593435B96784107E9A" + "C8E9FB7642115994A64404449AFFBA523DFC606DA976FC1B42D6B426DAFA5B06290E7200D6DD" + "C2329598CAF1DD59F68169775074B546D274DE758EED35E61C2C271F13512A561FA6156482DB" + "F7D820E64E46E8E8E1D7989A7101E6A69BAB3934CDDC0C4C5AD665CE752B6BADD80AFA1D11A7" + "7406E14A97EA8D814228D61F774F818C6154ECF4B6A7C401CE83E759ECAC76C926BF2DABFF14" + "989611347520C3C88AA645BCB91F3430EF69034424BC363A3D31691B535279E014BE2B441BD1" + "5C2CAF76C6841A7A4BA6A7BFE186451E94FDD295EDF17A636DC5008E1A07CAFC7A7607888AA4" + "5ABA9D019A6B5B73368D55377B252526F765558B6676D6B2CC05CAEAD12A888F0372F1FA9F02" + "C388051DB632F47DBD4A5DF94BC5130C3FEF2B2E92F2C10B1B77A9A1D45EC116A3E9403CF256" + "56C4B465E2E361E9211604B7B86167C4E9ED132A889E182571644348C947FEADA7EB249B71A9" + "BCD73E0B9C011F2B6979B954318C0F9777C358A2140D8ABF4A943B01772C45C2FA80DDAEB6A5" + "739D335AD19181DD9964E6AECB2B3C0472C8CF5C38B8BB13933820DF7EDA0935432FC352A456" + "47C721A1C33D65BB8D73D9725B1569705774B40B7CD5DC7A98CD4A621DDB58027384A306D2FA" + "DB216B5A16C1FB74ADB031FDE252EFFAC9110113294CD4421376FCB89ACBF0410F34ED6164D3" + "7485DC4D7742252A1C1D6EC360B2F60E9D37F6F0C5CB8452E10F64E1ABCA41AD8C2730342B97" + "7B24EDA8ECADA484E3E473F57682BB385C2FF4AB00685743D82FCBE305158C4DF7177ABFB28C" + "4F72E6887502D529D84DDA516CAFAE4D259464A67DA345F518D2CFFDFC4C03D633C3DAB03446" + "98235488DA81D15B00EA906DF6D3C7981054A6C01186F6EB4A0BC417C4F0308E498CD3852C50" + "F7466F25610697E1148F610597F5B6A960DD456721879EDFB73699D5E57010100CA8D63DD796" + "4627B4E27C7D92DC1A8C703C8077DD1EF1CF7F21EBFEB4672732125D16BCF3E358FB19A40184" + "AC636C8CA499116F9108D5C7D2BB83C41A1E6C82C8579124044169A65DDAF93E6DFA805E8C75" + "7BE3B5B1FD63A7E073D9804C647D44BF4CA9A4318D832EC19E18A24DEA5D20C3BEB9BB6FC90D" + "2625F75104A700AE2E0DDB39CCAA66B1AF0B7729C6C55FCC8F200D76B27D29AF35B33301CDE2" + "5FEA29FCE27756E1B902A9F07F1EADC5DCD71E577B489785ECE24421E20EEFF8261CB0AAD757" + "579CF2EFBAAC7BFC993FDE355DF74F39EAEAEB550D38641FF7704784224737A1E912DEEA78EB" + "3BA3B578FE0F95409D876AEE473F9457FA47B380CCCDACF594BE4D6EB004F133FAA36394EED0" + "F58D6655339CDBB0747500E5208AEFA464B093F6DD9D7DC304BA57B24518798374C1B18C2595" + "32FD22BE2632019BCE07E5C6BF8DADC7DEAE317A015FB67C9F5BBA659682202489EA13413678" + "5823C1DD4BE3AB1089F68899253136C63521802598DF1AC7CF3D68BA484CE4E62D7FD784FEF3" + "8F78BBEE013C0E31583B49BE3E472DE46269EBBC6B153008080EA7AB996CEDFB79E184E6A2BB" + "06956DAFE9A086F12887E96086A4F662EF0A34A1CB3192710C0F23E823D052D76F618803652A" + "0819E3CB6FB6095700DA8B815B112AC419622C0D5BC3CC6BC0323FBFF34B18AFA2C5BE652429" + "A4B275F5368A5BB21B94AB40AE11674EF2314DFD5EE8EFB231A8A0C7D3F41BC2EA1600D52FF4" + "3A1CDD416EAFCE27C72125B53715B724DEE9D42C0CE431B580", + "A3B74FB7EBCB1B1A2BE30641C1D053183648E2191FE74B3D0FDBC368F2F5567C43E5412D2F04" + "FFFC7B0CE78EA02C4E556E1C6CC678AA7C912FDEA508B0990BC7D8C60B74D49EAC6AF93DD0E7" + "5D3B45BD2F1D7B3FF0B412EC6C160671375A2C378D3AC96F66AF5B713014A8C169E317A5FDC7" + "4116BF4B74EACF52AB0EC92F32FFC8F3CB07209452B953C2666E25A56E84165004F3001BB138" + "9AC48E6D68DE30F4531E8F926826A4130827DEFF612FEAA6C6E9E198C3B78FD88C5BA2B954B9" + "30ACE4BBD7A3B6082A7B3E11C1AE82C460B214EF433BC49EA6CA91E2888F2F6CB6F09B252DF2" + "F9144107BE9B921316F153BB7CB348C7CFF6B231B43522BB2997194DDFD3A152544357F0369F" + "1A9C42D66536F25BE855B7A667EB5E8B8F94B05703818AF27DB37B36F93D460703A834A7C745" + "EB5F9997B6A85F693DB299AD08E563E5B03FAB08A92A172FEECA63A6537512B0B63135BFCF8C" + "4B34FB772A3DA3212765F78208A27D3ED293643DB4DB93C4451E254D95E48F730BDCA134188D" + "05D60E21F3795041B717AF749CD43274AA751768C46FC7B70C661E5D8D955FD21BFDEF904320" + "95905927C5E328BC31EC5AD9C48D64723760033C8029A085DA9691D9990F2A7528A413834F3C" + "4FFD33D24DC3552BCD5CBB4BF5A20B8EFE97A31E5A0C54A0323B6BD59BDA4D72C7B0D16BB239" + "81A0D8DD20B43FF37AE3D2F68B72EB9C2EF27D58D5E4ACBB418C6F8F4264344295EFD224F954" + "798CD8E1DAA9C8D015C79CC378FFFC83D2D20A9F08F9AABD3C5B0F6FC2F34B9FE2611C49B063" + "282E0E09831F5163634F5FB7CBB717962254C0DA1BF8686B3A0CD3671B841106EB5647A51234" + "B108BF18B8A4997F93D178E0FD4227AED2A0CA0946CF85D3D9B8404FBC47616891E04AD33C89" + "32CE2003DBC65D14C89FFB976758F1C71A0C00B221F9D33EC247BD42914314E0216F5D43C194" + "CF94E7A9DC0A0A0C8D7FAFD8E727652EA8F62F9964BA81105D7FDC116EBA098EC321C96AC2A6" + "15F457637B01784428742F559480355000373BAC65D3059C3CCE4197AD278267495ED38C6BB7" + "AEF85EBA0E90805ED12FD1404B6604AA18DEA5685990BEB7378DD277C58771E949EC7AAC614B" + "2EAF1635CE00610AE86B76EED8D742FEAA8FEA78D45B28B9518DAE999BE69AE079D7C76FDEDB" + "4E3DAD98D54C5E66AFD836C54DDAC8A992262CF4789B7C237A6559AE3E6EAE11420437B16C29" + "464A4A328591B24C2A08813C87B4A52C1846B7EF14CC1D9CD41C9CE8BD1B2F7FDE2AE146D3C3" + "A669927EAE67F5B00FB4B1D39700FCC5ED9AB91C081C4EACDBD19F8074E5C696F806D7F33ABF" + "24CB32E1E5B143AA3DFF7A6C5E8B9C9C159CDC19947BF6B10C1A5296F09E40882A1926C4D0A6" + "2929314A1B46F61021443ABB3E3ACD532F621F6C8F179A3224CA89ADD951B60DFAB33D19558C" + "DADE396DBDFB71F5CF03ACB3ECCCBAD8C54E8A6D158F2BF8AABFA1758DBBB76B0BA8430039D6" + "347ABA69431AAF1BC94BC770D1F725D8F676BE84CD0B52BD8C2A9033690145FA45BD0084B82E" + "BD0FBAF6EB18E5BD497320F25AF4C1399E1CD065D31AEE760005560094D57A170A110F406F63" + "7517D432A1AB49C261B8C82EBB441DFF5D0440AE934CFA378ABA5372738DFAFF589828281DCA" + "F394F994C1E15D7B4203946144A15EF121BE65CFC22680182C71C78D7374EFFC89945D31EDE0" + "0239A6489E65A903C48B43711EF9010ECDE5D0F9B1482982A5BAF2215F838F45E4FF4C928E8C" + "7E8846962452F1356BB04410EC7365982E6B0B0FEC2D819520", + "EC7E656C153F74885C07A89C770462E7A52933A6A097D85A7AB7882E7FEFA29BE2623C46B6C0" + "E2D125682C9568B24D950CADBAC9AF2E0161B71EE515A9D371A077BA97E4731FFE015AD774FB" + "A65ABBB55EA53EA786206F086DD2AA71A44F56F0E21EB3063B5B22006FC9ECF39A029406BB6B" + "CBD9CEEE515EB5CA3AECC0808572E534F9234B36ACDDC7ED11AE4F512A400C470C9C618730C3" + "2A29361D4CF81427C97D87FF858746C6C1452E0EB9868930F86A4B55FD11E5176C4B8ABD9F1A" + "7C3B51C929324B7322C6EA6D40FB9AB4CFE693A3C0E3184633806C03B53A1E9A334B4EEBDB9E" + "AF5006BD477738A8510175FD5F8F64F590E06015083EB8A3527E3ED779B37F6D7B79887EE5C5" + "D564B0D8ABB86941DD857E5353DCA6D41253E473790605A04BDDA513A98E69B789CEC580F7F8" + "B36754358E9516CDB8124256CF0D31F2C13406DFCD40CCECB2898795FD5A954AAFA13F8EAC67" + "FAA63CF1957F98D5C7F217D54AA56AFEA7864534DCCC0ACFED80B20D3E32C3CDA9092076CDA2" + "A5C6B0AB9B347FBC068DCE47B659C6572296EF481681827B389F2920AD94EF2B29FA86EE0A58" + "77546C349AAE8E9DF8467B7ADBFB367BADF1F92B1475F042A0181C26BC9BC7EAFEBA02285473" + "BB8AF5802BD5E76F5DCB4B3165E172B700D8073188631C0F17259FCCB5677C0AD95D8D133B49" + "32524E2B70F963E6F54748DBA29E22FEAB49587C32458675C1D28A0D8D8B8687FF86FA4F90A0" + "7CCAE1B251530C338618E4C388C009522BC95622DF8EECD5B34B127CB29D3A84040CDD714EB5" + "EA29DDCE6F4F5B7580A501673CDE4FD801136B718335E11C3DABC89639552ED843D8118795F2" + "95EAB77569977CBBAD6A01FFE3389FA577B8163B2E56A29DE3B61A01D3D64D76D4C2A6C9345A" + "A4D05A922D1C0DB588F1191F6517DFF9D047B579686FA415973252979D1883B8E45780E844BB" + "F2A0DA99F8DEA96FA0F1D85EC2C786580C4F3F4EEFCAFC836B0E424E618D30EB4FFF5C8B3602" + "C85BA90774187F2025C65FA9983BD153199FE538B3A0C30BDF84A505D60B46885DCF4CA8842B" + "85A97B8B83DFAC45523EED4DC8CA734AC0FC66E1265F849D6286C13B9DEA2201928E980EC051" + "D5715601C5845068F8AA77C443906A7F62388DFA9D877F228CB3A2A0BD7D3D2CCA2B5C015B42" + "835AA33323430E86BC4D5335ABCD92EB70160037BA5B652F985E37E83D6011DC9AA8992345C4" + "796CE06F1343154706ABCC1C96D8E268EEEAC9569B62BBA1A768A3B1CD577ED6997EBE903C5B" + "89FD1B1CC102CA68A503182D233EA4DD27BA00A03F71BCB11FE4D600AA9BAD69E19A7E29BB96" + "ECC93E28B759AA991B615E8BD0FACB65667EFFD9AA3DFE934412796D0E0826AC23CFAEBAF9E2" + "1AB208385B4F241164BFDE2ACDFFBF335369AF85E8BD436C4CAACD768A3E499BB4EECA3F2CC3" + "CB5AECAA803593FC469EC77E02802EF25D92BE625A0C60528B29A0419C6C5FC8ED1E04BEBF4C" + "B5BF7559C6E28B72C2EEA36CB549ABBB8B238DB49C19EAB0715461647B039B4F11D1624C8AAC" + "9DC4035E0BF63D0CFA536D2EF60034076BA4D9EAD665591EB0B861626662AD60A16D401D6A29" + "9A5E5F5E82A2E698A27F70DCAFD88E237F2B04E111F72A8F8B0510D1C0354755C501B80CB8A4" + "C0222BDCEE41B0A35C90FD3243B31F81A9672989D95BBE25511AFDE0E8EF4AD0EA108A9979DD" + "08B16835D05290FDE86182E68E53FCCC6545EE0CCAFD31D2027F0C17704AED09A036689D7FF9" + "6B8658C33921386B609FA9FBB97E79180D30F1A1BD0DC782F8", + "B658CE7E9A36AA4CDDC97DD5411ABA3E4A4891FC39FD2A75834939AC0047E7025CBE29868B70" + "1700C555DB8FC9DE34CF8C926BEF892A748D1B8DD8DC5D1D8520855BC537CD9646376F38B4CB" + "4467F340D8757B50FEED71F0102B4E963EE3D990ADBDABDA4F776C6F357571F4B5DA6A5DA1BD" + "1E7F03C2F0651DEC4614951C4342E6C3CF02FAEFFAB776A854D209DEAA93CD006E6412C6F368" + "CCF8A5D64FDCC1CE13AFC423505A5E31B05EBF16608D2AE886E56D8222051FD8EFE07DE36336" + "290C2B6D0BD4DF1F1077FAEBF2A2F3446C5245AAE90DBCE80B81318528A4541A7C6E639E405E" + "E3DA31EE10172FA136286498D7CBE45EF02A006833207750F38A9FF268917736F850FF086A92" + "A2C2383D5936132F4B49353A45B878B059C14CBD1B8A99AECAB4FBD733043AD98FA44E3410F5" + "CAF7FDBF85D3106859A652FFA57C8E255BB404C80B76A91C4FA97FD29966858232E87F6FFBD4" + "EBC20B1C897C66D708333AF7CB54DD6654762F4CA0E683478768972B24B4BD321B26AF0710D1" + "5255843FC287DB3BA24593FE5473C2BB813305801503DE89F4FAC649851B217D3A021DE316F1" + "DE809E719D8F960A89452863207405CF6C25D568928D88B3D153F5D7FB823E3ECAF42DB50C25" + "1B31B1EF81FDC6FE2811106DA9D845D52C419A3F5E87631E9682B108FD721CE0CEFC9AE947CC" + "C5B3D8D2099D802CF2555EE412CA855BBB57FDD7D03CF0D9D0B08E2A4A188DEE2983D0F03F9E" + "2F616E9596EB4BE3ABAB3D8DBBBC96F56F6D4266F1DF1A5CB50203E3ADDFC2B7AB86C0B3F988" + "B4CB473DBB189A6CFB28F6A841286E2E8EC6EC762C4B95247DF5924C7CCB1EE4FC76EAA8C03A" + "03B458651F4E9039F8800D6724B06B952FE70FE244949F175620AAEFA4EECC955B165F9CC69B" + "7C53E598D3D47432612407A36A1533F2BF059CB5530144DAA71D18C317BACB63CF3A699B9585" + "9E2480B8A0FAEB63CEF7B1B9DBBF3D2F613FBA8F3AE7449EA0C79A825CF2D89D01E4E82E0DE7" + "73B008667D2EEF9B8351DB11B6013CBD83F0314271D22F0F1570F6AAD310ACC445D3D685A0A5" + "F717BAF3768E46E52EBF82F5786B3EFCEDD2E90BD2039B3B616643024BAB7A95F3F3FC828443" + "2247CE8103A3A6E7ED0AD04BBD714625BB7E33FDF3C2F8C60F1722361829546F2B0C09436D1B" + "753E4E6DB19D36A63E016D68B7E6AC732F2AB9B5C4D8945E026D0187DB04EC6FC0DB0AE85415" + "0EF74569A8063A990148556176D3E571B1316A8E6CC6E8D5FA70EF52A4079C07EB892D30E3C6" + "A69DC984B33880119E261D543E63B62468649343DA157419011874BEF3382E5D81A222A30F43" + "1AD2414C6754296E3AD477974AFA974F715AE3B4A1573194125AC617862A222C0DD3A0E67BE9" + "70C404C17542DE164930B1236E33E155C323CC4008E6690C9DCB2B1E3865A48EBF01CF012A57" + "B872FD58BB19B38AB4646C753E5B7435509404CAE300ACB5177B854150BA86D81FB1B906DF0C" + "05B203D148D91D6CEAA7A671AB3F68B5B403E32B65CC6DB393E576C5B6148186A7B154A0C362" + "27478318FA1E7DFE63F6ED231475EE905A85BF3B2E2E040B9F1226110A09FE7E7D4AF6AE9206" + "133436E6CE025E84BA5DB9FBE6B0F57A0FEBA53B138B767AEF477D282D0B5E5D1119A8465AAB" + "78754787A25C7214607E0DE9E4036C46DC560ECFBBA5F330806E773D83A0B93C05C8DA79D20A" + "CF182BC9173AE78AEFE437A5E7EEDCEC6F7B9E36BAF828E80923CD0D4ECCB2E79E369AEF4618" + "C5C72AD914065569CD07EA7E6542B62F01243261715E58CD3C", + "7CBE862937A7FE52FAC6EE00A318C65442629D05B1FB062601CAB6BDC85781F18CD6F82EABB7" + "263EB910698782DA0DDF0FD79356DBB7817D932E96C2A613782F0949E180398F5FE491D36A60" + "3ECC22940369439E93B4A119D6306F8C8F97C1AF07837A0E60C86CF8541F3F6FA15516796506" + "431763C5FC0642230E7DC61508601B84AA65505523CE11DD2840769AFD6FEF20BFF985169E1D" + "D94AF032E16AC525C9D2D000663A5C5E9CF62EE9B85961908C4B45A9D73C74277025269FFABF" + "6645F5A59065E28346BE282CFDCF41F6289FC751D78AF7996AC1574A3D0DBDAECCF5F1C6FC91" + "687700EB36D4EFF2622AB8A5401B1C3F7A8F4F44BEA1CC23E33C5EF972136EFAF6DC432D7235" + "230B3C9F72FED80529C9496CBAD2877C3BE458776D90DF282C291C94A5A9ADDAE64512FF00B0" + "74FBFA8426B13C32E430F6B558C5AC389192ED8910659F5048CA3681E4742F97C8D68DF3C519" + "0BA88EECD566EE22BA131479F62D627D3E85C4F02D8A62415F34C11236E9312386B46355ADE1" + "84E98791AC842BFBE5C1A01FE9144CEB76B2B4A5271286829F6136DDC34CFB87DC296BA6D252" + "7294036FE9DF279A189589D698476DEBEED909D3EF4798F88670AFA45E5E2BDF871B0054A3AA" + "88C9FEE56D9AE01DC2D127EC71F5E66EB7B6178A5D506AD33DEA3D715C7F228DF05E77E6828F" + "AC5828F4C134B5F44CDFABFF2C9481DC85C79D72B45A462130D343B2EE8DE72F474B8CC00169" + "7274946AD0E981EA53770F2D1433FFA09EFED7EB2DC04297710E78954154CAA43B00C2150C77" + "CE18884C07F478DD184C14D3CD1550BEDF9F0543E6C260CE0BD83C1EB07D3E263EC18D7310A5" + "B92F3852D80528866F80CAD97124FF5E338030F2521E83D90CA86D2E9937D03DBB6D593D7E1F" + "760B683C32C113AF8C9DBAAE83ED6631F03D4277ADAA700C8C1BF1B41728C8454C6318A00EEC" + "6BE94FFCBD928C2FA7C53D2472F99B7A6BD6C65B96185AAF76252C62077CC3C6E8803CA47748" + "988436824262796B451026D75800D506DC0E47F521941CFDC830E1639C11541920A9D672D122" + "9BD114E2ABFD7FCBFDFE744E78148CB19F01D0DFF9A4B0677E3CD3E5AC3476EE06AC2E117CA8" + "4C5F99CCB63CA5052453944F1CE44B5D89F51D34217772E936B334AB9E8193FB881B745CB85D" + "2988C07E6638950DA56208760B478F90DCF5AB63B92B8BED51770C777423A41899F54A0FE423" + "89B620CC69F63A8E8917C91A48AE6F204E0E2A662FFA6B63CC412D935528035C1F77C324E919" + "6D16EB6C48571CBAAAFEDBB5D446B8B45D76B71833ABC717F17175B44E6161D903BCBFAED0A6" + "37EB5370660FFFF8537ECEDF6A98077E2DF712F2EE0A795F3DE04F44DA333CF2838A708997A6" + "443947053CF3316C8BC81EF3EA7941DD3D23BED1FB80655BEDCDFB287FFFC1983B2B5FB1942D" + "D7F4F7026E1A19C8B6BA3A3FA38F573063B5BAE8B47588AEB76DFD5574E3A848DB5DA2DA625C" + "930FBBE0EB0052AB26D208CF1B597FD19951C1C813D9D449624FA245C571BE58CC11B647109F" + "C14ABE64609710BBB8C3BA2ADF4752771B56BCEC27C78B41B8411A96C2A47199F80C4652E874" + "E8BB60477F2605E754B335B25D3BBA10B2E2BE46EB489CE3C8A728928294F1B4CE67E8C854FA" + "21D0D581DDB8B0D69F2CF1FB9834967FEC2E03E634C4A079C8B9FEFF4FFAFF551CA22F65122D" + "39AE541260AA20E71A1C304EFCE0A612BF89C0ED82AC006BAD90228B5A79190905B084644BB8" + "94F0045D8F0CFB8118D291BBD56861A7698DAF597B667D3890", + "97A91ADF94A4871A339D360FB7730073909DDB857263A3C9E2F01909DBB58CEF47189FF92D70" + "E6A7A059E595C8009D68190414419CAFABF625DA32D90554133515D8DBDBF2F89B1A8372FBE3" + "19C618AE94A8148A742339AC281B206C8312603CCC036E02616DE433C3B41AC1710351C21B2B" + "2D281C35CBDEE4DB426BB8F31F740AA71C2926A2BC8046DE1DEDB6744EC12D11F0237851A010" + "C4B9FA9F4E94CD695CAE4FAAF2BC3E6F580EB382FE28A78081AE27DB67E80FB8236CD7567F6F" + "714B4E8F5168693F22124A1A7AFA0B055125B641F049ABDFE3A9F7C1D52F16819FB53400C082" + "FBDA00FAB26F5F1667BB28AA3BE6A01897F3677150C4ADB5230A8EE6CFE9180567DC5514DDE6" + "68FAF64D5F005BDF4103002CADF98168F4AB83EF95C7FBD5920F826DA48AA0D05F5E58524844" + "FC96168AF172D28EF6FE6AEB36C41DF017E6DBE4758101E5147F41CD701AF67C3D4F55F2753A" + "96B32972F95F9D2308058A1EC40F88B483722E6DB7B87B62013D45649438E5502EF8CF1DD642" + "DB277BD3AC3814B4D4D8438AC08E83582DC3CC27B6864076C0333C0648C13604D814359CC42E" + "5128152975186398C7DF4EC158D91F4FDBDB1BA8ACC82AA09B4C5BA46FD5F5398228209816B9" + "0013A9A79A05E5670EB49FF918E2F731ADDB90980F4793C5C64EA1DBB909CE00CEEDF06CB9CC" + "58E12529FB5895E96D978B7FB1E42F45EC748EE248D3FFB099F3F0E09D916D3902CED0ED3E3A" + "09C359287AA8F9F348624477D079E0B35D165017EF94B4905B828238BCEF695DAACF5C9676CD" + "245120CDCE56497BC1BA95AEFB4610E1E285012FDB9C5262C0B00B2D06B639C8DA560293A7A0" + "382F7C6FA2F842F6CD4CEB61EDDA1954BF46E3511EA78FDB7A02E0FEEC02F56C6219B67E688D" + "0B55BC155B2A3B703C10A029585808893EC6684A89B94AB3069BCD2A3AE97187285523992DF9" + "D1340D581777700C0C26DEFFA06B7EAD3B34F536732C78C7903ED0B1B3DF9BA13EEB9F0E707C" + "474A9FEC97374A87E32E6232C6FAD58B74A6304B84976C8C057CC17431BDCB8CDF53068355F5" + "3BB5F570A1A0CE333C0AE965C6884C6594188ECE958399CD8821F5AA576F451EFD1678931D49" + "33966935C2A79977173EA6D73BA5DB32E5EFB0078B79AFB954A4A8DE2A3DE629E3898F13DA6C" + "EDD158FC2A47A686103EABBCF9C8AB1D1A5EFD3BF0AD5939BE9D208807346F77A3886B5F0305" + "F1BCFD27DA612F98D9C5077F31460B6BC5F47ADA0C519FDC1473633E90CB7C97E7B1F4181F5A" + "C238BDDEC59C0220972FB39356A1FB97EF4B171AA273E7BAAF810C2CBC4A87E35176E6CB791E" + "3238F28CF78A8F62A4A553BEB3DA3C01BEF4E99B74BB9D6CAF9D1DD33CA87592CD3992571923" + "CD17EF145EDD4AB5F082367338352E6E230534C6422C74D2EA07998E60B0A1D5F5BB95F5582C" + "195F663A77B185D067D40626DD243A418CA5DA356BEC6988CE98FC2A5D9D26FF2A5C47C1CE1F" + "3AEF90BB3F79B1A16F813C63C699CD95E59B96AFDAC0BFEF6C860601DDDD0356059173F69338" + "95429C31D2EB8A967B2C19AA53B22A42CC6F9A2203435280A10781DB8A9B5507B55A1622CFCD" + "B308C6D5E806EFE0E80BDB7E3CAF1158EC5FA5530B76F0DAE6566DE843E8BEC7DE8380BCB928" + "0D4B62738DAC169A01A068C9473B7E901428F0E10C5BEEB52BB07BD24D4E76609144966DCD27" + "5E6AB752DEE7A388283B4125A53EFD014D1759A0F3C17DC448C259F3E2ABC29358720B8F96E1" + "6E681396D13720E1F9F321BFF96248EE25C6F45E84F1BFDA3C", + "B6E1375B396D0682B0F071DEA4C7085716FA30FB72DEB9E2A1A0B2F1FCA11BDD958391B6A041" + "62B4676C6B89A2BD5699A3B36C6B59D738962CFC298AB10843369FCD9822B54D8C1239B8469C" + "E69844FEC57263192BC382C00207A5F3C50DA50AE00A3AB8FC3E996611D0BCFA79C86A7690DA" + "636CDE44BCA489662306312177D628F1AEBAA38203E22A2A04E2F5D0274126562AAD9A0F8C73" + "D0C85EA2BD2A4D913F5695C7957372089C1F783CC177DDE5A0BDD1C8645C2B3A2E9A9C3A6D83" + "D20598E3DFF80E3CAD9E1A7BB0B529D5CC9EC2C3F00F2E157B2A3262A2ECC31D2F00ABE15DB4" + "E3BA0702885BBE2E41776AFA8B9E0F066C824B22472BA189FB95EAE1F5C912F60C793983CF36" + "C5920081F71790F6F7D86D842A97A94F845536FB7EDB428951447D8B877C3BEE1F70E8DF1145" + "48A16DBF6FB65510F94AF4AA10DB0DF7B784F477C08024D1B679E0CE4F1837A449D7C3ABD4EF" + "C8C2EA712269209B30783CE8AFAB77413A3EED08A0702EE396DD43EA807A5C619BA2A3262A6F" + "543A7807E1A1BC99D5CA5686EF2C3CDA9E380FFDE38CD025E0DB2E1CACBA2E6A1D1309C5DE82" + "D3DDF7419E0F7C1C88276754F1D4B57E44D92A5EA2BD0985E718F82CDAAA3532417205D7A390" + "2A2A23E020E2AEBAC78A35F7424630623348929E913D9B632D84B72B09CF2F9E85C4334CBE1F" + "8EAE2803A852D851E7D2F02001A0E1EA4C632751BF910CB39CB10ECE2418D956A20CD9FCB661" + "0846A8CA1F9A348E75CD6B1B66E2CCB55EA2C8EB1B7316A34102B6C4E0D4DDEC429FC7A682C2" + "A3CEBDA76F862FB475087192BDC70786A0B05B4E6D7643B6B3663A13FD7650A68E3BC7C5C0F5" + "CE8CA4AF901ECB0406BF9EDAF3AA450111618431E829246029833E52A727FBB3E2046EA9CF08" + "72BD962E57ED7B7B75C8B9827F65182820348F1D415995890AC726865A98DCD799FF48D98ECA" + "34F4D9A3B3D9F9B356703C95E50A6DAD052C771C6AF5EDF29FF77B1913F1D9FFA87F10752DE7" + "6C14759052C94C85894F205452D4D39BEF5AB8EE614214FFF84A92617E1E215E362B0458B16D" + "49CC369DC9D5E54FD4CF14C000A1D5A75D0E9C044FD28A356A17FB980697823309A8561E98BB" + "B6605123DBAF34B15BC9527FB1AC0C8943FAA3877ABE4B2E9E7228CC0D367159DC8CC702B4B7" + "388E67DC916AC0A26401D696947030B737E5C6AAA4D855AFFFB73A7A1EDBD379DCF0C6A836FD" + "790B3CC3E7FA54DD11501D908BBF253C2EB7A8C4DF7D13501ADC8A5EE13F69BBC155300CAA62" + "AC98EEB3D8F960BB1B595F2CEA4C36B177EF929C87518EB4DDFBB2D718AE13949F7EE8D6C325" + "734FA9AD8DD069F1BCD7719354655300CAA83DD96FC877A513B580AC8BEFB2315ED743CA4FDD" + "109B80A88BB2A5FE7C33CD09EBF6C15630F3B9ECBDB785E5CEDFFF5AA1B255563A7ECED0C0E2" + "9696B8026450356893BE6711CED2D40E3313B9A8E6CB033146E7974D27D5EE1C55FC29130358" + "DFE4A93DA8D2CF5DBC48A066DDD19786A1590CC41E96019DFE856AC514BF2203970BAE5AB850" + "00328F32BF2A7AB93B96C3392B68D1A20D46C7A84787E8649521FFF284286771D5AF7D9CB2B4" + "A2A04F291A132934A09AE2836E7B4AE08FE15FF9B8FC898DEEFF94FB7AF5638EE34A0B5B650A" + "7A93C0E6ACD9F9BCDC59B2F2C53719B12FF99EB3B195A6164E35091A99A82B8F12C041418A6F" + "E419D13AEDEDEB7EA7469BD4E10F395762047CDDFE4E54A7CC194062494178C21868880A255C" + "F5B79FD6020D37809F5253173AF03A3E3DC71650A6EBFC85C4", + "2E6E354505A86173A993950493AE42D0C1B982A33E5C6BB36F4DE6F0D8FF8F31FC5C3002F914" + "DD60C726EAFE330831902F91DC337B786FA2F3315649CE0AD3B29B8497F9A3C0F6F26430B1D9" + "9805E4F069D1C8BB027287023839C656380A2708F967B3743FE3474456E4FBE028A969CB5E4E" + "0F566890B2E8DED367294D72A3378389F207F6328CB2EB8F87A9725DD38A29085ECE2C779D79" + "00F050E30D17BD7BD991CD026BE0B35D91AA5EBDA7B7136E08FDD61B2A9B5F579096F419356C" + "22ECD8C950ECAB1754B0234A037A4C4DDCDB0C208056A8ED619030979EACA4B695220AAED770" + "572475B36E94D364D4A02B12E3A2D17833D50EF663BACA9025FC63485B8716BFCC72D7BEA0C1" + "07444563F4F65D4685904F5B9EA80A6730A723E28E13F54EE21B40034A15BDCFA83A321C2185" + "8B37496ACB92A0E489C0CF48D13AA8BC24A2FCB9D8626362B73F6F33780FF3E0894A35684893" + "25C9D264890B56294883E7F80F667B7E76A363230DCE9FA2921E8AAE45897981C89382A4E9AB" + "497668D0C21C262E0AF9DED42960016C23B957E438A3E2728673280ABCED7904D0B15D3797E3" + "5111704182BEF5A719FEB470ED09631FD204A9AEE337B855E60F45A2E3A46A0295936594BB66" + "D712750775BAA82254B6929ABCF48604C35B8AB50082186D9DD9192F6029620695746A9B8549" + "8D9BA21B564C17B484F57D6CAA6C35DF883B6476F2DEBD2AC4DD6683EB2059C4CDEF5EF45863" + "8507804F5CF71A39BD084A28E5DD274AF0F8EBA698A637F027C8E0F662A7594A7365BD8BA684" + "8B3578393D69CB4A8A03EF93B5117163FE1766F34F8872280E3531CE0E2070A7206E89C5CB07" + "93D00CCDC6861327B781E2CFF490ECA6E5A839C9354667A2FB0F6F661DC4FA04C608663FABB2" + "71835D944FA0061D1FC678FF8D87B3D97B66EB1D3E62A0CEC185A13AE49054E4CAE7430AD051" + "563B3A6E495DD6F07A1FFD37D43F4FD234DE63C74C61BA162EBF14A809F41F550DC45F31F00B" + "EB6A6EBA572F948ECE0D6754149BFB783849A93A8DAC41829F3592C93D8DFFD699D1B3946683" + "69404DDC5D3B5AFECF14DDC3CE6414F8C2FFF90CD760367C2291D342F66739B6E28C706B3D7F" + "B2A6EBC0EB5A8721878197E7F06C4A5695B6DFEF36F7CFEE5E6BC14B4471BF8486EEFD733AED" + "792C8A69D0624ED129903CBF17C0966DD6023AB1EF47B413FDAB92408EA1F1EC4A8875026967" + "FCC33CEE582D6EB05C1A49B08EE88496E8CF9C0713525FB94B8C45C14369187744F7F55459AC" + "A567FB0660741169EFFD8ECDECAAAAF26346CDDFBBE423415D332C3BD0A9072A58CC0A40DAD2" + "E2DEFAC1E89C2BFCF4190ABDA11912C185DA868570D84C54976EAC1AA53C528510E0708A14A3" + "CA5583576E92A321B0EA1615BA183489885BD50982F3FD43917835F7B474B5B0250331A54E09" + "50BDC34CCBA92C427DDFBB362C64F555537B371BFF796882E0660DFE6A5359A2AAFEF22EE189" + "6C283A231D29DFA4AC8E039F317692117710D92583A0D76B41A773CC33FE69640AE1152378F8" + "5710249D5BFC82DE2F78D5C406BB66903E8FD3C09948B72460B9651349EB75CCEBF776121FD8" + "E22D283D67A77F3EF6CF7FB6DA96A52360FE7E981E184E15AD703D7654DFEBCD60E31476D9CE" + "66F42CB89443E6C06EB309FFF431F282673C3BB28F37F5ADCBA3BB20296C16629CD8B996BFFB" + "1BC9349ACF9418235B15C95921C1EDFD9282AE6B0737129F4EA5D7656D7D00F8CFA23B0AAF82" + "F901528FD74685D8632E3C67B2C4BF2FC2BECBFF85E0F6BBA8", + "514A684AF76A8B1BBE5F0BDA8396A5A80BA7660469ABD33D334DB749073803698FE4A194CB29" + "C00DC4F44F3946C0C511AF53F05D34C97B8285B2465265B77AB9009C71B535373AA94BF68173" + "94BB5FDE05355D916A94313AE6D7BA44C59870E211F9DEE8232953AF1E036D55A5A2671AE3EF" + "C54C68604543D2A10660717363B137C3573212ECC809BB463418463D98A2160A1E7F4E622F5F" + "FAC77B372CC7EFBBEAF67F3D2D7903A9D4FEC851FCA18CE8D58CE227DB29491DBADC48AF030B" + "8AB5C1764E9EC02F75850FCBD814E919F2F552DFCEF409F7E1C3B3910E18231A2638F078CCCB" + "77D9E5D9FF26389F9B12FC06EB5F6D24F382BE80BF26BABAF2D01302CC8354174025512BE8A3" + "0583FAF1C77EB603F83AE6D471929C2B498DD907E4ED2D4FB2EFB8BA314FC535FB24E786E7A9" + "8F401EA44BB68A89088CDB93050EBB747A9541F8BC7912E343145061068FF715FA8EFF160860" + "A28C2C7489E3D1F82A95E2EDD70A0C9DB311091516DD2257802F195E761E724DFACA3F28C5D1" + "DF74DF2B4B727E09BB192D439498E2B675C1FC06D7EE38F5FC1A0C517D48AA402E82AC13340C" + "80B4F5D5D64FD017D41CF24B6FAD7603F48D9F91C64FF9BA79BEED3331E0F1C6458C4187089C" + "DC387EF902F73FB4AAF4F9897281BD3F8A1AEF40379726E83AD51D0C0F5123B5DB89294DBE44" + "731AB1731853F8A137F2B95C09EB4BCFE6F57DDF7E334ECDEE35FFAF44672FE7850684519BC6" + "2182C62DD901337484CEAC3EC8DC6CE8E0660854BC2A2061632A3F7C758E645A5AAB6C078F5C" + "A94C4177B9F88470E19A3225DEB675C8C295689BAACA07BFADD29CE816FD2955CECACAD8E390" + "09D5EEDA64A624DA141DE932CBA0FCAF588A303629CF22F23B00394D3298527F196C01CE092E" + "DB2CCBCCBD5962066E5D015A569C15BD0FA7DD8D156EF5216528AA0FDFB2499BE5F634798C40" + "A82315D6CFD4DDFFD619F8D17A8B012C3B4F5A4A3A812714DA000DF0F87B31DEB4D67B150EFF" + "7F98736CBDCA8DAC04E763A579B427416ED7C1BD1C2674176CE6794AB5432754D1BA3BE4DB2E" + "AA0CDBDFE7911FDF84EB7AA52555C48A5EBEC9CA9AE69ABF91B850BB0E37E5C987E173E34B3D" + "12637680BE0B7F41E1201C18AE2408E02D0DEA146238E075119C1CE43E7ACC9B0B10A1960D67" + "389B1B812D3305BB20142EBE6670EF85183C56772DEDA69DD2A07D32FFCB6453EC2A50D6D69C" + "744E0C1EC50C6F2251B5C893599DA640D63D988223D7AEFA4A53C07206B7AF2BAE8B5ECBF94B" + "2B12E8B0962F04CF2FD1E702F3106E2BB6BEDABBC040FC6241119E796D908EC45AC726EC304A" + "731D82C59082A9849856064E84E3A581B540876F07EE7834EBE0380FAE583CEFC1EDC2055B03" + "4B8E42E4C0D432432A82134683719CA4186EC9C6B446E2136D3CF311048C7E0407BAB6FADBA8" + "EC119E81CF17E9E641E8D21A2E91A9A53FA6F5A2EBA9EBDAC09C0794A4BEEBD788823378D604" + "CB733592275B1489EC6146F060E45C72D6D614A86F944DA7FE997C0A9772CB6F69DCD4783143" + "EE1CCCFAE85009BB41996903B1B239CD60D30A11A1B266BCF84E7073115C0E388C50AF61680E" + "2048EA3070090F05FDA0FA02DD8C9179A58F9D0FC3274FD8E1BA143B13FAB2CEB2A726FAF4A2" + "4755494ABDAE43F7F113CFF7B660AAE9B64FB8BB1655C9855AA53CCE6DD05CC8717B07D6ED05" + "C85B3D4B8DCE406B62A77A6D9C33FDFEE151BCD65AF719BC3E1F6000B651C902B8A4B5E5B869" + "01A2BD163F30D7FF7657E6D751882A04633C58DF4FB3249BF4", + "496A2474602A409531C2DEA8643F0C4F659EA17C88332FFD347EF33D5850D3156DC27C3791DB" + "38EE6C43FB3339DCDC9AA034A4D7006D6B5D270E6F244D76DA8BCA0B46B4C78F5C2579A96ADC" + "7FCFCB4C43870468806B251EF86AD601C095B6BA2622A21CD57DB8A473DCAD7A3EB1A26042FC" + "3906CAB67E29AAD0369A8B7B14E6F23A17BEA05C439292646567C57F955D5C787888B7F7AF4A" + "7200FB425872FB556C4111860DF61958C24A18DF03986010035BD4506D21896E44BF16B7049F" + "31C7A48EA73F4E31A021DABE29BDC7FDC51E2805C8CE9E53CEFFD3A5DB6F9F29866006C06CCC" + "CC5CF772E098DB7D15AA0E821E57ACDD244139D7D2CEDA62FF3775D7F0B31B6237AA08DCEFD1" + "7180C90BF8CE98923E7D3AA9BFB2375C4AF7FB66F734712B2F2686D2F474E7987CD3F5133F82" + "00D3B4611BE89C4F12294A1AB6721AB13A6ECCB28364E56B67A1D8F8F6F1F1B85E6D6A726C14" + "D33765C8D584E6D58529448F23917D8862DCB0041FCC8AFCB3E19E72E2F4B6164F4D48E2CEF6" + "6DFEF523AEC4DFD955CBE7C4919731FD093018E8BF73B1055EC46D8CD0FEBAEECFF465B734BE" + "B9C8224BB35EA78417055A8BEDB19074EEF3A3333360360066194F9F6DBA5CBFF73CA797313A" + "01478A3BFE3BD947D5B84058C72FCE57125E38CF920ED68FD22769184B60A2BDAC0080619C0F" + "B1852431A986FB061888236AADF4E1A42DF004E52F5EFED111E1E3ABAA9FEA3E6A6264949C23" + "A057DE85C4F6728DED1596C0B55947E6D53609C3F4206458D7C5EB53BCE251DBEAB384544645" + "D6DA903806B561F78A4D6011620E1C232D3F3FE3B56959EA43AF1E32D62D053D15B6EB224F67" + "0E4BAD6B600EB252C05593B3B9CCCDFC236771CDB89EC3E43B6A8CB0A1ABCCF7E2CBFF4CC113" + "E8579A6F230FC26157B438CA90254062E24569275A7AAB7D83CC1ECCA5A120DF6ACCE31F6C99" + "6D3BEE337AB4F9531277DF0DA44A309C3EE10B97BF41BA1CA36F80FBF7CC3A56F26975452D2C" + "38AC2D5AA47C66E2F95865D1D2BE0DFE1B133B40D7C886CAD78F6A9698572149B0073C7607AD" + "806C5D927F334E924DFCC1ADDEEE64CB0475A556BFC1D8268F9DB48EBE9A782521044E1058BF" + "1B116A32F8E93F787023FCB045D18D146B233AA71B159C29E1BC7C9544F596EBF71366D14799" + "51C28BFF6C315801A64DE51FAE29E8084AE10EAC93D5DA511C23208041404A4AD87F40398B99" + "74391BDCCC1F717A44688A5DBCFF418973EC5489D48C4450895172BA6FE8B31978D401F01A1E" + "65B7B2E30D49926DE590140DC3DEA8C5B9CDD0E3C0BF773D3B92DEE227857341786DE1108229" + "A23298E99FD008796F4AADE2A40404C6BF8371A5C7EA4544AFC74B1D83FAC640404A8F6AA5ED" + "3C2017F32E32988B2882110F6C3D059D43C88EF693B979DDFA078E17673B466AF7876050134F" + "6C9325618E9BDB4CF0B01F00563D319A2FECBA9D15221444625722546F9D2305FE7B74A22C44" + "BD1DF06677B1385D33A33805FC36A4A405040209887114B757926AE10EA4202F28EBF14F64CB" + "0035186DFFA2871533C516CD91DFAED35E45527C7B0F287351B1CAB989AC516317441A7F881C" + "3DF92E3E98AD11B1FA3410E44109483CB2FAE25B73E2C83707FAD54B5C41A64CEEF76B067F64" + "92E599FC93746C036BC0DC79C01B2509D432D2ADE3D6A6C227D605B991B0FF60FA97174C353E" + "8ECC7C4AB5686A386969455D2C9ED4B867DFBE03ED8A70BB05FBD3A10EF87218A44B61F7DC91" + "953E5ABD98EFB96D326DF18E66ADF6090B4A66F067837DAABC", + "20073951B0ADA52D6A04BBE0AF55DA3FC45F8EE1D94CDE4AA1A6EB025AF10070B01B1ED241E1" + "4A7A121C985D187FE3C157DEE02531EBD7F033C06BDA4054A898D4F24E3F64C884AE69E69ECF" + "4BEA12AD5125BF7443CE52F3A38D04883CFDD03F650F663949377C8E20B1E9D8ECAAAAC80FC9" + "1EA0120F763896F1C80A07CC89D538043EA6B576C12709EBBA6F3567D855136D8EE7A15D058B" + "57519E0837233D3A596447E4F16C91DE0E63256A93D2EB7876DD71C4A9C492655ACFEB22CA6F" + "40890F0C6B1ECED4749270BEFDBC4E9796A4784BE1D97E26524EF22E55E9CF90B2DBB15DDC76" + "1F8B7AAB075DD6DBF0CCCCF03478F1A7CB0B299C941B17621283B826A352091187ECAA73BCA9" + "D3B80491B027C2421A9256E27A8B4F7858EB1CF3B710637343088EC9CF8F6D2BAB5B49DB124D" + "0FAC5E1A0FD9A376D6CA834DD93393CF7937D59642943198EB48935ACB2FBE3F09A0D2CDBE2B" + "0A8210C0CE82F94D82796D56D3C83653E82E6061082A1A8FB66960B21F8FBE9A6B59225AE331" + "85284D357D93DE79399376582A6D6DD8B37E0B0F46BE16491B725B5ABA96DE3E726E221859D8" + "C11DB9E71AE343DE5A2BC8ED492B08487C81B12403B972A7B9CAA6FC31120958AC83B82908DD" + "1B0527329A1A7CB1E3C581E66661FB6D775C1AABDA3F0DC77751BB69A13E72F54E89EE494C8F" + "D370FA43C4AD3D2E47B7EFA1C925C56E6F1AC61E12205ECA689AFE6B54C92472A471D76DC3DA" + "E9792AD498CE0F7126D1E4FC44D34B97989D820F315D5A341750BCEE36D915437CD59ECBBAF2" + "1C906DD5ACAF84039572267C0A0271ED238DDE0900AF127E026AAAA6E372F1A08E27DD92538C" + "DE14DF8177E782241638B9E94E7845DFB49156A90AFA5E6F2CF2CEA42264DF8E49E56322A540" + "4B7AC07981FD7AF19480EF7D5078FFC3174327090BCA50F0496F1B01A1C011EB481AECB0AA4F" + "665370EE3F447F8B755EA0FBA40AD694B6A1B1539C008B2E10597A61FE1001849DEC21778E40" + "219824EB1210CDB8E88DBF7D8FA2A4906A1AE230CAF751710A728E6232DE2DF2BE2DD860353D" + "0C805995757DBC7ACB8D9A3216F231C590A31D0D9FB227B3C88C02D45C5C8470F29DBBA54BBC" + "E3910F7F271183B1BD2030F5FF59BA7E47552DE0111C56417EE4FEFFACFD29DF5F4EB05D3CF1" + "655EDA1133887884191E2A1605DE382AA55767D857572400772D99FA7614079B52D37BAF2343" + "576EDF7A9331BACAEDE47C919DE142FD614FE20ED07CE019E62A245C054223DEA488EB6C32AB" + "94E45F6A5EE72F12EDED10A0F03BF77578A2005C3A21D26A4B3765FAC1B8EDFEC44B3A973816" + "C393F2F8919A008EDE63DFB49EE0FB8634097725AAB790912913A7757F33C5AB636EE0D3CC7F" + "F948CC43FD86FF08CC4A7FF8CF2C1DDB1B568F33FABB9722522427B55693BA40B1877C1DE4B7" + "EF19EDC40166247D3F270DA073A573488DFEDC760D7E9BB349592E1170E801147ABBBF703C14" + "22DEDD23D39DE95BE89CA75530DB5C4495EF100A80E891519E601CF82DC11FCA1AFD0A1EE624" + "F89EDD4D7633257BEDDBAB0B13D77B2D2B6780A1B97E66D3B80093ABA86F9BAA955071EE81A1" + "51E26084784732216DEA9A3CF2E835CBEBEE52FCD7FDFC9DFA09A8E2201ED2AB89F9766BFEBC" + "3012F637062393FBC2271CF74A9776E53C3884E8E8AD00C44F379137E6C2E314268E313DA131" + "66C74D78F6FABAA66804C2F2B0186ED1F53ED1ED3119C539423A2BBD4C311D6158249517C6FB" + "F6C45C76CC21235C90661009C7BA10DEE4860021FE197A6820", + "7ABFDE371AAD3DBB05FE52369FCB1841472B22179C908252728AD5DA7EE5C3C6532F1619E3D6" + "8C332D2B8C731079E80498556DCBADA84BEF0863FE056825AE28E155A5EFAEDB98543C157E10" + "F3B4CCCB7D80CD45F31848333A4A9605F6E3EEB808396861338BBA03C57A8C55D4CE0B8DC4CB" + "128F9705109229234657C8BA276E99C658C4B9EC147DE26FE88F7C293C8CB1CEF288B20668C8" + "102915164B8F45F16218376D5DD48BD8766EE61344996D5508293DEC65626CD0F75B9334EB67" + "5A3C5A53D18789BEE5FBB306B917F5503AF62A6357E73D641F2C9BB81A73D0ECC4DB57359F8F" + "5B6F99F205015788CD2828CAF78B534B2905351358E5C253DF95898B315616CBC4756BF9ACD3" + "88CADC54FF347FD9B65EFD4D6608762EA3821D3878EA9491F5C2D4DEEDDA6C1BB2782D8B83A2" + "BBF75170746D0793760D96EDDECAD0EBE24A55C7872E10715D1B8419ACAFDE9B66FF8B3FCA8E" + "D4C472CD67F5AB88F4DA1AA334646A7EF290E9C6B22B282534B2B47BD4C5052CC47AA02813E6" + "7DB6BC7E6B3AB6C8CDC2F39607764D3E09AF39FAB1951BD702ABFA27583377E9DF647862F296" + "8F16B9B5CB3276BBC2CD91A98DEF25042AADA648B219DD9B86F44AEEADBB0611A3E8BC749A2A" + "250204C598134453DCE34C4F250FBC45FD91EF8A0DE748C698E65DB91744FA98B1251242283A" + "7C5234C8EC741CCAEA8C57A8F01774732185A704075DF1DBE81A549733048633E8ACC06FB4CC" + "CB73C21FAA0F0A8676DD7DE96AA1C51D6905A81FF1843DF4856D74EDAA864805E782338C752D" + "330C5AF1E61A3D3298F0E9DF96EAD4539290424E7A113538A08634FE5B129FE8376F2D563B1E" + "FF57B88E27A3FC2E4CA5AC545C15708448D29C32E88E21680AAEDD4ECE1AE2232C5FDCB16D30" + "0C348A5AFF59A09F24BE69810FD9BC0A4C33B3C6C0F803E03B9E93A0CF097412863F1F774BC6" + "07F6E83E6087348DA48282261B3C286EEF819E0BF503F93B94518B83212A1B50619199343756" + "B5BC2CBED7E2595194BC972516FDD5F478A2602F068F217689A2D66FAFD23C85753350602E94" + "C382BE6AEE322674B87E849064B9C1CBC4D24AE8C697D1806FAE14A2DC6578C2C532E74F5449" + "5C97EA593A9FDEEF87EA6F0B874FAB45BD2AC017FEF41306A8E77347E626D769253CF56BED3E" + "421BFAAB40F2878DDEBD3E7B37BEB2FF99C3D0D70683EB731E02540CCDBA56DA481C60077542" + "868434D08843127A8CF4BB57A78119CD87F4A6CBFC0C6D631D910F570674DEF1B552C3C4643E" + "ADF41B1E01A49FEE2AF031B87C7070FE6F8123B1B2638E241F14A37B25F8EDE02A22A03DB8FD" + "26F62947C1238E326C6E240FB3F87071F0EC607AA3BFC92C03C6C17DABE1311E1A556C7BD973" + "0757844DC635B181FE9B297F0D9CC40F2F56E9798AF246108859610B0A15770031C092DB52ED" + "99815203C676BE0B07585E1CCFFA6BEF66F3E5EBDD8F0A7816AAFEC213E5BEB579E524B75B23" + "3F167738AB06417BFF401AA5ED16AF970E87B2BF0FBBDFCAE4D2BF49D49157973A651B18F531" + "DA2943AFB00C5F4B18BA92591E9C1CE930490BF0E9732263BAB3EA0E194BA03056657509E25F" + "AFB35A2C8B74278B07A03228F17D5DFB452749E94C54D23F5BE9A1ED6B576164CC4C3056C2A4" + "260E8C514EE4FE057E83CC0FBBB0A1E6C3220A092D89670833E0BB7F031E9777C7E30A417487" + "982E4BCEE03E00F81B1E6E619281ECDF840CB3E927C82CD7FAD289618065B469DFD1A6223AC3" + "9B95DBAA80B42388BA61CA5891087541D151AD2993A1FE2F20", + "BF8D8F13275FA5208520C999AA748B8ACF5724CEC0A33D74ACBE24FDF3EE13C2CB76F613CE6A" + "63C4431695B73CFE16ECE3C7C6DC896DC3682CF099DBD379B4DF8F8A8E45B0F71A4A5202E9A8" + "BAD0B68FB183590D1CAFA3F4AA8B1C6F5F643272C74B5854E9223B19EA6B0CEB65CE7BF714EC" + "2EC8177D4949C3D8604EDD59C6071A3E0CA51D9FBBEB261B80EB2AC9C32BD9595216BD488109" + "EB32391B5C478B294B7467599D520A7C4D0ADF3680F3679613AEE5EE9AFBEB87236A804F603A" + "65A41BFFD59339CFA08C75ED13874B3E631CE2F3955753C7C1E889C145CE87EA06A221E4C5FF" + "62EA80EB1404E055385A8F215A70385C0507488716CAA62E1E193A391AA10324F9FA49D62232" + "9C291F0A21E13F10888E9FA1175B5F97787BA7EB6BA217E5C44423F21E1143E250E53111AE49" + "7E7C93021562717261E1D1954DA3844B8280E870396A13C56872A81C80A35C055D1BFE8C9E11" + "15815F85CE8A0E445E0F8F2BAAA73D1CE319F34B8722DEB8C417CE7326AFFF609699701BC805" + "5B13875F7D65DE9DD721A79B3C05B3ED42C8F9412AE66B98BB4A534788EB6271335E42044AF5" + "A12A6A6F530E4D535C0761935F77E6E294C1F163818E6AEDC8186F0E4A4AFBA04DD0DCA3BF79" + "CE9B5CC3595E6371125CA86B4B8D39309BEBD8E34554BF17D4E2C26B0637C5B42D74565D0129" + "4963BC36894547C7ECB67B2F6E643CD05B0EDA44ED8F8F1CDDA1FCF3B6A5A3088F1959CF21BD" + "BB4D0F21DF3EFC91F4D4BAF3140DCC93ABCD4744B956664C12841297EB9323C6C7F7E18E47BB" + "FC39DE8993FD531432EF3D28486EAEECA67FCF6D4342EAFF9EC365B061FE2AC5054E5E5A3218" + "1B8221254D6DAA7024A51E51EC43BB668701E5A27C93E91FA21377F85C97D9A807AFC3B3ED39" + "0CFDE7250B53A20AA912FFC41D5E4D43070418B43A00CA75E64B40AD0A3AB7F516FFEAE13357" + "118C65E7DAA012CE9BF198FAA7BEFEE1FE049A79219666A90F20C50249A140FF2796B3F6662D" + "DB7D321A68F430EB32580C438C7E88E2893092B7BDEAF792DB5C8CE4E89649359C29C7C68396" + "5AAAFC013C12F0956DF05DB002E7B3BD9E1EF833F4469D879A090954486C3C39DF8F8D093628" + "171FF8DE08635DB97834A57159D094EF41FC53D8ABD14069A93BD08E87D1B9C64CD327F85125" + "F7DF36597246198BFCBDD7D258984219EE819A8FB627E06704D80262884D6ABDAFE06BE15996" + "4340CD599A1ECE20FBA732F8F92B55C01458A47728730B7D3E20DA932A2D5C2355E50421A30D" + "B6B2B7C936A6F05717E29AACA3F47507B2B649F6A6B6D862C21053D5621D5A2A64AD823E5F68" + "670A77128D1401D56A4F8FA672EF8239BC2CCD59816134CD43EB03FADEAB5908A3200D907303" + "F236F8ACC0BBCC210C8D25F5DE9FE8CC31274D367DF7D2450FF2659931CEC5F0B885EE4ACB01" + "45EA8DE51FC17B9485CD4752960F4EDD63083D8FFC740A364858F8FDCE1E1B091548482CF0DC" + "B117E60FBC3CDEE6F3A006DD07DB5487A41E401FAAAD34E0B1F1CA1CD649348B93989D6DA4F7" + "ABDEF6A48648A388BF18E1180D266B86178B2C265F6DDA3337E6B4F27F8142C9205182784AB3" + "34C24F2C903FC3BFBEF2AF8CC7ECB9A402ADF3D318C4756643ABFFB457F6AE285A816933D729" + "802E168C107061593D5C11FFA44AA822E5685273DF984E5BE6E1FAF00ACDF49D0FF76422FC4B" + "E49F22D3C070B36EE11BC53C5292072ADB59524220EC0C262D3D395051AA3FC306D361BCFFAB" + "A1615B79FF329BBABB090A5E7BA614655FE4C8BDCE1FEEF138", + "FA120776BE05BFC2DA1D3CF3798BB3C26D47B205A30E14C7C72E8E688521272DBF7C5452DC34" + "F696CE2CE0303EEF271860E54B58811FDC642DE0F694DA6E74FC374A0606065C3A61DE1BA252" + "64C331DB21F5D048F0DB08AA9412724C790363F82B4E12BF7ECAB40C2740D837C2F3FACEEDD2" + "80566A7B25B0E437FD2BACD82741B936D25880B65982A95B8163F8B12258F8663F374CF57CEC" + "C3D386AFF9CB593CEDD49B2E9B1377C9F7B0313FC99DEB4B217EC1E79371C205AB0D38D24E43" + "08E844B8BA8CAD9DC881306243DB6AACE8C0B374D7EE8B6D008A6894069E23079911E8CF7FD8" + "EF23CB4445E2532DF30E6B0C122AF86A2AA631CB98965927459055B36A8268B9269A4674E319" + "551587D5120C359C33ED3291E888B4F13DC6FFBCC5E22678311E580A4594402DB45DFACBB340" + "C5CD55B6F091832044EE6D4C57474885C4309C92C72C356810E3B279E0DFA134B5EE64FF2303" + "7BE4FBB2365D364AEDCF26B4E7FD5872F0CDCFABCCBB3F1987C6912347F1A076A550669B4046" + "92DB2760B906CD752FFB29C36937959A8052EDDCD7F3D0FB06C0B90C0B54DFBF521CB507F1B0" + "278C93920A554436C3C482EBE136E330C99291761EE1970E98181814BB0FCB9D96CA5BC1ED09" + "8EFE2046B4A9C186393DDF0301CD1CDA5BCB0ED28A8FBF6D392128459C5D38F8CA1C31681378" + "AD90F37467B3CF2E16D0FF681F5BB81217E6B2DD417E5939891BB6E598C96E04D6BFAAA20BE5" + "D7800903AA4CD5CF47395A70F77D25519031A440A983A90C2E91988A2E6BAC75D554BF414672" + "D7D3FE2B6A07026C7EEC1F50E0C99FC750B7AD65FDA0DACFE159055AEF8EB0DA560E545950E1" + "C2E7818D49E5E0856200E66DAEB977DA7F1412B802A875C581A40CA27040BA0952ED4B7A95BA" + "592F61F2C7949F8A39777950984779BD8BECF07DB53428D3B018B7F3D461D2D032C0E29D4CCF" + "88A9DB2445687A8CA1207C5A978B6527731B9BA21CFB5404E738760EA8C48831FE1B01FB5C08" + "FEB7E5A0C45C10D9814ABDBD9F59CE9E7EF790C6CF9F5F54F327864CA0C40BA497AC496F68C7" + "10AA39F45A35268DBEF0572D959F98710CB4F183482EB799E2B38467DAF4BF7B47D094BE57C7" + "4A064E56B379A93D55BF5A673458191C40AEA16ADDB7F86E746E447597B9659E491DC2705F78" + "159E9DDFBBD964E302D0546E053031B159CCB290F0F6761837A7B1F52CB7EB91223FB3B7467F" + "B93CA3FF5122CCA7481784D5EA691A29B58D26DC856FB509DB258D6CA2C4B2BD590F4097299A" + "2457FE29E4EFF3176E6FE2244EBF69A57C6F2F60C37378784A699CD46C606503B1505A063934" + "DEEFDDCBCD40F7D0721DC493CD34EF4D7113B173B0FF6DDAB42BA811C4C0D16732D7ED55E4AC" + "F66B539302971F53E9485F16F7E97ADF310E6A3CCF6BA0960C79698470CFCD4DA7507BED8B25" + "62D17CE2A84718B7B491AF492E811829930F267957D7CF9B184F7BF3CB9CD7CDEDEA940CD841" + "D1182D3F6BF881D6FC06C3FC608918AB8370E7390156F9C22ECEC67725368F4AD1F024298AF0" + "B51126DCA88F9995CA381A605A5C315E7F68C06E58A1656DF079BE8DECF710C854F774E28FC9" + "4F1A7C37A4D2ED4AF695BA5482E8107229812C0D1D70AA00EA4147F2DF74EBADB3380235083D" + "3C958C0F3A1C3854D1538352D86B8FBAD504D43F9AD82DFD35AF68571FCC983857C1BBF1B207" + "02B6A3FE5F5A731417E9555D71AEB3A288CC4BA184AE0CA8112C604C5525F77872D4E7179D59" + "92AE04800F5D3E822AAFEB5903B498CD3B6EC48CE4D3F415D8", + "C7466BDADD702B04099C1C759975659BBCB17223F668AACE43BC400543F044696627E2F08881" + "A56852B5924CB5E47975D883901F9A6AF5FF492898E3B4ADC8E47FBE09416EED5DB4EE6EA4E9" + "299F9B2A1F878EB701F217C15ED040ADBBC20C6E6D70EBFC440626034BC8ED6BC1663D3F74E4" + "20D53BDE210C822FEC860F6BEC3922B55C9CC3D94E6696C0072F9292E55E2A8E89A9CD3C4A2E" + "D02EFFDCA05BE0D465418A8D51F8F68C0E755A0B6E3010D1B6CA43A29D664D2198105A69B8F2" + "22DE219AA7194BB29B3345936E4704BA88C47C108371810B7AB447B35770AD303A4966F07883" + "66919226677B997D17F5675EF37B3DEB9ABFA2FA677B999126259B04783D9A497032D43BAB37" + "88B57B42063B0420F88C45748389DB268B3365374A63956611ED113C765968206612C99AE517" + "094DB62C2031DB416AB9C0C5B87E2AC5460A98AC1F6814EFFDD02DD148F2CE5645C551EA9D25" + "27D3800DA599CA6F0CE4EAB51270DF5BC184DFD104C211EF72AC109CBBF2F19A0F5ADC4F4B01" + "918088FF5C3AD9D8C10F76D4082DEA0FA13E03B5C787E15367E6525C95D9DCB6EADDDA0A41F7" + "F89C4ED4B71C64524BFEBD5967E027046EBA789EB4C926B5285A9604443D1F919A58883F0A80" + "08F709CD5459BF113A34F7669ABA66B8E0E64083503AED6F598B8DE8BFA3B55F8230BA0BCE7F" + "C1B39E6FFFC7D73EC6B8CEBEA6CD3B7B44B961EE936D22A378BF47D156CC959D5EC0E89EAC14" + "2CA9FB152EAB3B85E1D1E75811448EA783974F2BAA7B6CD58184F08E7EE8A450027B69062734" + "A476675979A97C035BBD0DE3448640F83465C40D29ABBC0042A3E264383D273CB2A5A28CF381" + "4FCBDAE49C13A6ED148E71018FC76F8F33BBC7D3D8973FC2864CF496D9D51407B28E72090275" + "BFEB081FA89F54F275812F1BD5067CC779C270170812F4AB41BF5C5355444DD6C82BB6919805" + "6D918DFAE321B1F9B9EDEDE589203573BA1835AF14BB9289A429ED86F5A08D3E506E68FCC3EB" + "35069AF87FD0006EFBD4D936A59EB666AEB127A34C3CC3151B92DAEBE8EB05220A65150A9584" + "0CD43F7DD21696CF5BA59FA6F0A040A401BA328144D63033A3FBC18BB378D5375F3A2BC17971" + "99A705C4610C0AB3864EAD06A2BA25DEC90CF8DF624C21A35FF551B5F0D3DBAEB65F78EFDD17" + "D6D22334870E6C37B1C3B560B55DC71FAA274D8146422036A3D1E1B62CCEBBDFEF498CDAC346" + "55B974BDF26AC23E21AB27DE974ED53161AD98C97BFDEEB99A36C3C5E2B602213140D9722AFC" + "71DD568356E1C6F61B3870966225B5F45DFB8F7D36BAEDE587D6C557FD62C219237D8F9849BD" + "D22EA2B05AB930E6A8184311D072CCC74F41EA2E7D76558F66E8C1EFE2E606359140A62EC012" + "810287B2FCD2ED79B4B425DF7E159810D4A854532822506B8BEBADA4EC54619E1962F246BAB3" + "36BCD2B64D95EFBB0005FF0FACB0566BE19F8B3B053E5882D7B0DBCA12C8A4EE947AD60C2EE7" + "560248D3DBDBCECFC6C263AFD8C4DB500CC4B6EA09B5D91155651D7EC16A97A408740721CF71" + "9F3055EC7A40D727957C8AFC086BFED720482738A6F01455CDB4979930A1FE748DE5F1EEE678" + "FB71F8C04738945BB2E41C93ADE9F940E798A2D2A69E725E0E1323E2A1001EEACA5811D3160F" + "81309163D85EED601F4ACF4D7337129672304B6F2005128BBF388790C0D59B6F2AEA7974E0F2" + "B891440D73C5C3D0EE6ABA546FCA9A141ABC8B81BD5CD499B545F17E8F62A25B64BBC34E916F" + "6E59B2BEB98EB1BE75F1FFFB3CE6C1FF39E82E8620FD56E2FC", + "A0ABF026E08A631CF185A2B12DAF9F3D94EB70D00174CE9835405D16E0B24FE0A8B6988192DD" + "FA397965728598A2594EEC5EFF6FC66296F79CB53B0D11BCFCD40DD609C81BA5E23B449EE38F" + "A96089EBA073BB4E988A56105FBB10E08B00B658853DFAB9F47E5ED179C8381C800077797D21" + "86F6ED80EC7573BB2D4D3C448BD5412BB46C48DCFAB500827F36D57C28A2F93B2297EBFA949D" + "648BB4E3F143954EA77E48B0C41D49318D3BD27F97E4D3DE722084CC67CE35B760F4C33A3C09" + "7784A18759F80C26EA5B47A189E39A9F6469E91810E834A61338E30B135CA8E1407266745700" + "3D59909ACB60232164D879CBD8870F03FDD35E2965E075742CAA56F256444240A6BBFEA4F306" + "89E92473EE699CC97D2DC9D2F6DF5249E844A52D9592F32525A0793ADDBE64261E2D9E6CCAE4" + "3A4E225FA9E703106BA5B9BF67B5B57ECA4F1C79CB7340714F876B9AAF5325EE6582FBA49CAD" + "BC5FB5C274338D4F3E0A492507CF2B1CC2E43ADFA3DB53925DF41A677A4CAF559D6E1F28E82C" + "ED39E38F2537EADADE6FD9DA5D608C0E795FA44725C27533679B47864267DBB5C9E05A4A4CF4" + "9A9B4A52217924AFB6F4B93B4BE93399677CE24979160CF257FDD650242226A4F6A55342EAE0" + "7A6947ACBBFC0F0E11BD39E1B2684C406D359099ABC00EA2E664E0287153AC8D0C71CC8652C1" + "70818979626F959C79185E2DA5764301F9AE18521EE903C5CC32F06EDAC73E63321044E7BCB2" + "7E9FE4BDCB18C92B8230D127EE572A9C28FC72DD126B9295FD7E944DC9F45143EAB6CFE4100A" + "D5F3B12362DD482ABD1223CB2B4DDCEAE3701B76F6184BE9EEE0001381C139E8B7A7E2F9D5FB" + "CA11A6D00D10708DDFA086A511972DDCE05D7910695F1C77922DC47A5D813906BB02B3F3D88B" + "0DCAD39EF694663F6FF7A37729A4519A14EA69E9C5FBB4981196D1507F24D0768BA02AC19732" + "E800B0ED729BCF9F5B48D45A18F38C65107640FD5051DAED8243BF2D88AD05E79197C30D99E5" + "F88A2D0CF5A58B8CCFDD41E9C978CCBA5380C322EE17013C6FD9056CA0244CD821E7087F5ECA" + "8F418DFF7266C1D75EB2F03197B84A0A31C62938998F7809163132F939B92E1C404D336511D2" + "7FF2A4916D4F52BB524E517B5E5E3C7D7C8E16592536D88985D74ED832FD40FCB0C56AFD4712" + "7E277A79B498AA16641D3C9504383AA03A5CD679D5E277864A0CA6A7C3496CF1BFA1824445E3" + "67EE3C0C800CB0B3887EB6BB03CE3641B76C05ABCCC288CB1DA9A97C7FE12317CCAA87D180FC" + "E1C43CDD0D6F16F605DABA1B56AE74704AF8697CFA1FBB60A83B3A55CBFFA1DF434FB5546FFF" + "0E65F7AE3A019451C001B957C7AF43A33718052312D978A8441305473DAF887F34126F91FC1A" + "DC7F33E06FEC0F99FC76B07F13EC9059FC23EB79C54190442A3D3691894031D98B85EBC7D53B" + "0007145300B8EBDF4CE1FFEC555BE585F70BFFA754B9B82A0DBBF0BE7D2C3EA41C5CEAD5B0BA" + "B740DED1ED617678470E7E0317C2AA67D1890FFC7D2B2B71A6228667AB406DDB04D8E781BADA" + "FC239A1A60026078EFCD8F4444830BFB1E6D2587CACA60A4C3DC8F573CD674B80AB838415279" + "704CD0AA325B3CBDC8FC91C57EAD461A7E057E9836E5D7432236D94934D0E27D7C78F4F5BD14" + "E495BA95E56D124A9FFC97114D99640470E93B393E9918D1203DE3323928C718A0A43BD3181E" + "9AF5D706CC9DFF6305E2A6F5FC21CF083664480A6D4137EC7901D0EE89860394BA663D272F05" + "77E663A34B5E6168A23F4F336187D313CF416A2369FB84836C", + "DB5E9C03F8219D0C53B88DCC4B7C8D7DE73D24D180095699862D20DA2F54C5A9B17CF2A160B9" + "DC9CD834B98D608C016774770CB7BAA8E657349B9A8CC9746A2B44F853D556A40BE55A0ED43A" + "AF3F18A882D0756035EDCBBCA6A9D815D84BAAF9517DB93925371B495D3DEFE334A253FA4DF1" + "80AB7DB1F51892F70206BE0E0FCE7ECD5632866FA35F81E56F71B2DF6066B60173C943FC2DFE" + "5681E88EAEA92645232DBE8D1A9AE317F78B0C8AE3C7EC8963C627128FC67D4C5B13FE74FFE4" + "D2E999278229DD01798E4339B6A940A8341F83B87B667D4CD07BE92188FC98F32EDFF468A039" + "10ADAEAF61ABF0BAF649F9540A6CAA51C69C685B0B2F9CECFDA3CFD767603CE23F717A0651CA" + "1CD4806F640565285A6FD114AA56B7B1ECEC25627BA20CE9F4A4B3E6103C2B1502FDC8A71232" + "741DCDC6655679A65F6036F7C9936DD76A0015BAEDB264FBDB01BE99679AA998ECEE0B931239" + "44EFD02A350F0219F3494BE5CC117791A90DCDE37B5A954A22FD968529A809BD804ACE14E298" + "17A3BF11CF01B9BAFCF16FCDCE7D3436858E58E2954D940AA7E49BD743F561BD5D6D42270145" + "8BFEDD33C64FC46125F782CCAF99B787707E0B0540A55B67309C67A02EE510792665D2C9FFCB" + "9FF2368CAF98FC523918F1A44DF8F1D44C347BFA31D6562C5F6D312899255D5C45E05A9FED0F" + "F0A4F3A01B5981BED363BDA9E07EB17D98531AACDF9CFC1C1F58103BD2462BE36FB54063EC97" + "F2914B31FDEF2EA4B63B2927276FA2A7D57486EA06E5594F74EDEB01AB82D045463F3D570ADC" + "16A9F4095AAAF287C8B5158BA4CC56764B3A99C5577B4C3B8BB9A00C41AC674B06CE4EE741A1" + "53CFA36568CABD16C12D18665AA40062C92F39EFAC4FB48CEC47728C2E6107F00E5EB6CB679F" + "7F24F0B7F5059C3B4D90573F1C6EE5F677431346AC97B1B6B35BE847B730ABDF3834BFD72267" + "C18BDBD1088228E12FD3DF40B654DA60F243B9865D1200C0E4B21920D407D0B00B7BF054C6E0" + "1B9E746A5CFF0790F2D58FC2742364E0FE341B32B30C20E0631A61393C57BAA425A5E8999D6A" + "1FD70D8540F923464A67D87CAB888228C15EA6DFE36744DFFD3C2BDEF6DEB27F39AB802CBE09" + "DC03546660B923D2E0E18CCDB4C498B3A0AAE3AB16FBE3DB8DEA0860CEEBA0E07C609A3F20F1" + "550EF1CED68D24EBBFA2B726EDB86C644F0D1B56FFFB69069506A278D131423BED5782545BE4" + "D773E9AC304118D2C9C840EA4D73E7BA34AA30B9E0C4626645E9D1D3EE5D393A3A1A99F01CC6" + "04C7BDF860E97AAF443BCBB700406B14328FC5FAA4E0D2842F030521642487023E0EF51A31A1" + "9A624F0525DAD089ADE1125752443DAC885ADD25079232CC2C62C57B83E207092134250607A1" + "0A58392AFD1F8A6146B010076E9EE117AAF4B830FDEF190319C07CCAD2E2E4E5D3BE5C5CBD13" + "3231183CE862A962EF3E7592B8109C9A58C41061ACBE77593ED1520F55BEE2146458F22B054B" + "04B6FFFB56C5879131B0EDBB276A2FEEB9258B5B9C7B85547827E2C831F0382EBB983082BD8E" + "DE3EFB46AE3AA82E68C9196D998C383A5E24E833315601DC83E9A00EACE7F26BDB7BDEA1E5FF" + "D917363FDB2BD418A2088EA9F0DF32931624F8150D875FC2B5CCC8BD2D212AEF51E4E432C630" + "3821866A66C163F8393621721F8D5A784F07F9D2B173CEC03B19507EF680685F015824C26938" + "180245D30CEE127832D9536817DE5FA438A208845EDE8C1F32275FE960E7DEA8676F10BED66B" + "6C6F49AB164617737D3BB1C7E7504D96E1CD057F687927F7CC", + "05D1401791D0BC222895778747D57F4EE8A3ABF01364DA38A6D4A5433D19FA972C8AABC4808B" + "CF801A2E7B1BCB789802E80D85207A1F3A150487F145F5C80E0911D57A46918729B644041B29" + "16A0B39716A0FC8D7C14F707C2B3C43812E89C98F900521B7964C681B13842169910DEF3EC2E" + "97D629B6AC2BF7FEAD100BC2B65126EF669AA734E8996FE7B6C527DD58B23ED02172A9FD356B" + "C5B8C39E2F5F73989B2CA30B66DCEE9AE34F23CD0071B4F5CF8A14111310B6CC7A918619E86F" + "27AD3EBE13D4FCE07825955E17A06B016D19585660616592D6EE9E78B50F4187C88C3219B55A" + "660773064459F958EAD6E1D4ABD0D55D5D2CEA5FCEAE3F2C2591F5629A72E7D009AF69718219" + "EBDAE5A0CE25AA537B5A132B57CA6F17F21BC1881F061181519214FD4CDEA65974261F4DC6BB" + "F625DFB49C78A73ECC913C1C199C99B0757451AFC5E1716B0AFEB7FDE32479207ED55B65BEA9" + "A2915D7ABCD8271C720D9EAF5D44A2CABED36D55BF024F1263DFF6BFA86B4743D1FAC5175706" + "CC9CCC1C1E4499BE728F1C96FDD237EEB1D97C32174D32BD995F9424C540C4307C08C1EC27F4" + "7B29F56A642D6F652AD23982D3ADEBCC20C74B7AC805F3A72CA357C4D21A7E3AB9FD2B9A5D5D" + "5585EA95C3B5AB8D4FCD11306770332D56CC261889F0C178568F3CBBB5A4D34303350D4C5B40" + "6B02F43D54D20F039F95E43EBE5AF27B0BCC30C4AF19B68464441428F9D796C70059E27963AC" + "BB9DB368629A6C8CE77D7A3CE18ED1EB565FCAA74205BE268D5DF251B6F3FB4C8B9672ACB37B" + "B24536A1E8045ABFF7EA1AB6CA35F4BA1BE7BD844CB4210E46C0B1934F6C25004F8C9C8BA40E" + "11E6A1F077941F589F82B474E682B44A6C101136CA70C4B12F55C4483809D7D147F090542E7C" + "2F0250D80BA00C8F69EC6F3A2C00F9E88091EAA89A74AFCC5E615295B28E2D936407EAE28BB9" + "7F55F170F7548A221E85C4F40145D015EBC5889AB2F91EF860D13D8ABFD3A6D531C45F290C42" + "ECD37789ABE4F94A6CA294BF92B6D9CF1CA13354D673AE0483471AE5EDB28A8958891C9088C5" + "8E6CEC26A5B587CC09A307B466594D75E12582E6C85A379C6923F7FF953CD825DF9881DD99EF" + "44347E3B741FD2E0F19C92FCF286CB8390A7707D5FA6F64D5F5C3FC3164F300E37724714F7A0" + "EB856211FC6D66117B8DC22404E1A0B948FB53FE15F887529517575CF9FBC743F486C82BDABF" + "0AB6226A8F7E4918488FC4F77B5FE8E318C6C384DD79C753007EA9D5ED8A1A56CCFBA3A3BCA7" + "AC617B82248B0CD38A42A10A3361BD59C03459AB613D18A21B0740DDA18EE6D7B0E6D7EDA7A2" + "94B06101C5E44DAEDE92DC5F8C62FC50E4CC08BDB051C1F37C7762F4C3744268D35EFC8BAA44" + "63A95C62255D13F7ACB16422EC32F46EE3ECF838A0DBD1033270A3F4631FA3B497B75B227A38" + "0860D2945E5B7EB670DEB677185BB02E0D84518BC86D59A2C039ABD86CC50854251CB30D1244" + "1DE8635E53DC5C5DF336A5851B7AB957E00CAE39EBB21C36318C717FADEEF23F11218927EF15" + "6446D50FD5BD413612FC2E3DF9F3AEAE8A94AE11FA87FCADF129D0587202443B1DE8866B63F8" + "846A1D745EF28E24EEC700CF268C3FC3AFAB26F65FABE0EE509C1D3614F3F49398F074BF82ED" + "C7E2C22F799BB8119FBA41B3CA9FFEFC49639EC5A136741A487AEB29A662DE0C59033E1ADA56" + "4373671A3110938911A91514DB7A758E2C12075CE6B2ACC8538F39B6D49FD294536529F27D59" + "1EECB37423094FA238CAB65CBFD51BC8B061F789F4D5911A3C", + "8F2369343868A8039CB963B67B975346981978AC5114E14D2FEFCAE5C3CA2FB2FFEFA429CBE2" + "8FD6360C5069909871930176FA294A73B2A89E4A779F8566CFC079A60DF60C6A1ACC641660FE" + "3B5782F8D3DB4B92F0C841BCC275D445F309DDCE46EE349191469AE439F043E30A2BC37F7C0E" + "9CBE99080E582293AF5A9BBEBC7C610AAE8484652FC5BA19FB634240028DA30A67497C635CE7" + "5E672A57E1B4FAA360E87A8E1EC8F71D1BA394835EE29AF5F79023BDB760FC93917A5FEF82DE" + "C4E950E2CA22FA53DB632677C4D988EC1EB5836CD95BB427576A229391B93996E1BA2A343A7A" + "4B1AFA711B3DD315BDF34F1FAB287665B37D5BDFA08DD2448E31DFBDE663544C0C915C26CD55" + "4A1268E5BAD0C6705AC82C63C379DE5FC422513561D03E5D1AC0DB62F2B96A2CAC8F954A1446" + "E74344428E8FAAFA4B20306461E181DE6A5E01F394A578577A6C340D56A829A8F853479BAFE0" + "C5C9E77C0CE1C554BB2A33F4C4A66692FB63ECFD4AF3D7FF6E10876FFEBCF52BF37C6DF49666" + "5232FCC54DD2AA387303EE793A307F5D9E2CA1F1594156AB02C365EEA1EA529CF807A567B818" + "786260C04D25F55F1714222C2E7622852A9F13534569D4F46DB0358BA7C0B86AC8A4423FA7B9" + "EC3C634135A0E630B5DA7164852AAB3643A8930322AC667BDFB8C71224BB105FBDABECDA66E1" + "4D5F8F2CFBDA8CBBCD88E5F58D25E5C2C545D87699C9D89C94456EAE42DDA9B36C1AD7837119" + "B23EE64C6DBCA5F4453470A97237B41F7FA5E89C93F06EDBDC409EFAF59477AC129C5D8B8EF1" + "378715E1706C55F2D87EA54E67AE73AC63E92E650C5B1400242C6DF985DA3F4A621217550863" + "E3D7DD95AF5C9441A7010997D39703EFEC3D450C7C20F9C27596289892C776273BB90CFA22BA" + "E433D82130F49D2DBCB1F41EADC7F066826335856306FB0659E03F366A1F9EE5279154DCE529" + "45F6E80C98E1909960A306C6BF147D39425F7FF4DF453C3A753F7F4B287288A351E981962CAE" + "9DE6DC69D39C015161C2C96C4F1DD1211B81785E449E334FD152437B47F24010DEA639D1DC3E" + "AF5645B4451DE6A8D5A326964CC464F745FF7EDA370CFEB228EB163C90556921B42C83CE7730" + "7AC91C7F33AA08F3889B4B45BD9D8B9B388E1935F0478E34B72D7EA8D57BAD18005134023930" + "A0B8303970682DB86C881AAF8D6FDFE07D9F3FB3A034B888AA51B894C6F61F54131DBF60AA74" + "DA0056A1189AFA11FA34E4D9B39FA9FF06CB3383C1D7BF500BA4C77A0606C4FDBE40034EABA1" + "4A0C3360E7B47882221C36D7ED029A6C38059DCD5ECA592ED1B6021B6B34B1AF6E44437244A8" + "09BFC67A85C6FE5DEEEB089F3B4DCBB7E51CE23415A9C567C233E4B076253CAF7F43B96941C6" + "8F042CC10457B48C97597CD7A325E81FA26C1D0921706C8BF02F498BD67D35D2625BD4410668" + "41E2C7052D3B85FDEA7948DC1A4F9887CD472B50588E714FDBA765B9F221AEEF74FEC742BCC7" + "FB202A449D8444EDEB1A59ADB000DB16E934A6F5677340386CB2816FD6D87088823C5BCE0D98" + "60A50BAAE58004FB7E46C0C0BDC64BA015FBD7078399A6C1FF2BF39B364E58BF10BEB2310AD4" + "00B65CAA0DFB719055F0DEC6523B14AA223A580B9BF9F37C0FF7ED63EAB0226C3B682C1D3818" + "3A0A193880591400316BBD562AFD69DA58E3C41F5930E239B3A3737B45A5B2239E20AB99FC71" + "26BC19DCE782685B092D541278D1AE289AFE61D8B6FDFF45DE4C4664D2C98B562ACF71445B44" + "D5EAF8771738CAF610049FC5BD849517E598F244F43D03B108", + "8A3B901C7AEC2CC8E2E350FB914438D5A8C70A9EB569295227A52F75FA2341074F6A59570D16" + "15335C537D89777C1968BA7E5D922D22568F7C9BC925B7D379841C9C510184C45738E4FEA3EF" + "2FA10D81C19DD6F0BC3544D36F21044B5926798734B8A7576438003FE017F6808B22044AA667" + "AD3E65CA14D4226958272B7ECF3D06F4972E2C6D49101D6E668F8FD5CA211FBCDAF92EEAC3FB" + "051F556B2860E539571FD3013FB2E6A75F75007AD9F0B56A31BA1DFA05E3AB248FC554CB244B" + "D7F315091A02B5C870E25F5EE0635EA4B17178A8DA206A1BACCDF0B2687D6C44049A1491261D" + "D40C9540DC2D54BEFD96DDA014ED5D91FD23930A295B6F4ED19330612394A4D66F8DE4A132F0" + "3C2800945EFDD9D9C509B933ADB9D5D6FCD977D4BB577064EFA2C4B28C2CC55C2E207A3ECFA5" + "FDF3231C37BD37192C13D646E16EA1EE9FAB12183C904B4824F0612357E5DE15DA1D89AF20D2" + "63B2F7B0E3133EFE97CDF17811D0EA8CD0C5348D17DC983BAB74AFBA6CFDAEAE76D73276428E" + "6E6EFDE8A40050F03D32149EC7D9AC94A7121833262DCBDB6A51432712FE26EADCA016EDA6FD" + "F4AAD0EC0AA4C0AEE19224A1648088DAF859343ECCD76158116C547A3A3495EB181DEBE91C38" + "4EB5016242A33FAF48934CAA8FC493571E817EE176315AB43E6D7802BBEB959D37F2032FE3AA" + "729C18535AABE2837F0D5DD27D6CF7E2114EAFC7C599DAE0224AD8D1D3A4BD82F3CDFB53906A" + "5910ACA14E99F2D799954881134405BFA01FF000709BAB9474B38679926B488213DB2C8AB0F4" + "3DAEE60E06C217D3DF15FC9C73A88C860228E4E0867B2FB6924F64FBC5A912D126E9F9745A60" + "FBBA46FB28EB32A1A2C3AA695BCB820B117EBBD297912A525AB5E5438C56AC708A277C2B1D1C" + "4CD0DD78E0277145C5C98C8B9C3A608CC59DEAB41341CF49AF8686F36CFF251C540E292313B2" + "AF18BC682DFD0DCD168DCABDC7BC9EEF51B28F5D8A3F913591769D0D78824C91FDCDB72DFF83" + "5B4573A8771C49F5251A4A2A7D30D94223620849EA2132A219B0821ABC2BF7BF1179FCC7A8E1" + "EE5B84E9598E64BDE5BC21271C5ED2BE350F7A92F69C1CB7D4813010AA696C39F4D4972B971A" + "6C5C0980C3E5F3540D69F8F2AB029D413A44ED5CF08E57939A7078C742A218064E09850F6B40" + "0E46B362A2D73FF3AACE001DC673897BDFB0E6A7BF307ACD070EB0B6C96CA272BD62DF185BEE" + "3444778BED9305824C92C51E7AAE03A9EE3B772625BD7EE5270FD493BE5DD11DEF52FA576C78" + "7485EE24D111FCF32441443AECA94E2B17B1ABB55D127926D3780E557BC0E636DD59066B7FA1" + "A99339DB4009916D9D3731862C6027F8BFFE8FF2031A30C6765CDB44C8016DCE64CAC2FF6B30" + "4D5DB63381EF55380F65B24F245D56EAC6F46A394A9BAE114112679FC445923BD0970F1B752F" + "A57BDC45DD3EE495F87253BF5ED232776E3BCAE03AAF3C51A49920D064DBE8F711163BED0C7D" + "A35EB7229B49B686B87059AF067EF2B386FDEF48E731DC0039AAE7FE75A2A366B138016B7850" + "C839300C22A1718F072CE4F538879D5B912E415CA06AA78FCB581567D3E180C81D1B2C74EA74" + "9597CE1B4B2A84064095F69C1CB7A4AF78563EA5BD1C72421ED3DE9338CD4B90ED3BC38AF19F" + "CF447EF7EA1EAC2086CC22A6422BC9082362214D865F2A292C5257C91C770AE7516D60FFDA76" + "D9DFC499208F585CB744D644FE28DD78A6C57BBC9EF1DEA9D8B459D85FDA0B1E8C7AA6E4624A" + "38151C527F9B67B0B0FAC979C16416ABDCD198832E1CE898C8", + "F1AF76EBCC995C5326EC52D8417FD4090788832314992797E140D86EFB4D5FC75145B3C3A778" + "A82B54E9DC83C7E20793E881233449A1DA4EEBF917326A61FD84AC9497431522F738B0CADEF5" + "FA7B628782389181A6C276789202266726B35E4329889C9BD2E0B60774915D53C5F5E5802C12" + "2B1FD858E14EA274D34B65BD7329C62E9C6770E96EB7F15348C8E97C43D654FE0CFE9665D417" + "CA9BD0395769347547D6DF1892F18C2B064ED4256D62E861BAC2E5CBDBC29336B1EE466E2FF1" + "96C352B067427404475CBDA9C4C0EE6944B51C4C62D061BE11A210D0F4F81E92C47511168BE9" + "D68840559839D39755326753BDE09EBA338A7B220910BF7FC81DFEBF2E92C1D607ED37FFCA66" + "A56596D17F2AC8DF2ED9B74FB1354FE8B69A6A56653FFECB7E06B834974FD7FB813FEFD08904" + "4DE51CC5D7907BDCAE64CAAE9CB9C19AA02116B97D16888AE2349781F2F0B0845887D860B463" + "238AD229677032395BD3AE2202E42E60D4AC3698FF47662778D6CC943DBD3A7435D861746B6A" + "42B7260D4318F4918FB6BE2AE2C96EA9C0BD953E82BA6697F307F2A6BC23E971312CA8FED769" + "70EE639746394CEBDA6D2CB2E4572871A1BF8D4483401A7AFA3CABA892EE06D074BD9391194C" + "27ACD64E66440491E6E436581891C41E146DE5FAF7B530D1CEF44A8C2E9293521BF86564CE89" + "FD7725B85922CC48117C9E047E3C13B972AD4151EE5C3CD828AE3FAB2DF761B0287E9E49928C" + "4C111E0902BFE821B4A3764CA3A9933D76EF58F3A9F569533472993D2066EB63286BB7F7858B" + "83A6AB2DB70FE45DE75FA06098289390DE786496359CCDFEEC732D1E2579D7FEA62DA36978A5" + "BB5E7BF1F847034F5A33A5494A38BB67D7F899ACDAF57BBE5E7AFBC3DD6B446613B164E006CB" + "F44244F90FB4793E7CF19D019197B2835904EE192FC80E9ED28814D9EBC894D6B29C95229D42" + "6DC0632DE54EB5A5E2897CCD91DACF2B94054662B70FC9C4D1D58EADC602A14EB0EC4E614F55" + "B69899C143FC8088DCB424B6B99E8C54C291AFA390F4723BA2006422CD31D5DA52207DD769C4" + "62F322F6E6A1C34E84DABD90EF8068C89E151ECED052D969FCC193B2619A670A00DE0EFEE86F" + "793A03ECA587EDAD8C57C4468A685042A7F66C430C9B89FF0F8CCBF20669EDF1D28214FE5EC3" + "ACE451E6D114F07D7D667D709E6A29BA47BE0FCF4CA0802DA70F1718371116C81852280117B3" + "3D651D781C5BBBC27C5265C814C6D7AFF15F4E598B170DB0551065ECB22F8301D53A0E02EDD2" + "3B6D0F87C3E16DB8976E80E0B9570183E89A6F4C11541B61D1A334E5F51FEBD6C650274C947C" + "87BBB4703D714D799BD10028943026D111D831D1E1CB68020A65E7E0FBC4BB28ACF21D7CCD7D" + "7C1E5116CF144E6B86F4FE5082971F6F2CC09FA663E1FF23B261846CDFCA84142CA2C447D463" + "6B6FC34A6F80B93DEC2EFEE0F600A1CCB30C9B93067F2D369416E6F150F2262C03EE137AB642" + "E5870ACEDE899E8C472DD77C0894B7571966884C008BB89C5E138BEB12865462F33ADA485A76" + "22027F85073232DB55E50CE46E1AE50A80C76AE357164727E1DA8CC54053A9E6B713667D228F" + "4B5AE54F698C076C85728952729AD65227AF36502296F2E027E930EE4135829BD31301731E7C" + "F93C5BE13E44845FA6C00E4D1B90CC45AD7787BEBCF4FBBD5EB66B323FD7CDBA38A5254B98B5" + "E581C43F1FBCF5BB4A3D2D8B68CAFFD73D48F1699C6EFF667358D24C3CF6139228320C0BF5CF" + "744FE1DB69AACB83A343DFDBAC298DAECC0979329C59952D5C", + "92D696CE6C8513AD5D94D44A8AD9C40894FDD5417AFC39BD6F2666B35475F83BA74D8FF176ED" + "FA9C308D0EB9E888FD2DDA4158850618A872B97EEB7D7FE306888629E49745003367495210A0" + "CACF91EC55277792076074D5F123857C26BF2DEDDFAC9206504ED160DDFD6C868371B426CDC5" + "7D5E564DFC952345E27E6977D95C3291218080D8558D66137A5505AED2B243C0FCB901768CD6" + "70C8E463DB4A2BEADC2C8EF40B8B18AE58CFF37B0945A1306BCB9513C146A6916051ED7C00EF" + "0304E3170CAC8C7EDF7AA9DC44B0D18D91F01D320FC2FC708759560AC96E51992531051847DC" + "27EBA315F0355EAA648ABFA9631DC30EB25CDFF66473722FA987AD217934D46CE5FFEC491BFF" + "D39B15964F425AF0CAFA27671337FD9D26B861DC634AFEA8932ABD5607D462EBF21DF10C5046" + "524CC53B49A8354D70871FA1F8265C07C4D8C586911DCAAF7DBF189A98746390607B801F5BC5" + "0344B2B141E454E9EB0642D1486F67F98D3A8C68E817B89A1DABEA296DE31389873598B7404E" + "9F81E126A5BAD0552F643358D50D8080C244A61D4DF74B3F23D162549FD9353D5F51D9B216C7" + "60B09B5FDD8345B90530249AFDDBDA7EB21F50E247D597037024F772551BC4F9A98284254973" + "6600517493CA3088B063FF5F6BBF4EA70A8C30508D412DDA5F888BCEB858861CAFDBB747F8D9" + "72EE0FD71566B3327B5ECE1FAF4155DF948811CDA8E91594DD5AE4509B39B4B5A4C75B461CF9" + "8430FB4381ADA3B1954119BB8A46AB6FD7CC0AAFBCC8EC09322147FE6B15CF9B0517CECBE95E" + "293725FF62CC7E337B808FE00FD216794F72253E970CD969CDBD3E4D69AF11152CF9837F9C55" + "58C819D961CF690C7A0ABB1E66BF2B5C42A2B787ADE4064E5EFB88965F94E8027CB0531ED46D" + "6BC573D7ED8C14C30AA6AE1E59FECE08EDD0CB0334FF7BA371053371CEF2B6662313626C18E2" + "EA91F0B9403C7DBE8BCCB03B77811D768922ABEB3F62A3D20B3C4247B8CBF102F1CB979BA343" + "9D53B2ADC02858428B86514D27BDE54027006947AD4D7DD0F17874C2BF3A62558DD68750A592" + "B6BD0820F384AE5CFAD35D251C8070C7F418FCA90BEAFF6D0BD7076347E10F8AB0E367FAD18C" + "A633265A1EEE0861C8D7B48043215170487F50060DF08A29D9640A1384AEA435128814BDC48B" + "2F212BF93CF9A2D6F7F01068DB21827AE19E56ECD3543A2CE5EB12272A2574F7E79240D717D9" + "F656955ED2E21E419868BACA166000F7FDCF9B1E78AC7B2BBF95A5BDA779EE5BDA5A9FDD4DE3" + "51E78D9F3BFEF000668535D16198278474B7AA96A6F9BE8EB0249E7EF2EA454E448D7A7345C2" + "ACB376A79875E4184DB16080FEF6B459F3C9FD484F4D123BD281148AC257521C850269B94510" + "FB0600AFE120E8A84C2012DEB13861077785A64CC65318B5FE6C70D51F087E2C6E0EBD0B6FF5" + "7D0953F182FE30E0138A4BACB5F3A7521CF0410BD6D49A50AE16BB1AA465CFD432E1E8F0BBEB" + "2B5E29600E402A7BDE4B28A61D1421A1403B54DCAB9C2C5D9E9D38F408FD31DE2423CD04BC54" + "6FCD7D544916EB881EEDC0D33D17DBE3C029D0F895747183646C8C4666D4F738ECCA08EC5DEF" + "F2CC0D30BB710737F9A78756550C32831B7EBCEA3D6B62B78CA0D3E401729FA6911DF7A72602" + "7B5E1ED45423AD4FD6678DD505E3096F3869B98131AAA39FEC19F34A888F596B27CBDB3969B3" + "0E97CA44EF29E684BF007F101DECC7E3346FFA4EC947A97D373E8A0D9F3A8D67FE2844C90371" + "33DF55033EBF6D56251DD9882A98DC5B581C2DF0C219F3862C", + "A9334CA01ED8B6D4E8236EE8B071861D93301437E8FB79FAB494DFC53445B082335C69D80688" + "AB64167087150FAF81902C15458AE807331C273DAACA7C9B2F202C5F51894165C9E87BA18C0F" + "6D4B253FF92DB31E668DC66A527876662FAA51CFDAEE4F57E54C0189AF4CAEE93AAE8C0D3D96" + "6D59B00D80F671CB3B2C4B2559B598BC10C814C79F1BD8CF8311FC6025333140AA4189EA3FF2" + "35BB493C64796D156A66133DBFDD43773B94627AE6DC9B49010EB2C7961826C414B42818D06A" + "6FBEB1176711A6732E5F0C93A7D0E94385ED44A4EB673FF5EECA3C8DD6FBC78AD6B4D5AE7686" + "AD6480B2EC570217D5D41E8DE3A6767BAEFC32C71682702D3E7CF779F3E5A0720B471A61FBAE" + "F3732E3D8BC15D5F420751BA680935AB0B73AD596B5A8F1EFB5D89E29BBD7FE736B92915BD0E" + "14B85F2E4987D3A6732C4737446BEFB2B058C0A169411B20C34F1A6B840496C9DB3AF2314EE7" + "7615DFEDE64332B545B4F131E496ED627FE2BC8C12A81466652031FC460F98DEC7CF19409841" + "E8CD6CD52691A6E69C73780D806CD5B34DE5818BAAE4BBA997AC8C01953F5793BADF9C52AFA3" + "3370F252B31D8B33C66DA4FFE52695B7818C2EF0BC9D34148C57D1A027A6C9F29AADE721C667" + "00BA8D1541A04C0FAF854708734136A88B00DCB1D662086D11651FD9496AFCF6F8BF6140664D" + "C30C7068BBB620B95B68DBC0299664AF6610261C244511B90F3A701D4E9619574209F624DCA7" + "0654713CCC5741DC58720A09517F7AF65526C089E44444AAE4576C2F5292204A3C5394EF73FD" + "06EC28F9A5130367D02832F8E5F0DBBD61B44337E2C2852CE177CE41C709342EF7885313D1AE" + "4AD00BFFB64B68B145F6F6B2C3F7719C6FDDBC9119FA3EA0B7C453171F4E7875E6E7AC314455" + "62E0C26306DAB3273D2A53787C31D2D445B9D13B8286B71C05E117F2B342943F3409DB9FE4CA" + "D211E21D76BA66BCB42E0038D9A6FF10FF99D1BD8D35FBCB4C8E67926ADB34D40C14D271C751" + "A4E005827F543DEA19341DE36DAEF702DA63D4251FABA16FEDB4F95E9671CEB096A43704E840" + "0A99414B0446750222A3D8C1F4E98BCEBC529724E0DD260396361467D2D5BD672AC20F3BAA60" + "A0C6CBBFDDBB02ADA342E357A09C9F3A1AF738941B2C9F812D739F30DCE32B75EC58FE63CC83" + "5FAD6D46ABC35554B1D9C42ED4F4CBEB8165AD9AF332BCB9FB0751CDB2359E6935D0A1855969" + "8DF9479D6967575783DC028A9FE1873B9D9AA96EA815769559B9DCE187F951403BC1EAEAE696" + "B9E29FB1969AA1850BAC9679AC4DB38AE0DF9D3D4CCF59B5A681D7D32F2B74239B8D2AAAC3D5" + "62B6B5FAC133C67F1A37AED4C73B0CF9CEB481F934D8291CEF585CF93905EAC742C5B540DDBB" + "FDD363050655DCF04354E6BDAB4BE6286C69C064BB0724E94A3D73D1972F831BC54440AE6220" + "D2829950021720EC25690D738E697A9F2DB7F685D5F8A42BC65B40EF75B6C7B82C9857BC2AFE" + "41A007258AE38E4B28302B2CDB5649E67132D3DFACB1BD8B99FF08FF659B1C00742D3D665D6E" + "B847884B5327F9DB902CFC2942CD4FE887A038ED6141DC8B9DA22B4B8C3E1ECA54BCE4CD5B60" + "C6430746AA228C35E767AE1E72F8E8CA23ED057C5F98893DBBF6398EEFC34D6F6FA28D16D26D" + "FFD00B52758BC8CA11EF742C90E38273EE8734A14347ECC22D86BDDB0FA71F4C140BE6C0C8A5" + "9F143760BFCEF729CA3C5204494AF436EA2755222227910364AA6F5EFE8A90504E1A3B82EA33" + "3C8E2A60E53B246F9042EA986972F80E5CF09D88A224386408", + "9AFC270F133FD62F9A8981F882D05485AF9FD89C287D1DFA6706CC9E2968E052C03493D3768D" + "4001F4F29DEE17BF8C8C3B9714EFBA6CACC3CF7069D8EB439303ED86F1F500745D3653F2198D" + "192237B96272AEEF1721349A9EA387608430F8E57043193E4BF5C0CEAAB32C5E8508AE2F58C2" + "78E93A4EBC1DD25FA4B6EF9FA631BFAD0D52F168F04341716466E995B8E8C9A00988E89E2C05" + "45B2CD40D41D0E60156D420B3E9E1B47167B6ACD1F7FF6D7752E44CB2A08A5A7DD0FD5782453" + "3E869B96273E6498908936B7E1929EDAB7C593056314E5665142A104E0DE48CF245E33C60800" + "4EE81E245DC946B5FE3D14F0AFED251B61A5E806FC0D7BDCDBC079842EE77E293CCF80A02A3F" + "AB5A0861CD3A4CDAEDE7BD8CA0531BDE7B75B325CB386105AD5FC540501F33C947EE774219E0" + "3DB3BDEB03F6017A586D8A4B7F50F28BC7FAD6293BA24781772001063CC7A24F3127B0720854" + "28A66A728C6A0C9A3ED5B794987ED6C910919267CE469D9617CCA241EABF0BBE5A51054D3227" + "4AEEB6FFEF8B356DE68E2D8797CD042B6A80670B82B02B34DA2A034791711900593171DA9976" + "6268E82C20F168F4AB0B5FD8C65F9F76D25FA4BB83D725C971E431AF47510A17A34CD557303A" + "FD27C98C20EA71F0C2106E1C579592C84E8F7754E469DEC4498B1984FCA6CBA2E00AF8F61B7C" + "0C9C2D71B960EF3C335365DF728E9DC3131FDE877B94F2F8002B16ECBC92C034A07169479336" + "0E65FB8BE14391BF9F5A12A0B411F819159F46BFCC8F0E43F59CCE273004364592AA3B82A76E" + "E0063A5C45E07E1558A5A0EF3B7C24BBB10FBD365331C3A0D97F9DFA5B2F5332C2BC040D6F62" + "B7CF3CA0E8E1E673F20CB1C2B844FEDD85E42092221E567332E9624EFA3E2D8690102A5A362A" + "F23FBDA987AB045ECA59E3B476C8AF411F42485A4A77FDA387244D45FF4D070BC7BB65C88CF6" + "523C71FB883EB9020C5612D71E14EB8DF1B4E9B571B53C351ADABEDA425D583058C642162ACC" + "3394EE219E13D21CA0D7DC1B1859A6482025DA96FB7756409DBD6029DD63AD96404FD80493D2" + "FC577B13BCC34834C73A5D3AED74F0C9CEC8EA0DF91B55F3F3BFAF15B7E0EF20C7EF8BD52DA8" + "9760EDE5835F6FC35F1DF78BA4586022A9F78A9B63177B8098BDA88A24808F3ADAA528D6E936" + "49DDBC5C994375FCEEE2DB84F1EF4623910381EC908FAF001817D2D17CC89BC178D8A9E776A6" + "F934EEBD2B761D1CB288459D9782C6C5C907837DBE775184699BE837DC8DDED301C78D45518C" + "FA8F52C8DB80238803B62695E2BE63154563C70196F76277D82FB32C4315DCFB7D83C12746C6" + "83D37344229A7170DDA97AEE593ECADDCF2A363D07B2267D1697D03001EBE2126F03811388C5" + "EF1E43B68EEE7F5D8532747B7724D92ED6294AB6B9E20248A22B7A3203BDD18DB2A3DF2A880C" + "344BA3DF71F587EDF5834F6E0DD22B6957A3EFC609EE0FDB51EBFB9F9F55B13F60AE26E7261E" + "5D6EB974B9C65825867B91BDD47E97924037E404D36B8D77280D7B7204D5DDBED2B7480824CB" + "3431B077D60A709790F308EE539866A8D084C63418357484B6FAB6B158795B1D5B2E5B1F63AE" + "50B1D690D460813AF823BF1C7894DE62274DBBC7A1C165FF456449C38B7FDCA4B42485F105EA" + "26DC5B8F34A6F441ABC32B7BF89EA8D8B4A81012C368F8BEE48D2E999CD4F08892084F4376FE" + "443A871A609F9CCF0E2E0A79E7DA8DED60407A869995E9B4BF73FD360B871994D97BE11BBA48" + "7DB9EE0B4A3550FC0F4474B8C00EEDCA83B8AA9344D84019C8", + "9994B8CBEAE7C09CE33E1FC5349E1E8E00D7B89017EC6B6F9584BBB9D06E6FDB7E02A852BE18" + "D8707AC54D21A2929B8FE088E144E5699319A62DF657E9D834433180AF71CA588D6F1B81D6A2" + "4C6786200FEAC67A60326DC160383432AF3FC191AB0BAACCA2869056B1D1828E6414834DC18C" + "50023B393E98FD72FA139291C1C3CC9F4EB0E20318B59BCB21BE23BC85D59BFDE903CAF73C99" + "DDCC12DBB33D0BD3075A14E6ADCE41E6E92D1221105AB09396A534D0DEFB2CD231D0794AE554" + "38FC7046AC9A8474BA6A74DF06A1C4546B68244C7F76BFED21836B0BE0DAF6D9F33E41752918" + "6C967F221ADC1B4AAB2FD5A869D6BD5BBC3BFA9FC4C02D3866FCCD97A8F256C5B2E8B322DCF3" + "4E59E76899A2E9B46949E2BD3667ECC39680647F2BFB87BB57AD72C2B57E9AAA5B076B089FCD" + "26C31295D04F99F36DEB60FA1AD83096FFADDFC64482DAC54470AC1F65CACBA5C42B26AC41C7" + "E38554EA53C17189669BEF616594AD3921AB4110891692ECF04E76ACE50B5C197A1799BB6906" + "7773279DEA7812F7FB357427B88FB09A7B35A31808E1AE5F2678707129390BE9D7E32F939B88" + "01463076582504CE283171AD412C28A66ABA1AB1307F9EA9858380D076C980CBCC6AFE008C3C" + "C648AD703B1ED6234A71DEA03198458372FD4DF68CB31932D4E450E220FE3B2928B096546BC1" + "C3630FA942A80FDB7ECEC173BBA4353EDAC6FD0123BD600E2F0F25947F0F98E7207CEAFA63A5" + "332BD44EE1CD56C7426592636A01DE2BE46AD14BB36016EAA2AEA22038CB65DEDE3C16963029" + "2B1041DCD3F200694512511FD69177A7F9B36FBCDF643768F799B9D23CE069CB73D8539DED57" + "12C76C28CAFA65D38382315F0E679A6C221FE078CB8245CD692574CB3617985019CB56FFFA3D" + "9AC7C917E8C0688B175C21D240989ABC49AD162B0749496F26D3CB84BDAB3A3D83D74E078B19" + "48A26FC69DCA01F6F7AD3F660DC551F2011401593B44E9E3F48C97DB7A44AA1193573168F37C" + "A6C79A09842FF0980154BABD2613E91A8F7CAA89BB5B0BD5F6C2A50BAE76206B54ADA4AAFD92" + "56638FF620B4D81E000275FC72E7559043CA103E3FD5FC6CC407809ECD3F0DA5EC0BB213436A" + "EF533FA82347435EE4CCFD57763F7CF7ED8D21CCC6D9CE98EDEB71A79FBAFFB2D6AD81B213DA" + "7565EBEC60115DD6C46115488B1ADEC56674C0FD5F08F455464AE77C3A7DDA33B9E037F40180" + "39E7ABE38D75AA14617973C49F82D596D818E8EB255A92784FB392E25548804017A008044AA9" + "1D2737C879256A935C5C606DA6AD07E48F3A7A18A156BAC71F579E700600BFB01E77316EF970" + "FB9D498AA8BC43EAFC0CB99A8DED63444AA2188DAEEA2018DF5E9AB96F213606D5AD37FD77E7" + "963B5EDC65CE6D8CCE12C6DFBCFBF1BBAAFCCC9DEB0B8B1057F32BDD5B0B213740DE96C3F2CD" + "E407808CD8FEAFF1F0214F0826AB9D38FEB90001E06CB411BFC719A926FD5496D4AB5811B9D7" + "42950DBEAF436B764554FBC5625F2192F574AA00643FD08641678D94FB3C5A33AB262154897B" + "6FA4C4BF1E5C8B726A00A2013E2A8EC19BF2D7BDBE014EE58FD9144A634781CBAF06F17356F4" + "874F2D93DA4A4B8351A2D648F56464092E10EBA344580C5FA24F8D66F17FFDAB4E602867A1B3" + "4CBA925ACE89074C781FE110D96799C3EA3107072E997D4C50DB8D23AADEE7286F3B4E581CF1" + "2E7667BC5BB09BECF7DB367F97BA25AFE229228A58013F2CEE0823525031A5A0F1EDEE9B4C70" + "1115D5155DA01B374A2D589F51EE015B1926990B8DAACE1DC8", + "139E57093C71B77FBB629BBE421DC5467239F7EB52032F45300BF29346ADA00FD062326B5ECE" + "EA89E35398C9FAA96B530CD1DABC1A1F5B4618F1759B0F91922AFF33D4A6E37E0313DFC85C89" + "15063447D0DEC688ACDBC51356BCD7602376ED920B253721A72DF2705DF77F1B9291C84FA5BE" + "502420D973FF2C86A7E40A803217919629F31FE9BE4EC19E5687E19F4A8D180F1850E97F2C57" + "38EEFDB17C5BBBC6AAB976F86DA7B33D81702549A60B6D96D53AB1C2732962B47377AE7DA218" + "788D0566667121781065BD3C456FA7357115291345A3655B83B3CDDCC490129B584C972FC0D7" + "B98FDE9274B62C2AF39B640B3587E76CD70427EF02E1D2819497E9C152306B023C5D223143C7" + "955B318EAF219ACB84689B99409680EA864166A447EE8D9D89F79DD441ACFF570476890BCDC9" + "BAD5BE3B36D74BCCA8161B07FBE3FAF323CABB4222F7588D220C96BE32096D63FF19FEF1CF6C" + "E655EEF559FF26CF6A69F837BA6040CBBD83F2CADE6C9FF355EEF54CE6DE71EFF31FF8D6D209" + "8FAD260896235DE8885BAA7899EBF8FBFC1B0D02A67A5D6D9B8FB56BB2767A122DC41D5FE6B0" + "45773DF237362EFC44ACD04C2AA02D20533B22C43A6B309EAE319B553C7851889747881AC189" + "5072FD25302970E81EFC841D66DCFC359A04DB39EA868DA5C92F7E33BD607E9D26435B290124" + "677679B83B54D8B459129511D59CBED44797B4C103D091CCCCD41623C308B7CEBDD9C5A8D299" + "C871AB956D36DA0CB25481D03799BCB6C3EDD3AAAC7BBB47D1B7EEE39D469FD2E1431E03162A" + "5F30FC2D4F306E4FB2FF19F28D313D09802A04FCAC269FF9D36084814FB4BE4271293B1FDDF7" + "41C9F69CB09D949A0936EDD880DD67AD59147B66A22C6F617C458C151227427F79180FD8ECA5" + "799FEA89313E1B35D1E30C5B5F0B07AB7166195AD2ABF2633958F22AEE6F5AC988C17E00B6AC" + "5929FA01945E98095AFDF389CC5477084FBB28DBBFDDB1C7921D4F39186D4154AAED55E55484" + "3CC2693EDDE3FCD9943E601C541CF3C6E49E792AC06532A820A1D8583F4456C2525CBC31816F" + "ACA427FF009B008092335BC2004A54549CD72360DE6E532426639F9475F397414B6E9DE86916" + "A91F0BD85835FCA70C4D800608BE985042B04F5AB5AF2EC3413B04BACDFEB401A96CB19286FA" + "817923535C41A37A066755AC7BCAF13CD8F383F9E9F622D0310533B2016D4E8CA97B5E57640B" + "34A2EEBEA8DCB160D395B0A8D751A09D7C2A62F622A8CB5E316977760DE5AD213977159FA706" + "6C772452759EFBAE038ABABE52CD9A48B7478B0B1452528312FD70ADE46488D2B66F2438C010" + "BB7356A1A57E4388812E235BD482952B01B51181E41C7FCBD782FDE5FEF0F53EBD4F4E904CF0" + "E97D3A67BBE2D22FCFD12D1F779972FA5C3CC825CBCAF5F2BC3DFE9EFD07AF4FF8E09E0622B6" + "0352A504AF6B11D2044709FA9615AB3B74200C7093D9B52C44989ED43AFD23052928A343478B" + "B44966CD29F5754701D77DE6B92893B8D98397E6A3BA7212D69EC1BBBA5A31EB4C5511BD1950" + "FAE4162BAC5436A72C1A34EC55F5DD14B3409BA9EB7A54C5CADA01373282302D11BE5E7F073C" + "6CF23D4F78D6AB99817B1608EB2B127A057D852634DA5600B5FECD7483720B0DD3D6B56BC835" + "082865F4418006C8C394FEB0686F43E255A2585EE5DB4A0BA73EB8A7E719909329D9EC1B13AC" + "E4A8A948010F6B312404036403FF9094D7DA0630F4E9290DA88BF0686E14105532980D5279E4" + "9D8F3CE0A8E019F0A66CFF1EEDF2590CF084AA9EAADD54AA08", + "A20E192FB82D48F279A0886F0B49628633D3445C8630FDD129BCAF53DE8E0CD91448D36DBE8F" + "EE4F98737631F71BD0E00FE9A5FFD559501B39AD5F350309740C898C46635886FF3150113FAD" + "7D0CC5AF1BDE71E2292FA6520F25F1E0986916283F958399E1B9C0D868B6A4F31EA425E1136E" + "83C6C7060D7A0AF08324AB17B20DF63AB8E306237761C7EDCA1E13A36BA47741F2FDF85DA590" + "B3713445561D85F5B6539A6F6A83ED418DB7443455099F16CFEEC4F5A0DD953772AE095CD5EA" + "232CFF35DCCA3FFB56AEE15C005D00D24F32FD11287AF54801DB64F6CB60C40B8E3134FBB373" + "2B00477F751372B9FC2FC3B1EC81A1A4A417007004A76EC492E485CE8936E16C4583646EEEF3" + "2B0785893592869618068DC3FA31A0D5BE5314EBCB21310457FC33193611E2AD7EAC0B413698" + "F36A02FA97AD02D7A57D015B3C65B20B40D5FAD51E21B26330FFA88232134F5CA329F6AC1631" + "7F0EC58061A58526B2468783533DDDD89B0688DA1DB245CE849D248DDB94803803A094961604" + "DE370FD0FE753B22BBFB8803533B377CB231C7408C1B4DBC9B6E004ABD785222FD33C92C02E8" + "00EA1DD5AB7FF14CEEB3FCD3115EACEA41D53BB2A6EC16BC8DDFCDA3E642A8B08BB6C60ADF05" + "5BD96729B6BE86E1AA88B23B342696E87EFD3E0BB8975B1721E14EDF8E1BBB11831C7571BEC1" + "37A35493043D417AC1838D8F05DB221E9095E33C95B4586C0E761E6706A7F051A258641E3E93" + "C12997D2511E39EF63D68CC2FAD7F2202A33FD846B1988C644C0BA4302B3EAD673602A6AAFFE" + "965FC01C2F63BE31BB3867C9DFC5F6DB2C48A26CC1C5EF2BD4F6522EFC3184E88B2F31851A4B" + "43D84416793C4AD077D261C1152B6B1C5CD66F7FBB19FCF8F25633B423BC07B581755585C4C4" + "254E49B3AAD50F48C08ECF7E8E58162E8BDFAED7C27993CD8994879D22259FF5D386B4D486F9" + "3165E5CB26DAE962DB51C1C41642B9BBABAFBF40938C84406E7D30E6636518585372A69A7C03" + "8EEE10ECBFD9394119BCAF538BDB57BD1AF8F29E2BA73CB3533F89D9D7589BB6BC5D3AB48779" + "E4F57FFC87F261C0D1278637A1D58111146DFF9A24360C883B0FAAAC06ABBF1A2B00333C890C" + "E64C756DC09942B1D5DA0553B77E7AFD8C8DC6589CD7D0EFA931193061EBD99566320F877605" + "3C14C3E1F678CB725F00DCAB72494D07456C99BE042F02EF02CE1B0EA46BBFA96B006EB48125" + "518D55719DB46B427AD289AC0D797520C4D1B406CCF4108246B5515C88B36A136340959E17E3" + "1D369BBE512705433075C6DF73B1CB95814F0EE358FBAAE800A92529B9AE2DD8F6D638F7EFF6" + "BEB7FBF78E35B78DDE3ACECA524A800BAAEF8D63B87940D4E9C6E77DB1D706615072453EECB6" + "5C63F43CD48163642B66889D4556B120841799B016C59182574F581AC8A5AF216B16DCC75558" + "C5524096BB006B4AFEEB12B86C39A07BA07A103ECC9B51705949276A9D807D27698F37C3E194" + "1E503770F8263354CDEBC3064C464AFB85F59C8D31D898DFAF3F76E5502DD5C6A14C81DB5719" + "3398489E66006A2C7EEAB01AAAF86E089836122CFFDB144440D5C2F630F24581C327F09FFF57" + "93CF7096AE5D1EB6EC8D75CDC8FE65669E72EA3CA78FAC5EF56DE8E57A9ECC414E4DFE9B843B" + "B8E01F2CB2A7650D0C536333865F3B011098E4817EFAEAEECEA13411C1C56DA34BADB269D3D3" + "464FB09596B0E5D7FCD2225CF094C8D9E4CF21F5BAFDE8BA340D38BF79B881897855AAE6C939" + "521191D0D55740D6F01EE216E635278F9FCC6EFF7B359D1C68", + "2048441EEA4FF1178BBDD3DB008F50FE4C07745CB05D8B779FA1B35EFB4A29B132125FF91F7F" + "2FD7005868E59E790F7617065A0A15CB0818E75E06235AA64E92FA2A11532D157FB768DA2F8A" + "71216430FE8991956B56DBF24E2D94654ACC1C82E948EA3340F1DA221BB729801BB7987EA799" + "E6827EB1DA6E5CEE7E0BBFFB125BE6D9270A13AB2739690362621E17B6DEE1DEF8CA7AB95CB9" + "E99AED68243C026C8E4587864E09E3DE6328903E298280A9009BFEE1A011F51A7C9BBC57C637" + "7CB50A6171DCFC44D57C9CE6BA5889EB82A8E05D18D6CFB82CAA08C77EE943C7D82662FD6492" + "3294A1DF0FEE262A1E9B0F225ADD8D4DF4038658EF18737ACBBFAB3C72118D947963CC4BD1A2" + "A73185C2A5EF42F8BEA760255510FC5B49CC5031321697920B2FC40ACBBE6A3786B7C4963B47" + "6604CE7BFED59615C2FE058332D63C8DE85F79CFA311EC4917863E85470DD0585169EEAE2BB3" + "FD924CF95F048016AEF908427DD5A00483EA7CC926FF3751D5DE5A28682EC38A85F187A248DE" + "2317CE7BE85EC4F1AD330681FD0EA1A6ADFF79CC819B8B71A48FB587B159F74D408FD34127A5" + "A1323028CE4B68FC22AA901B95F47D0BDE950E863395162F48CF1A78A6C62138F357F74D7B38" + "63DC698700BECAC6ED6913C365E15191DFC3EE14A531249AFD19906F8F0A5DFB8C4154D077CD" + "AC62E81C55075E4469759CE4FAAC88FCEE3A1942B4FBB18FA8F764F962BE20161DFF64025405" + "0651F0245319EF1E41C9878689C4D900F0905ADD665E74EA75794C7DEE1DEDB7A1E1191B025A" + "7393572143926D9F69237FF741F9DCE9D96E35F9059E6795F867B7600653B761116E3C0B315C" + "4A5D04E0CD4A98A6D1C93F6DAB5AA62645FC309A123947D16C5BB7FAA2D32A21517D25C9956B" + "1181EB9C60434EA1416983A1BBC279E69C586803AFD3FBE27FE9213236514B7DEB3617E7BB46" + "E834E8BB80C9FC2BC4036F2EF747A23FC95DE088481247A72CC75D3EE9C2CED8F6DB75D35763" + "FE02C0547EB3E187FC97B5280693C886CEA586753ED08C46F013049616806EB210ADC78AD504" + "3ED3FBEB8211356982F3FFB0DEA878E3B34AC1C62D85AB0B607A2D2F36B9C0F8F4278B0836A3" + "4B2B767648E7D9D1DA64049AD25E92547FC90E4B66E0A297BC289B343A3F4B998329D26EB8C0" + "2D965220CA77307EED360A96D9B55E879F21399554F95564213B2B2EF3EEAFB6F1468CF7A637" + "BB0F3D304078E46EB3C1A628977BC55E02401B1EEC680C4E018255AA5625FC0AB4D4188247A1" + "BDD4C54B8203E3368EF992926107A746E5686C741F739F89187A2A6B94C09181D0F0A6F4997A" + "8741DE35AF6B191B5F55DCDF0A36415E0897B7A6BB39EB975FCE3C6020E425DBE6D25628BF1C" + "4F5B68B17AAF468B6D791C7E8A3525B3EDD21382031E39FD74EBCE6EB2F6F4883D4136287D9D" + "D57D6C4C6B7AD63DC170AF4C97B28785C0C48194EB2A2F0C48FCE77C171B0B53B172F04324A4" + "CFB8B663E020E95195DEC2F1208C1596A81FD2352AD520C039180B1BBC6C01203D51EF748A32" + "C1E6BB138F01065E786EF632F798B147B6FABBE7BA6A6E4213554F9554CE427CF0BD56CDB4A8" + "365BBF067729822534DA018EBB25CA60CCE97E2E166C8A1EF4A283B3693849FF1524BD25AC90" + "132DC5CDF38937376A6962B60868F2178F81CEB67A5A2F03686AD0DA31C1A966E38F0ABD86FF" + "E7A0CB564420EBEFE5BE1055A8F1DA8426BB00B434906407B11885BE5730D2B9B089E4B00A56" + "F49FF0C3E6BF1501A03FE37565D76DB78DB9A1CABE5D719A70", + "7B1053897E6A28920AB2EC382962C4C31105694E1B8BC8F1F461766961121D7ECD187B25FE0B" + "04FFD37790CE8643E52B6644BEE497AEA4D1AC9C74540FB8834690D9AB52E762E70994BF3FC2" + "66B6E6A89E7D24D863DEDF5119CA0D734EF2D7F9C99B538DC8E9B18E74FEF65B80104E9A1678" + "7AA13E16A73F7CE4A6C4073C4A533B2CB7DA95E122BEBFECAD000CE1D643778174FC28EA2416" + "D45BAA8B129151D670E4C94F3AEA8306B59C3A62EB2E64BC54A02000880338C0283D3842F908" + "5AE593AC596C567B32571D1ED5635192E69362D3E4146B6E8DCD49105E8C4EF4FFB349F86AE5" + "B53002501565341F52E8A1C99CC5B9D70084E600F339B5E44EBE6C1F821644524A232BF31D21" + "113A8E49E4B23A2FBFF4FB3058E0EB2069A360E5F00F25C7C494374F4314FB62FC9762553848" + "5D3283FE0A65D090E5523749FA36F946179761491F1D27807D38362CB026B838D066F97FEFA2" + "E2693C938AE44425C67EA622925113420FC1B3EB913D6CE678033908075CED19CC9C28BA57C1" + "6535405200656D3AB0FC966FF97B918BD044959D8BB6B1413E5A364B3A4C56355BC5C75266F3" + "51B4D1AE4D3AD084FA10E5E0A018E6008800202951E933A6BA32E1CD6B060ABAE7949938735C" + "544A468AAED15B4122B8A1F9740F76135C398005A9BFEBEA243D4ADF69A6E65291E7011B2939" + "F7E72B43E42AF0F342CB90400ED37BF9738C6CB89D8E56CC9CFF5A7B9675829CC457DBDE30D9" + "25F3C8AB3B6B321FE7E94C873A373A56ACD84B1608EF815171C9AC592BAF493BE91336A53E13" + "0B984F765FF90683FD26F0C59BF5C24434B374317C789E8EC394B50446191A34A0E1BA6A8248" + "A2B3F48E5046F0ABED8EF0753D0E240542F1FDD0E8858BE7F5AFF6BE1E1B3AC113113F3DA1DC" + "D114AD49264FFAEC3F79BB85DDCA8172971B2DA64C891E8023A98EE2C93D2BCF3E8B64AA880F" + "E9F008AC7364FDFD7DF4E553F4E0C78D7C3AA3A4203087CF9B424FA0B065EE3D673249DEF3FE" + "1E19F3F5C39DCD6E5DEE325A851E4F0B56D7BF8A29131A504ADA628E17D93D0FF83769D69EA2" + "81B33B05679E8FE85FAC8AD73476AE5CDA7263D70DBCD3AE9475AF38A7CA7C030A01AEC8AB85" + "A0EFF80092C587982CC4BF71AE077A5B56A0FF63B582742075EA90C86A998601AD397455927E" + "72AB1153FF53A1BF34A894BF85A974FBC513BE70B2BE63EE77B8A352B973B966214BCE7CD968" + "75160F82E87E4365BB1EE21D3023F53194F247DCD7121AAAB26B6CBAC433959689A38ED05D0C" + "931CE533C8596580368CA870AA7163EE2120EC224D7745D02996C0E025FEC6D41FEA96FF6957" + "F82B637FA4070369940BA2EEB24437048477C68E550E15316C01A69A13CCA738C930BA0B71C5" + "9169A9CC235D36D64D555848EB3BE24F298CAFC40CB84778DDA6C27E1741F068AE169B3E73D2" + "84669DCE9D4AC51DEE77C67D4D0E7DC8A3DF2E95A1FD29152CFD85CAFFCA88D54E7E49AA2E9C" + "A580619956130957AE042E41ADC6FF056ADA5EE0758EFD233419E1A349001FF705A1D5137580" + "50C03E53E51CF5AE2975CB3DB0EBC64E5B3A756E2CEB5135FA17F179E6A0DCCD8145796B96EC" + "1FF0BC9BE871465B520A58C89451FDEB6AD0F278A15A4C77BA76B3B9C3AFCF98787FCF7B924C" + "E6BC77A60D05F242D9F3E10C0425C55C3EB1E3072FCAA72FBEBFBF26CE35100F97F0115526D1" + "7CF3D4BC93477195C40178913265B4D8E94E8153BBA1DD9EFC375FF26492B5288B3B85BCFC88" + "C8835CD8787D6FF5AFE7D1A1170BBF8F42A02470BCAE0F71B4", + "EE71E152204977E9AAD92BE12ADFF7FB13C71007C1A3D190AA6D793C40014EA665E1A25DE0D7" + "78A6BB8D85C42E74306BC9E0237969F518DE784B99F759930D2C2914642CA9E5094C852E0CDC" + "59C961C72FEDC644E8363D67FF6EC194442C4CD8771C7E0642F156949BB1084FD187429365FB" + "87308D94A8CE181812C494833575C756738D2DE090F17164E219518A5F413BC20D741DAC32CD" + "23D3E7D1BF9A8BD0A6D240BE8D816F6BE4CE9F9F770DCD43853961F6FD46A2D0D6793D9324F1" + "CB49B08E9F91C31FDDD58706D82CA887F58C84E633479E587EAAE251337F6986BDA5287597C4" + "0FFD64D8A67EED47372DAA670AE9120F6C6C156058AB6008C22BB5EE28BC49D4B2E1122E3388" + "C860FB288F18103ACFCEB39F6EFD5C57627DF433B51E12DC3B4878ADCC2FBE46EA3ABF76F9CD" + "73F35C0818F114DF061311CC7448874D2B923D1477ADD4431006D51A06A83636F0489750E655" + "B4ECE2B77E651B26BFF023E9AE14A5BD6196FECC8A47557E1A79E2CC672131AFE115341B60E1" + "ABBBF8C389F9710D92D38F24C9BC9E6B0B4562BF6F869CA1C2B3B0EEF9F97327D6F681B17D02" + "4B650BD159FD8BE7CBC4B34C35B82EB043DC82FA518A9847268E8F0907B4B1CE6AE3AEACC129" + "23481818731529B10CE1DFA6C942E18BF2108DD9296A8F42607EB8EE1B323422298376FFE6BC" + "6C172263B7F4E386939A3B3074A13290A7953426289434B0C99AEF99D21E7B18AF969EC40793" + "D60C2E7423A1B1DD651EEB07BA4587A6657280023C9EB655098BC583E008E3C8DFEFFB5487D4" + "9B5597EE92044A878E77DAA518FE50B8092E889B064285CE047573353E98FF36D4684BC9F27F" + "CA512596AC4EDE7F1C44C8A8D8028A4FD784C9C12C83B92139893142FEDCACF34C8C30D7F5F1" + "8EBEF591B8B3F68FEA3E2B70D1E705ECFB914946E67C0034986E5E8DAA259C87871184043DCA" + "7BAB0E25D601CF7A32BF08281990964A7F71F771D5FD5FD05575900D6F8C252DFFAAC67AA5CD" + "548D5F3DA960244D579162B8C8019BFACFC5E66D1AA486C75E607F4E6DDB8D7B497DCA4D37AF" + "A8759DE198BDD89503DE0A2912B9AF1E1190DCB44D467095877EEA4C89059A8A761F91AC8C63" + "0DFBECF5335E7BEDE022A18B1D497DCF36DBAFB00824C01F176267B89FA680A52B2084C6EE0E" + "1BE21AFD2902DAADF36541DE05D8250297605406CF640E1B0633FB218FCBFB1DF3E5335411E5" + "1E45D558BA42FBBC464EA4141DDBD0EA06AA92F5DF6EAE9ED9FFE7CA12E2B5580A285662FA2C" + "42E0167985A59A9E50D8B4717B16F09B739E4F39DB21ED1BD1C5A3614F2B34B433CD00E8468B" + "E8CD428A0355A8E90A7CFFF36F2EAEDF75E92AAC0AE17B770504AE4C47BBE84BA355744F14F1" + "055994F9F71BFA7E309BF98C1B0E04DE6C0540DD281483740F7054D9F6AB681297EB08FB0E0E" + "EC64209A94A02CBF23BCC8DD1F00648201BEBB6D9E77D2571A30A880F6FBCF5995E6FBF618C6" + "26B13F0DCA2B3412264AEFDC3521CC5645A761310F1EB3A9128A0F78152377A330F735C2BEBD" + "964A77D25BD63B76CE5FC0CF5C6C24AB16CCF47E6BFB300263A8D13D564480D2B79F56255674" + "ABCC6ABFF694863ED60135D5417F57F571DDF1DFCA4D213302821FA98BDE700D748E1ABBCA77" + "8404311C3C27348AB62F4EC3258007CCEC52513BE6F41CF161DA8F8AFE2DF9A3B135EFAE31F5" + "FD61862659E6A76FE85192339093B8269072643D7E4A280362A264471FCF6E46AD34914A7FC9" + "F27A42C56D9FE32F9599D5C40E74284C1B222E9203A14FE314", + "50752573112029B3DA67BB197ACBAE7C88354D9FA8BC22683EE9E8C8F1919094C8F6903ABA5A" + "9197E52156B2100B53ED20D5C3AC3AE0C83F1E69C6B8901FE74D29717D5AF6828E369BCF8C4B" + "048FDFAE485A28083050B15CA7E0C348B5DEE45639CB17B4B5AAC16209C0F68DB6A536E2A2A5" + "F0755066FFFA8CAFAAF8E1C806B53EC435CB0187DDB1B91A663EC606785E3BE036F5864F53D0" + "7AF1D6F871E1182A9215FEE1DF9631CA9DA027C06B779E57F4338A547CFB0210C5419EBBD2C9" + "C144287F0F63ED05EB1CE4FDB30280F554424DDC657D81115DC861BD0075957B6FCD4F17B44B" + "46DBD735AF42DEE81576F92E9335E5216C47B61825D7CE9DA1483D95D8E5EF9F8DC4A944CF76" + "FE34D7AEA8BE9A4AEEAEBF22B27489912E4D44FD757752597D1575EB2C7F6EF3229523B1F9F7" + "A71BA9BC1285B973EBA4186DE23684A7ACC9749F6EA8177B42F5ACEBDB62D22DE8F2B3F6DEA9" + "AE00BD8613BA8881BEA63BB2422AAF0140CDBF2738D7A0B7C6F0FE142283934BDD7982A30840" + "DF3E2A51CC2FEA79EED603E405B9538C69FB877FA8495418878E1F6B8F5E0BCAF261AF6C07DC" + "7A1E60637C66589D8DBBE180D3AC237CAD6013871F55F5315FFF660AAE0FA545476CA56DB16F" + "0390468355AD2DE8D39C6A277BAD12C307E53A8D0A0C10145A1275FBF120D231F3D96C71416F" + "5ABE8E94B2E7F8091D639678FC13075C35C3AB04B7CAD0084D6A84A7E9895A5D5C096F132909" + "898F1317977C16443D15F9B2AC113E75D35E98DDE65BCD940488CEA4AE0A6D8FA38B2CEDBACD" + "65FC5CFB9B2925B7F28B4428B887C98D6C373A35D54CDAE8987A4121188519ED045CE90897B0" + "D6510C3299F502A53A1968C3F282067105179D3D1CC9E2D9EB304C58479BB6BD443759760C59" + "7FB6441EC15F2F816EC197E4B62CBBD0C1B8028B8557C7E5D6E6CDA99B1E1B100EFD5060AAF9" + "F493ABB98B34F4EFEC0A65050D276669D92EBFBDE56B9D0CF59597429092881BA7A4C44BD977" + "8717E6C0294A89FF4A9A55AE46574A1B81448223F1D98C018DCA034341F9728F97186EA8B691" + "D6AD651FD2A8B65994E1BC617057D2339C24A41B760023BC9E9590D391390C39C4B77FA872F4" + "C9A552FB67C13620B9833FE0ADAE99E9364BADD8CCF35BA7978DC0E974CBB9A40CE235AE1104" + "CF285DA2DEFA7B4BD9292F15D4BD314CE7A7ADD0879A67CD543E6C1CBCE149A46EAD20F08818" + "394767C4582D0C6FBC57EAB681CE71691E3C29EA6092B14A6FDBA11ACCD1E113A07B1E44EB36" + "3713DCBC3A88522E11510E89422B87A7791D8D9AE44F1BC0B910F1666B10BB7ECA51A920CAF2" + "878F12D1CE702DAAFD47BEC61683447CDC53830221E096AEC4B250E7A706CF85567CCB3C2176" + "BCBCE65197A5751E92937A5BCBEF68B7429E64110EB588E604B3BA65D2E0763D3CBB59E66376" + "BA4D92F32EB6A0FF9833A08D907CDBE954B265E9C2BFDDA4738613913961352F27B8800DDB04" + "A48739897D41D0C7B0E5334DA2A97F14D6AD712DA2AEC31D3E29D3F058580A7630063371F888" + "24503B0A5D4C4EB54B2A5FF22A52806CFD1C3DD37A4464BCBB022921285D3535E6173AD4F7BF" + "AE9372CCDC961414CA06FEE5E59A33BAB925F3EAA0C157EE011B0F1B32B66CED74FC7D543A28" + "03B0617BA68DA4FD306ED03E9F506F044D9FD3460DD35D8457ADBB3C4346419AF368F2671797" + "3D1411CC0829F862D30B94A815F32986114D61BD2212E74416F3142310904BC322EB6655758B" + "9D86D6327C23A2845A29FDB4929B3BE747F4D66BB6E69A38BC", + "1FEB152F51FE94E528C5B5790A52C94B449E914A842B85DB89F16699808BCDBA4B8B4BE5CAAD" + "0F327BF0962A7216AE91B3B6B533863EB0F3D08B85F7DF33DC47DCE05272662EFD9A4E413606" + "DDEC5F5772FB2B0AB2DB2E5FDA7AD4B82B52DBB79BF57C27D4DA00C924811659ED82C437DB8F" + "49A99DFBACA3C19E02A837544335EF759B0E0C61D1C10571B05259F6510901C3EC32188D9C94" + "1F64E7716E7241E12E57803849F3DC8E06F2D783506B286561CE1143E7B048C44E108504715B" + "054A9FCEC5756CBC487494F52210D23A357537EBFADFD569A26AC1FC98A8F2845F2AA5770989" + "67E8377A30856AFF186E68635924762A7BF6E544FB886A097DAC389A02D16A4A34DD3963F89A" + "2368C6491164C35E7E20A9A1B740632EA2F2FD93BF89C80C52F0FBD2807FEEFA1AECE4913D13" + "E5180F5FACEB3EE80F8E1781A812CE7745E9A65AE773658C02018D36773AD32CBD17739A40AC" + "0F438F80BBE6B9AFD780C53E45E44939BAC2FBBFF00A5EF87A51809C8FEE4DFA7A2BA630176C" + "2CA823F3D61934449318B622C8FE34E5D96292B45A02C8E1ADF482B08EF9153B7EF2A37124D6" + "30B3B0C7FAB50862F760BF348C87752AA7D10A78A8C9FC1AB22CB55FDAFEBF657562E2584225" + "79497091E9B5751B9FCA9506D4710508439118906F3E14439C3530A6B0560F5A7B0389DE7C90" + "E00F53A43C1273B4773937C149CD88C261BE1C0484537CD2506C75041C5C318386CD77BD6611" + "5760AA03CC1E29AEFDCCAC978EDF611A0DBCD34409249802D95F21F57ECF6EDA56A0E95AF2DF" + "D3A6DA6A86A6FA7757D1BDDB03641292CDFBA332725039DF11DE67DF7D0E885E786BE30E656B" + "6E6C4BAB4272A3487EF26785AA9D3E968E92ED9E880CCB347C8EDD0EA10A944BC916949A5284" + "F56D18A5394BFC57A546BFC78989F5250F7D0FCB4F4EC44BAF74DF6293A14BFFCED88C9DDDE0" + "BBD57EB0C4C09CF9FA99F967D4A679227AD24D48C699E9CE162411819FA8150D7293232B3D1F" + "7F07344B0E9EC3F7A5B6041C35391F88AC52F84B6746B9BE88FD28D26B5D0BF4F63917B07318" + "127EF7219F50C57DC22855E7F60EAAB06C892BE5F6FDEC62479E7B389CD8E295740011853230" + "072063044E2F044832620DB457A87A25F1F7B72AFE23B80D1A83D60E03AD8E4B1AA078F4B3B2" + "987F570E7AE6DB22DD767C3497161A8376CBF0881CB697E9C80970567D60D3B334AE7E9EBF97" + "36E2C58CDE1B7564D45BF75035F89D25E332E1BBA76595A0A013132AF48541F58C494E2C51AA" + "4A98F2874B573DE0624F694FAB14E9D9A84468A1ABF02EEC07441514BDB91D7347542AF3E26D" + "D718A9AEA0BB01599D7051E5B6D4D231240E181870248C4B2B6DA78A0EB99A80DD05759518EB" + "B647CF542AE2CEB89DBD28A822E037740FD5851622159B9728D5F296F24607BCEAD2E14F1952" + "558A34729231AF82A12F54C8C80505A9A6E5DD874CC7A4B91FAC0AEFDA2B26AED87B31A3476C" + "E9FD797E752CCDCB06BE6A0E901397E96D38110FD36EC15868E92C3E6EBB44DB675E70EAFE19" + "4DCD2F1E0558D271B5C0706BC158B01DC47F54EDEF8FA45E15EA2DB0464C1220F47220C604E0" + "0C4CA188002EA9471B391CDE79E24637BF6FA7D491360D55706FE7AA1443BEA30AF984EF7E48" + "18CE0DE89C6F2FD0BAD64B14BF117D9D62E6D21F4A3511F89CAC38206DA5EFC37970D22CE0FE" + "F8BCD4C4C94EB0A815F9818824687397996312B24B5E449E652BE69F995F9F3903230D7EABDD" + "07BBB9311B73FFD285C946FB2EF5D22372F2D3F0BEF0A4AF90", + "694565550B7CD5B9B0B6DB54F5D057306274DF933871F61E3666904A91659EFB7B651D2D462E" + "125EC9E83B093331395A1F26CF23989D92BE9E399EE919F712D72A10077723EE7EDE2ACAC9C7" + "F8222BF1D2F10AB07BBA17735895F081A4CEA6ABCBEFD589A8B37C92B3425E5F4F5F97356C60" + "B3557ED334AFCA2C580C6E8FE49B2EC49F430EFBF125B4C0540A9E6B8215A4D9E4425D1F03C1" + "8952B9DCCB2E1A72E71DDF15BFC99DF83AA0FCDE1CA6BDC843A581F347B8471EC4FC25BD2532" + "E9C773D23F630F3DAFF7715EC0886937C6227BA2AFEB464A79700BF7538ABA0EB936DE9DF2B2" + "3552815D0DCE585A05619C43D064BC17D53504B6E0AB1651E9E6FCB020A9681244A5161AC078" + "0D61A29489205A541034FD9E5E29A3541DB482B2AFA0F4982F08E61A816869CEC2EA052AB135" + "3EE5EDB275C175472BBF403A79498B5FD51779118FB258440DEA3BBFD6F3C31BF12F3B8E5D32" + "92F690FC8DE388778B3E0697084EF594E1ECFC15707EE64FF6A3EEE39D3961D34CEE752A460F" + "03E2E9089E6496A10759E540A80CB6923F7DC30BE48DD3649FC5D8C068D14FD4B32DFAAB3418" + "DAB3A7EBCBE9E90B3524FB345646AFDF4F5595CC96043EA46B3BA1777835423D2E3F51107F8E" + "4D4D51EDF9DF13BB802153AD23BE625DE671E5F526E46713CD93E16A72333243705E4DE921D1" + "8AD2E29B7B7DE69A25482599B1E1BE387327ECB91833A82EBCAB6DB43676ACFB42AA9A8A59DC" + "81622268612FE351DBD1A780AE815C17A948B9034D0B1524733EC369A98E9B81131532DE66B1" + "86AFF52F39B49E092107C1FB2B8EA2F446C88896EC94332A5E2C380D9ACF12CEB2E49DB2060A" + "31E7E3CD5C393797F3F75198CC55FE84CB95797A71711AA84BEC33A20B0711787C98D9F0C2F6" + "21855BED4E9888C608ADAF0054B8E007B87A604323E11C240239D4B5EFA3C57F71DC1B4FC292" + "EF9571B2C04A262A531E92693E7A15DE28EA47AEDEAD9E61E26D079C0872DCFA7C3E57DB2E7F" + "0A4418AA014E8B48001B56B0714F0D4B0DB6A06E73B9006FEA6337F36AACEF28C7BFA79AA973" + "491806B12014903E3F92AF7795570BB80B4808EE846F815A1FE8A76CC890D9905C3C9AFC1E88" + "B71F65EF768AE53E42C9952C72078A2972D7564D1170D4ECFF2766689665A9D0C146AC88390E" + "C27A9D4B45B7717DA872DB39FD1B600E95D8E322AF5B7A095FCB15405EF78A3BEBF4864AD3C8" + "8620FD7A3F5C6E861D9392625929ABCCD0CE5803DDECD2DCE0096E74AC1E8DFFD8BC1A973B48" + "039DA59BDDE00D398599EACA4D2324E4DC30BB1D7E2F5F823089E5A93097EBEE28F7BD015469" + "FD482F6D7AA2638DD4B8036C5FCE6DA70ADF4776D1695CAF21B84E089AB14185CAD3348B3372" + "7F9B958744593575A74A28F0271A54C9A13E53A8B77BD37C7688BC1FAC9E1D04CD84899B728B" + "FC2D40FB10BB8809680EE87554F77AA4FE3E04940246B00C49674AACF2FEF18A7B9AAB67F663" + "2BFB004EE73B02B6D86958794706B56C000968B9402A8C11287F3A6DF53E1F2F9DA7081CF05B" + "23C33CDABDBAF12B8A3DD42F3E4B24BC652A322901A6C754FBA4A1F96C1DC77F51E2FBD695CE" + "20121C43E261032F0EF0038E95007ADA8831888CB95BED50C237A187CD8C9F0F44706822E61B" + "E90AAC47472F4F54E990BFD5198CC577E7F4F64E1D59E3F3C6283026DC93A6B9A479ACD80E1A" + "3D2A66149BB48889B117A2B8EA6FC1F042483C96CE7A57FAB0C6B33DA6546440ECB8CACB61BE" + "6712546859604E894AF41D40BA80F2C5EDC563FA430B222340", + "0D10977A3208F7FEDCC05F32FDDF31FB9EA6E8A8A0027B5AA4832BCABF8D6EA537290E318CFF" + "A5C784C511439575C52EE1BE8ACDC93A1615A993CDB3793EBE22E6C04D40638B4E19117888B8" + "771E7112D57C974E393CCD06ABD6BDFA19ABD62D74729B9DDD836E24406214FE47DCBF538ABF" + "B9A1252FEC19F630BB1F0E542287A09B2DEBA88D745167D94B6C919E653C0A14532392BAEE0D" + "106F490D5F0D5B0B05E81619D4A949334E314CCCB2D3819260699C943475593B621F2B09014D" + "AFF685494E03F225E16064395132CEB29C5AF66EBD6E03FDB41B6FD58625B7A1CFA4A5FE4BCF" + "2E3EC2088F895F5FC4177A2888470663662A82BCF8B1443A9DF193184CE5A4C41F96AC603033" + "6D031B110FF64D7CFBC1394FACA0BB04620DD0535F29C83DF3EB26FF088D8C0B6CC0C063569F" + "82325A73218C98FB95C228D1F3D415466C660E211145EE823FAFA91F110437C74F3D27FA525F" + "385EDA461ABF6D82DBFC076BD766F5A394D734C8A9C260687A44FC07292A16FF5B28090D4F84" + "6DC9AAE2C293996064981CB4D33328C72CC92952B986817A0D0DAB0FAB092F608B0775D49C4C" + "A28503CA6798936D29BE68A2EB115D7B4D905E1442A70F8DD0C6F9837F4A4859DFD51CAFD3BE" + "27F2846022476C1BBB9D94E2EB46BD5985FBD6BD560B33C9C72E93EAB488E78EE1D111E88987" + "2D1C602B20367447D7C9ECDB3C995A8685C93B3517D8774A3AEA9C288A321E3A5FF318C7094E" + "CA576B1FD53D4C1255ADE400515176579DF8CFBBF4CFA033B7FEF104C5EE908B06C581454ECB" + "942176B9C30D839DE9413615784DE7B69CDC68E4F236A04DF5552F3CDED947F3456CE9E437AF" + "DF83386627BB1A6F2F95816FCD567735B875681B473BC48EB39E8F521E913A8A922AC9B11C3F" + "8CB70138F2F0718FF8B78B0C2386887E0D02C95E3137E69B4B74D8CE57456BB9343B1DBD2C94" + "E9D055FD6DB92DA1DB1C9A3124C2A5D76DA346D5385A78B2A222454FB1EC6BC85DE5DB66B147" + "7E91B80D958F34B1F43C290C860895A1E90245D15B0C173FD7749AB56059B318779FF1AD1A5D" + "8852F24CD8E59E6B08F3C08B2E36101F8A1EFA4A9EB226DC402D43AE5195D74C8DDF00221192" + "59C24F3C8C7EC5879BAD2E2F5DE1C5CED07E8D796DEAC4D7118158A5F9273C0F05FB4645400E" + "89584115464794F8ACF3EAE700844FA0A51E386633EEB19C0E7FF4FA6A2510DC44BF4390FB28" + "5A4BAB09FA35CAA8B316A91258F54B9EF38D3A167CC7FACC118076C5F01FEA1A3E7FBE77D580" + "A9D829EDF4431FC8F59193135E27F1845F6F28372A0357DCFBFCF8B0AFF01F46DC031066BFC6" + "7CD0B9639EF3A55E34912AD19A2AA758BF21ABA4B429BE1385FA44761148ACBE5FFCE0731AEF" + "98CC38F14A0BE44301CEAF9E6A3E53C4C551043522E00544C5BF41E079C93F4A350311D646AF" + "6D3D62FC16E7470F75E8E96BB3C346FC6279E4873493108801F76265D75314EB85680476C89A" + "F2A4BEF0A3F010D8E9A2079E21ACF34E36649E942374B16B1FF3DC319B340D5AB25DD7F9D061" + "B51744812F0B5220C26128785F1A59E353603B12FDC51ACDB74F7427AC6F1BE544888A9A3CB4" + "3956C58B6DD74A864918B271B70B693B6D7F54172E52697B71B8593BAD45D4E6365DA5B2CFD9" + "18F5268160FC22C38861A3DA3FE31C1E9E3901DA63F8711B26A892A2B912F095E2F39AE247B9" + "C5B02D5C3B59DCD567ED0353E9ECB1BBC8CC3983F7EBD84F2E6D459FC536F679E9555F640AD8" + "9E4E2C7672DBCF643D50D9052F738361873ADD0853A6E54500", +}; + +constexpr char BEIDOU_B1C_PILOT_SECONDARY_CODE[63][1801] = { + "0101111010011100111101000110001110001011101111001111111010000100100001100011" + "0010001000110101111111110111100100100100011010111000001010110100110101001101" + "0000010000011011110101010110001010011100111111100011001001101011011000110111" + "0110011000000100101100010000011101100100010000001001110011110011110100110110" + "0111001000110100101110100010010110010000100111000011010101100011010000110110" + "0011101000110001011001011111010111001001100011011001101101100111101101011111" + "1011011001100100010000101101111000000011000001111010111000001100101001101000" + "0110100010111101000001011110111110101000011110111010110101110001001100110100" + "1111110111001111001011110100010011110000000010011011011010101101010101111111" + "1010110111011011001110001100001110010010110111011001001000111011110101010111" + "0010110100011111010000001101001101110101001111001101101100101101111000001110" + "0010100100000100000011111111001101011011101111001001100001100001001111010111" + "1110010011001000001011100111001101000001100001000100010000010110011100000010" + "0010011111011010100010100011101011001001001100111100000111111000011110011111" + "0001100110111011111011000011100001111110101000101010011010000001010001111000" + "1010111101001000111100010010111110110110001001000101100101111000111101011000" + "0111100010100111100010111000011001000000011000010010000010110110101001001111" + "1010101111001010101001010010110011110100101001000111101001000010110101101111" + "0101101000011111111011101101101110010111011110011101110001111011101100001010" + "1010001000110001010011110101101010000110101100011011010010110100100111010100" + "0010101100010111011011000110011001001011000101111010111010011010000101100101" + "1101011110100011010010011001100011011011101000110101000010101110010010110100" + "1011011000110101100001010110101111001010001100000001010101000011011101111000" + "1110111001111011101001110110110111011111111000010110", + "1011101010100110011110111010110100111010000000111011010010110000101101100100" + "1100110101110110101110100110011100101011000101010010100111100011011101100010" + "1001111100011000110011011110000010111111101010101001001000110000001101001001" + "0111110000001100000110000001011110110110011111011000110010010000110001010011" + "1000100011100101111101110000111100100100110111000011110110111001000110100110" + "1010010100111111111000011001010100000000011011000001001000001100111011111000" + "0111010111110010100010101000101111100111011010010000110101110000001100011110" + "1000011101011111001011101111001101010110110111001100010010000001001000111101" + "1010100000101101110101000001001001111000101110010010011101100000000100101010" + "1010110111100011010010110100011100000011101010001001001110000101110001111100" + "1010010010010001001001001000100011110110010011010000000000010110000100110111" + "1011100100110011011101010111110110011000001011100110101100011100001010010011" + "1011011100110001000100101110110111100110000000100111011111101000101011110110" + "0101101000100001110110000111010011111011001111100000100101101010111110010100" + "1000100110100001101100100111111010111000001010010110100110101111110011010101" + "0010111110000010100010001001001101111000111100010111101011011111010011011100" + "0000111000001000000111011110011101001000101111111001011000100001110100001101" + "1110111011010111000101010110111000110110110001001010101010000110101011000011" + "0110101111010101110111010111010001000110101000001111101011000010110100000101" + "1111010010010000111001110100000011010000110010101011001010111100101100010000" + "0101011110111101011010101110110010110011101111010001011011110001010010001010" + "0100001111010100010111010001010111100001001010001001010001111011010001011110" + "1110011010011011101010110101111011110101000001000110100111101010011010101001" + "1000010110000001011100111000010010010111110100000101", + "0010111011111010010011101000001110110010110000100111111110111001100101011111" + "1000001000101011110101100001001010101110110110101010101000111111011000010101" + "0001011110111111011010011001100001001001110111001101001101001111011010101111" + "1011000111010111101010101011110110101000010011010110000010101101110100011110" + "0000111001011010100100111100001011100110100010111101101001110100011111001010" + "0000000010000110000010000110011011010010100000101000000101110010011001001011" + "1111011011111111111010010111010010110101001010001100110000101110010111101000" + "0110111110000011000111110001000010111001101010011010101101000100110111000110" + "0000111001011100111010111010110100100101010010011111110000011011011001000010" + "0110110001111001001110101110111010110101110110100010100100111111001101111110" + "0000101100010000111110010100100101110111101001011100001001011110010001110010" + "0010110011111000010100101100011110001000001000000101001000001100011001000000" + "1100010000010011100101110000101110000000110000001011001110111111110001101000" + "1101101010101101110110010001010100111100111011011111001101011101000001000110" + "0000101111101000010001001110001110000110100111111011001111010101100110010100" + "0100110111001101110101011001010010001111001011011100100101001100010110000111" + "0101000101110010010000101010010011111010100010100110101100110110100001001000" + "0011011000101101111100101010110001000101001111111011100100100011100000001001" + "1001100001111010100110001110000101111001000011110000010110111110110001110000" + "1001000110101001100000000010101011111011111100001001101111111011001000011111" + "1011111010101000000000110010101100010010000111000110111110110100000111100001" + "0011110100001110001100101011110000110011001000000011100010010011101111111001" + "0100010001101010100111110110100011011000001001000010110110011010110010100010" + "1011111001001010100001001001110100010101110000110100", + "1001101001010001110100001001000011001100100100100101110110100010011011110100" + "0010010111101000010101110000000001011011101010111100010111100100000011101010" + "0011000110011110001111110110110110011100100010010000110101011010011000010100" + "0001110110111110011101010110111101111110011100100001110110111101000010000011" + "0000111110110010000101100111000101011001110100111111010101000101000111011011" + "0101100100110011101000001101000100001000101001011111111111010111101111011000" + "1010011110100111110010001100111111100001111011011010110001010001011111101000" + "0011111001111111110110111100011000111011100011011111110100001011011010111110" + "1100010111011100111111010000100100101101111011000010000000001010010110011101" + "1000010000010111110101011110111010001010110011011110011011111001011010010011" + "0001101100110010001011000111111110001010000001000010101100010110010010011111" + "0101100110100111001100101010011101010100110100110000001111111110100110001100" + "0001011001010001100001100111000001100111110010001011101001110000010101001100" + "1101100001001110011010101000001000010110111101111111001010011101011010110000" + "0111001100100011110011000111001111101110000011001111001011100001011110010000" + "1100011101001110000111100100100001000101000101101000110111010001111010010000" + "0010000111011000101000011001111101000000101010110110110111011111110110000111" + "0101110100110100010011110011110000001110000000101000010000111001001110011110" + "0000000011010001001010010000100010110100101111100110010000101001101111000111" + "0000000110110000101111010001111101101111010101111000011111111111000100001000" + "0101011101111101100111011100010001001111010111110011000100011100001110111011" + "0010011100111011000101100110011011110000101101100100001001001101100111010101" + "0100100101001000000100111100100100100000111001001000101000100001101010010010" + "0101100110001000110011010010010010101100001000101000", + "0010100010110011011100010100111110011001111000101011011111000001010111110001" + "0011010010101100011110110001111000000111101011100101000010010000001110100001" + "1011011000010111000000100100001010011101011110000001111000110111100011010100" + "1011001000111110101000001111101101010001111001100111110010100011101100110100" + "0101000001010010000011010001011001110001101001110110101001000111000110011001" + "1111101101110000001001100010000111110001100011111101101111110010100001111111" + "1101000110101111000111101100011011111101011000000001000101110001000000001111" + "0101101001100000011110000011000000010010011100001101111001100101011001100111" + "1100010110111100010111010111110010100100011101111000000010101010100011000111" + "1110011110111011111001010001111111111010100000000000110100011010000001101100" + "0111110110110010011000110101111110111110001101011101101110101001011001100011" + "0011001011101111000000101111000011000101101000011111010110101100000110010100" + "1101111111110001010011011111010010000100100110110011111011010010011000100011" + "0010001011011010101111000000100010000101000001011001010000111000111001000101" + "0110000010011110111110111101111100100000111100010101110110101100001100001010" + "1011111111111111010111001100111100011011110001101011101001101010000010001101" + "0000100010011110010110101001110100011101001110010010100010000101111000000000" + "1111100000100010000000001100100111110101011111110110011001001000001010011111" + "1110001110110100010110001011101001101100011100001001011101010111010111010001" + "0010111110001111110100111000101101100110101000100110010011001100011000100000" + "1011110111101010100011110110000000000011111001101101011001011000101100111111" + "0000111011101110001001010110100001110011101101110101001101010000100101111110" + "1000000011010101101010101000011001010100001100010111100010000010100001001111" + "0111111001100100100010111100110101011010110000101101", + "0011111001101000100110111010110111011100100100000000011010011001101011101100" + "0101011101001110000010110110011110110100000001110010100001001010000110111100" + "0110011101001111001101011101010101111100001010000000011011011110010111111100" + "0111101011111010110001101000100001100000001111000001101001011001100101101001" + "1000000000001010001001001001000011011111001100000111001100101011111111010000" + "0010011101011000001110110110000111011101000010111101100010011101111001110000" + "0100011111010010101001110001100100010010011011100111111111101010111110111011" + "0011010101000011001011000101101100110111110110101001110000011001011001110111" + "1000010110011110010000100001001100010000001011010101101110001100101110100111" + "1001001010110010110111011111000101011011110100011000011011001011111110101101" + "1110110001101110010001110100110101111010100101001010001011000001011101110010" + "1111101011111110001001110001000111001010111111011010110000100110101000010010" + "1001011111010110111111001101010000011010101001101000110000101111100000111000" + "0101000001111011011011001110001000000100010100011000100110110010010110100000" + "1101110100100000111001111001001110010101010100101110101101010101000110100101" + "0010101000100000100000010010111001111000010001110010110110100110000111100110" + "0000100110111111101011000001111111110011011000111100001101000001001101101100" + "0000110001001010001001101010010101111010100110001110011011011010011111110001" + "1110110011000001100011100111000110100000001110100110011000100110110100100100" + "1010111001101111100101100111111010111111010000011110100110110100001101000101" + "0100100110000000000110101011101111010110001011010001011100001011010110101111" + "1100110100100101000000110111101010000000101101000011001111001010100111010011" + "1110010111001011100101010011110011000010110100000001010111101100000010100100" + "1011001111110101101011010000111010001011010001101011", + "1101010001010110001100010000110100111101010111001001101110010101100000110110" + "1001001100011110010101010000110010011001001011111000011101110000101110001011" + "0011010110101101111101010111101111001000100000110001000111011111010100110100" + "1110000010011101110101101010111000000000110110110101111001110111000100101001" + "1101110101100000001100000100011011100100010111011010110100101101001111101111" + "1100101110011010110100000000100101001011100110010111010010110001111111101001" + "1000111110111010110111010010100101001011000010100001111111111001011111100001" + "1110111011110101010100000101100100001010100110010110111000111111100001111100" + "0001001100000110001010010011011011100100110001110110101001010100101000100001" + "1101011110110101001110000100110101100100001110100110000010001000001010100100" + "0000101011100010010110010000110110001101101110000100000011110111000111110111" + "0101100001010010111100110101101000100111101111111001011110100100111111001011" + "0101010011011011001110101101100000001101001010000001100000001000011000101110" + "0110101110111100111111101111101011001010001011011101000001101000111011000000" + "1011100001100000000010001111011101100111010101001010010001111100100010000100" + "1101101000111011000010001010000001000110000011000001001110011011011100001000" + "1110100010110110011001011011111110000010000111000110001111100111011011011101" + "1110100101001111101000110010100100011110101100011001110010001001110000000000" + "1101001110101100110110010000110011011010011011010001010111100100011011001011" + "0010011100100000101101110101001000101001100111111101010101100001010100101011" + "1110101000111011011000100111010101011100100011011011100010101111101010010101" + "0000110101010111111100110010100010010101110110100000100111001001101001101100" + "0100111101010001011011001011011001100001001101100110101110010110000000000111" + "0010001001110011000110101111000100101001100010111110", + "1110011110001110111111010010100101010100101000100010010101011010111111000110" + "0001100100001011011110101110111101001110101100100100001110100101110010011110" + "1101111110010011100110010000110101101110000101011111010110100011101010011101" + "0111010010000000001001010110101110100100000100100011010010011011111110011000" + "0100001000000000010010100000011101111010101110001010100011101100011001101100" + "0110111100110111100110100001011100001011011111000111000000101100011111100110" + "0101111010110011100110101110000100100000101001001100100100001000011011011010" + "0010101010010010101000110111110011010010001101110001010011111000110000111101" + "1010111000001001110110101100001011110011010001001111100001101110011100110111" + "0111110010100110001000000010101111010111100100111000001010011101000000101000" + "1010111000111111011011101010011011001100000001001111010000110110111011010110" + "1010101111000000001000101010111011111100010010101111101100000110111011000111" + "1001101010110010110100001001111111010111101010100000100111101001010000000111" + "0011111101000011010010000101110000000110011001011100110100011101000100000011" + "0100001001001011001000111100100111111111011111111110110010100011111101100101" + "1001011000010100001110111100011010010110111001000110101010110111001011111110" + "0110011001101110010010101111000100101010010011010100000011000011111100111100" + "1111000100110110110100101000010110000011100001011001000001010100010011010110" + "0101000111001101101110110100101111000110101110101000011011001010000000011000" + "0001010110011111001010110110010000111100011111001110001101101001110100001010" + "0110110010111101100111110110100100011011001100110110101100011010111001101011" + "1010001111101011100101011111111101011000010010100100001010110010101000101000" + "0001111101010101111100000010100010101001101010000100101001000011010111111111" + "0101001110101111100010111010110011101011000110101101", + "0111000100010110000110101101011101001111011100011010001010000101110001111011" + "1101100010000101110010110010110101100010110011110001101000000000110100111001" + "1110010011100110011010110100110111100101000100000101010110111100011001000110" + "0101111111000011100000011111001001111111110101011101001100100000101100010111" + "0111101010110001110111010011001110101001101110011110001011011010100100101010" + "1111000100101101010110111001000101110000010000111110111111100011100110010110" + "1000001011011011011001000011001011110000001101010100101110011011001110000010" + "1111000011000001010010110000010001111101010010000001010100110111000000100100" + "0101111000101110010100100111100110110100110001010011010101110001101110111101" + "0100110101110010010010001100100010101101001010011010100111111011010101110001" + "0001000001010011100001010110101000100100000101011011011110110001011001101100" + "0101010010001010100010100111000101100111000110110111011010111111001111111010" + "1011000011101110001111110011011110010011111000100000001011010000001000010000" + "0001011011010100000100100011000111011011010001000101001110001110011100111010" + "0101111101101101111101011000110011011110001101001110111110110000100000100010" + "1110100110010010111011111110001111101001001101010011001011001101101000011111" + "1111011101001100100101000010110111011110110111101110110100011111100110101110" + "0100000100011000010001111010001011001110000000111101111101010101110000111001" + "1101011101000010101101110110010101000101110100110011001100010000001000010011" + "0100000100101000011001101110000101001001001111001101111000001101010101111110" + "0000100111011111001010101001100011111000000000110100001001100100100110001101" + "0011011001111100101110000101101000011101001111100110110010110001100100100110" + "0100001011000000000111110001100101010100111110111001000001111110101010110000" + "0111101100111100100100101000011101100110000101001000", + "1001100011100001001011001110010100001000110000100110011000001110001110000111" + "1100100000100110000100101110001101010100100100100000000011100001101100001100" + "0011000110010011001111110010110110010100100100101100101010110010010100011100" + "0110001010111101110001010010011100101111000100000001010001110110100111111000" + "1100100111101111010001110110101010010111000000010000101111001001110101011011" + "0001011111000011101010010000101111111011011110001111001111010111101101011001" + "0001100000100100000010110010001101111101110101111101000000100111010100010011" + "1011011111001111101111010111101000110011011111001110101000111110111110000010" + "1010000111010000001111110110110110101110011000000001100001010000111101010100" + "1110101110011110010010000100001000111000011011100001001000110011110000101010" + "0010000011111111101001110110001100000111011000000011101000101100111000100010" + "1000011101001010000010111101110000010101111000110000001100010100100100011101" + "1001001101111010101011111011111101110111101111011011111001111001010011001100" + "0110101010001001001111111111000011010000101001001110101011111001010100101010" + "1100101000101001100011100101011100100001001101111011111010001100010100011010" + "1011100100101011101010101110001110001111111100000010110101001011100111111000" + "0001111000101011101011110111000100001000111101101100100111111110100111100000" + "0010011111100011111101001011111110100011010000011101011000001100101101101011" + "1101101000000001110001000101000100011101100001100110100101111111011110010101" + "0110010100010010001011101010001001100110111011011010110111000001100010001111" + "0001111000111110100100111001101010101001011100101100110101100100101001000011" + "1101111100001111000010000001110110100101001010101111101010010001100011010001" + "0000001000010100100011011010010001110111110101110100100000101011111000110011" + "1100001110011001001111110000111001001100100111000011", + "1000100011010110000000101010100011111001010001111100100111001100110111110111" + "0100011001111111010010001010000001010010111101100010101000110011110010111010" + "0001110111101110101000000001101001010100100000100011000001011011100111010001" + "1000001111110011000010101011100010010110001001111011111001000110010101101111" + "1011110111011101111000101100001100000111000000010000011100001001110101011101" + "1101101000101001010001111101000001110010111011000100110100101110010011100111" + "1101010110010001110100101100000010110001011001111110111010001001100010000100" + "0101011101000011011010111111011001000001101010110111000000101111101011011011" + "1001101010100110010001011010010111010001110101000111000010111100011101111111" + "1100101110001100101010001001111110010110001110011010100010111011110011101101" + "1011100000100001001000001000101010101010110001111110000011111100110000010011" + "0010110110100010010010111001010111101001001101111010010011000011010011110110" + "1101100111101111101011100110001111101000101111001000101101110101010101010000" + "0111111010100100111110011010000111001111100010101100011011001111100001000011" + "0111110100111011001000111101011111001110110110100100011100110001011010010101" + "1001110100101111111010011000001011000100011100010101101010100011111111100000" + "1101100110001000011010001110111011010011101000111101100111111100001000010100" + "0011111110010010000010001110111101011111011110010100000000000011001100100011" + "1100000001110101100011010001000000100000010111101010000110001101100111101101" + "0100100100110111010010100000111011010110101011111011110100011001001110001111" + "1011111100011010011100010010110011000000011100000111000010000101001011000001" + "0100000011011010010110001110111010100010110001110110000111110100100000100101" + "0100111000100011001001011111011000000101110010101001110100000011011111010010" + "0110001000111001010100100000100101111100001101110001", + "0100110000001000100011101010010111101001010111000100010000001100100110001111" + "0110101001000110111111010011011010100110001010101100101111010100001001111101" + "1001110000101111100001101001110011001010110000011011101100101000101001001011" + "1111001111011100111000101111110010100111001000000000011001010101111100010101" + "0110011111110000100100101100010111110101010101111110010000000011100110111111" + "1010011100100000000011111111010011001011001001011100000011101100101100100101" + "1011010101010100100000101100011100011001011110110001010100100110010001001110" + "1110111111100101100001010011011110010110100110111010011100001111000110101001" + "0001110010010100011111000100010111100000000000101110001011111011001011001101" + "1011111100110001110101011010101101110101001001101101011001101001010010011000" + "0110000110010010010010111000001000010101010101001000100001101011101001001000" + "0000011010010001101001011001011011010111011111101110011100011110110000011111" + "0010110110011011000011010101101110101111011101001011100101101001101011110111" + "1111000111111111110100111000100100100100010100110000011100000110100000100001" + "1111111000111001100111101011000001010110100011010010100101101011011010110000" + "1010001010001100011111100110001111110011010111101010000000100110101100100000" + "1111011100001110101101111010101101000011011110001001100001011001000001110001" + "0010001001110011101101010001011011000100110001010100111010110010011101011011" + "0100101110010111011100100001010000100010101011101010010110111011001001001100" + "1101010000111100010101011011001111011111000111100010011011111001100011010000" + "1001111110101101010000001010000111111001111000010100011100110001100101111100" + "0110100101110011001100111110101110100010011100111100110001010011111010001001" + "1101101001101100101000001110011011100111010000000010010000111010011000001000" + "1000101001000000011110101111011100110100010010101101", + "1111011110100110011010000100000100011111010010010101111100011000110111111010" + "1010101010100110001011011111100100001010100010101100101111001001001110101100" + "0110001100100111100100011110101011111001101111110110111010010111110000111101" + "0011001000011100001011110111110110000101100111000110100111100010111110111000" + "0111000011011000011110100001100101110111111011011100110001100011000000110000" + "0010001011010001010000110011011110110000111010001001101001000101000010011010" + "1000011000010000110100001001001111001010101010001111000100001111010111100101" + "1101011101101011011000001111110101011010001101101010101101110111010111001100" + "0101111111111101101000000010011100110001110000000000001010101101011110011111" + "0111000110010001001100010011111101011101110111000010101100000111010010100011" + "0000100100001111010110100110101011011101111100110001011111001011001000100011" + "1101010011101111101100000111000011100110111001011011000001011110000111000010" + "0001010101111110110000100111011110101111011100110101001011010010000010110011" + "1110111110110100010010100110000010110010011001000000011111010101110001100110" + "0011110000001000101010011111111001010110101101000111100101001011001110000100" + "0111101000010011001110100101100111111111110110110000010111110110011101101100" + "1110011110001110100010101101000110100101101000111011010101011001111011000000" + "0001101101111100010000010011010000010100000011110100010011000011010100110010" + "1101100010010100000101000010111010010101110100110100101110100101010101000110" + "1010000110000100001010100001101010100111101011001001111111001001111111110110" + "1100111111100110000100001110100001101111101001111000001001000101010001001000" + "0011110010111110110000101110000100001100111111100110110111111111001001111111" + "0010011010111100101010110000101010000100001100001010110001010101010010111010" + "0101100101110101001011101000010100000101001000110110", + "0110011100100100011010000010111100001111010000010110001001001110011000101111" + "1101100000011100000001011001111010100010100011100110101100111110000001000110" + "1101110011101010011000001010110110101000001010110001001011001100110100010011" + "0101101000100010111000100010111011011110110011100001011111111000101011100101" + "0000011111001001110011011110111001000110101001011100001011110011111001010011" + "1010101010100111101110110101111011110110001011101101111011101110110011101011" + "0011011110111100111010000000010001011000010101111111101000101001000100000001" + "1010101011110010010011110010111110011101011001110000100110001011011001110111" + "1010010101101010011011101101111001110011101100111101000011111001111110100001" + "0111100000000001000111010110010100011101011000000101100010100001011111000110" + "1110010101100010111000110111100011101001101111000001010110000101110110100110" + "0001100011100011110100010110001111100000100011001000111000100010111001010011" + "0001111001110110100111001011010111001000101110011110110001111101111101100011" + "0010110110101111011010001010011101001110101000101110010010011101010000000101" + "1100101011000110111111101101011110011011100000111010111001110100001000010000" + "1001000000000110110100011010000110010001011101100011111011111110010111100100" + "0011010000010000101001111001000111101110101101000010000110000110110101000111" + "0100000000001110010000000010000011011101010000001010111111101100000100100101" + "0101111110010100011001001011001100111100001011101011011011110011101001010010" + "0011010001110101001011100010000110110011100000110111001111110001001000110101" + "1011101010011000001010000101110101101101111100101010111011010010001010101100" + "1000101111110101110110001001000100000100110000110101000001111000011110010010" + "0111000001101011000011111010011010111011011010100011000011010010110000110000" + "1101010101001010100110000010000010010011010111011100", + "1111110001001000001010011100010001110010100000100100011111110010101001101101" + "0111111011001010111110101000010100000010000011001001111011101001110100000110" + "1111111011010000011101000000000011001111100000110110001100101110001010110110" + "0100001011010111101111100101011011110011101110011111110101100111001011011001" + "1110010011100010000101111011001110100000100101111011000010010010001010100111" + "0001000110010111001100010111000001000000000101010010110100100100000011000011" + "0011010000001001110110001111010001000011001000011000001101110111001100110001" + "1011111011111101000101000110001101010100010111111000011010110110101110000101" + "1010010001010100110110010000000110011111000111111111100101110101001011000101" + "1110101100011011110001010100010011111101010001110011101101111111100000011101" + "1110010111001110000000111010101101010111100000010010001000101100000001101000" + "0101011010001000110011010010000000001011010101010100111111011001010101011100" + "0011000000000110001001010101000010110100110110101110001001110111111000011000" + "1011001100001101110101101010000000010011010110011100001010111000110000000010" + "1000110111111001100001010000101011000001111000110110110011011001111100000110" + "0111000000100011001010101110100111000100001101010101100101101000100101011111" + "0100011110110111000101100011100111000101101011100100111111100000111100010111" + "1001010110110111101111111100000111010010111011010000111010001111011011010100" + "0101110000111110101110011011110100010001000010010001111010111110101111101011" + "0001000100000100110001111101001110001110011100001111101000100011011001001001" + "0101010111010001101101000011001000101110110000111101111011010111001001101100" + "1000100111011010010110011110011100001001100111001011101001101011110111110100" + "1001111101001111100000010101001110110110001001100101010001101001011100000111" + "1001111111111101001100111000001110111010010110001100", + "1011110100111100000010111111100100001110101111001010101010111101001101000010" + "0100111001010010111100001010010101011111111100000001011010010010111110111010" + "1110011111001000011111111000101111110101110010010101010111110011111010100010" + "1011011001110011001011101101010010110110000101010010010000100111001010010101" + "1010110101010010000001001000000001100101001110100001100001111001011011110010" + "1100101000101010001111110011110001110010111000010010000100000001101011001001" + "1110101000110100011010000101011100010101101110100011110111000010101011111011" + "1000101000110010110000100001001001011001000110101110010001111000001000010100" + "1011101101101110001001011101100011000000000100101110100011010111001011000011" + "1110000010110001010100011010000101011111001010000110001111110110010011000001" + "0110010101011100101101011100011001110000001111011110101110001010011000100110" + "1110100110011000001110001111110000001000111110000111000010101001000101000011" + "1011100100011110000011100011110000100011110101001010110010101111110011110000" + "1011110010101111011011010100001011101100010010000001101000100010101001101101" + "0001110011001101011110110110101110110001010001111100111101001110110110111011" + "1000001110101010000001111010000110010111101101000000101010010000100101001100" + "0000000010110101111001101110100101110000100001101110001010010011101001100001" + "0101010001011000110011101100111101001100000101010100000111100011011110011001" + "1100111110001010010001010000111111010010101001011011101001011111010011001111" + "1011010110110110111100000010110111101111101010011001101100000110101100110001" + "0011011011010011110011100010111111001110111000100110001001001111110001001100" + "1101010001100111110100110110011110000000000110011001111110011111010110111001" + "0010001010111100111110100010101001000010000000001111111011001110101111111110" + "1011100110111111100000000010000100101010001011111001", + "1100111011101001001101100110000110111110100101110100000001101110010000101000" + "0111011110011100100011010000110101001111110001001100001010010111010001101010" + "1000110000100100111111000010010010100010100010111100101100010001110000111010" + "1101000110010001001101011011100111000100011000011111110110110011010100000111" + "1000010111100001101011001110100111100111000001001101001110000000110110110010" + "0110101001100001110010101001000010001111010011111110010010111011111010011110" + "0110001011011000001110000111101111001001001010001111010011011111001011101010" + "1101001110100011101110101101000111100001011011011110110010111101111100011100" + "1000110001001100001111001001001111000000110000100001001011100010000000010011" + "1111011011101011101010111011000110001010001110001001011001001101011100010110" + "1010001110101010100000011010111110001100100000110100101101101100101010000110" + "0101100111111100101100011111011011001100010100001010110101111010111100111000" + "1111111101100111010000101011010110000011000011011100011001111001110111111001" + "1111111100010011001111011010000101100011010001101000011001001010101000010111" + "1010101110011001010010001001111010101110001010001100000000100001000100111111" + "0010111010010110111100101100011110001111100001101010011010000111100000011001" + "0111011001101001110011000110101000010111110111111101111111100011000110000001" + "1101001000000101000101101100001010110010001100001100010010010010100001110111" + "1010110011110101011100010011010111101100000011001001010111000000100000101111" + "1010010010010011000100011100111110110110100111010101010010111110011110011001" + "1100101000100010110111100001011001000101001000110100100011011000001001111111" + "0011001101010111111110100110101010111000101101110010010101100111100000010100" + "1011101010010010101110100101000000111100110101001001110110100011101010101100" + "1011111111010101100110011111110010000011011000100101", + "1110001001011000101100110111111100110010001000011100000010100010011010010011" + "1011010001011000100001100011110100010110001111110000000100001111100001001010" + "0010100101011100010010000011001111000011111101101111110101011001010110010001" + "0101110000101011101001110111011001110011000001100001100000110011100110111011" + "1001011101010000111010100010011010100110101011111101101111110000111100110000" + "0100100011101010010100010100100001111100001000000011111100011010001011110001" + "1000010001101000101101110010010110010001010000001110000100010011001111111011" + "0011010001101001000111011010011011000000011111110001010010011001000001111100" + "1011101100100110000010101110011101110011000001100010000011001000111101100000" + "0011000110001001000111100101011111100100000101111010001101000110010100011101" + "1001111101111110010100100110111000010111000001111011000000111111111111011000" + "1111100110100001100001000010101001101101101001011100100011100000011111100101" + "1110010101010110011000010111111110101011010110100100011101011010001011101001" + "1000000010100001001100100011000111110011011001001000100111000101000001010010" + "0011000001101110011101110111111111010011110001111011100101100110010100100001" + "1001010100011101110001011101100000010100011000011111100000111001000100100011" + "0110011111001000010001111011111101101011110011100101110011101101000111000101" + "0100010111110101101111101110101000001111110101100011001011000010010111110111" + "1001011100010111110010100111110110000100101010101110101010000001101100101101" + "1010001100011010110111111101100010100100110111000110101001000110100011000001" + "1000011011101111011001111100100100000111011101010000100111100100101011111100" + "1010100001011111111110111010010111111101010010011001101101011101000000010100" + "1001010111010001111100000100110011010011100011101001111100101001000000010100" + "0011101010011110011100000000010001110011100000110011", + "0011000101111101110101000101010001110000100011101010011011010101000000110001" + "0000001000001101100100100111101011011001100011111001000000110110110110100110" + "0111110010111100001101011101011011100110001001000110011101101011101011000011" + "1101001111100110010110110110110000001001111100011001101101011110010010011011" + "0000010000001000110000001010101101100101011100010000111000101010001010111011" + "1110100011000000001110011010101100101011010110010101100000100111101100010000" + "0011010001100011001100111011011110000011000000011110111000100010010111001100" + "0110101000011110000011001001011111111100111000110100100111111101011101001111" + "0110100101011010110000001000000100000000010111000110011011010100000001111000" + "0010110100100101111101011111100100000110010110011000101111000000101010011100" + "1110010011010011111001001001011111100100001000001001000110111101101011011100" + "0001110011111100000011110011011100110101110101001010111110010101100110011101" + "1010111001011100010101000001011110101101011000001001111100000000011100000100" + "1000100000100010000010101110110010111110011101010101010101000011010111101011" + "0100101001000110101010100100010001000000110111110011101110011100111010100110" + "0111011000111110111111111011111110010110011111110110010100101010111000001101" + "0111010101101101000101001010001111101101001010001100010111001010011000010010" + "0001101000011110001010101100111111111101101011000111010010001101100011010110" + "1011100000110101010111000111011011001000111010010111111001100110100100010001" + "1101010100100110001100000011001101110110110001010110001110001010100100110100" + "1000000101011001011101111001111011000000111100100001000101100000011011011110" + "1100111110001101000010001001101000101100101011100011010110101111101111011110" + "1101001011100000000110110000011000001101110100100101001101101011100010111101" + "1101110100101010101001110100110100000011000011000111", + "0111001100110011010011111110011010101011110110110011001101001101011101101110" + "1001111000101101101101100011000000111111111110010010100001110111100001100110" + "0100111011111001010000110011100100010011000011101100000111111111011111011111" + "0001001000100111001010100011010001110001111100001011010001100010010000110001" + "0101011110110100011111011101010110000100100101010111111011100000001110000000" + "0110011101010100011100100100100101000011110111001110111011101001010110101101" + "1110110010011100001100011110010011001111111010111100001010100010111100101000" + "0111101110101110100111100111000110011000100011111100110101111110000101001101" + "0110101000001000000000101101010100011101110000011000101111110101101110101100" + "1000100010101110010011010110100001100100100100001010100000000100111111010000" + "1001101000100111001001001011000001111101011010010001101010100011010100101111" + "1111100000100110010101001110011001011010011111100110100110001101001010100110" + "1100001100001011011101010011001100011010100100010101001010101110010100011101" + "0110011111000010111010110011100010110100100110110010100111110010111110101101" + "1101111011000101110000011010110001100111010000001110111001000111111000001110" + "0100111110001100110001000111000011110111101100001011010110100010010101101100" + "0000000110010101110000001001010010100010001100001000010100101111010110110110" + "1010011000111010010010001000101001001100110000000011001001011000001100000110" + "0011001111110110010000101101100110011111100001001110000011001001111001110101" + "1001001010111101100100010100000000100011111110001001111101010010110110101000" + "0010110010111100001101010000111010011110000010100011011000000010001000110111" + "1101011101101001010000110110010010011101000110001100011111101100101110101000" + "1011111000001010010100101001110000111110111011100101000010011110110111110101" + "0110111011000010000010010101011110011101101101111011", + "1101101101001111001000010100110100000101101011010110100000101100101000010011" + "1100101101101110111000110000011111101010100000111100100100011001111110110110" + "1100111100010001111011100111010001101010000010011111011111111111011011010011" + "1111010000010001011011010100100101000001100111011011111010101011111110101010" + "0111010100111110000101001111101111001100111000011010011011010001000011111101" + "1001100111101100000000010011100111000011000001010101101101111001110011100100" + "0011000110000010010100011010011110100111011111010010000110100111010000101111" + "1011011000110100010101111111101100111001110000010000101110101110110111100001" + "1100101000101011001110110010010100000101000100110000010000111100100000011100" + "0110011101110010001010011011011100001000010110000101000011001101110001011111" + "0000110100111001010101111000011110001010010001101110000100100110011100000000" + "1110100010101101010100001000101100000011001100111101000001110110111111100001" + "0100111011010111101011101111001100110101011110111011100001100110010000000101" + "0111000110110111101100100000010000010010101010011100101100111101010000111101" + "1000010010001011101001101010010100100110100000001010001010110100101010111101" + "0110100000000111101000110110001001001110111010110111100011010111111010100001" + "0101111000111110110000001110000101011011010111111100111101100100101100000010" + "1101000011011001100000110101010110100100111101010101111111100111011100011110" + "1110010111111000001001010110100000011011010011100011010010110010111101111111" + "0101001111010000101111010010001011110100001011010011110010000001100000100001" + "1010011011010100101110111000100110101001001010110000100110110001010111001110" + "0000010010011001011111001011010010110110011110110001000001000001001100011010" + "0101000100000111111010101011101010100111001110010011001111101000110100011110" + "0011000100010110001010110000010010110110010010111111", + "1011101101011010110001011100011100101110110111111011010110011011011000101110" + "1000000001001011010110000001111001100000100010100000000010001001010100001001" + "1100111011111011010110110001101110011011101001110000111011011111001111100100" + "1100011000100110000010001111011011010011110100000010110110010101110000000011" + "1111000010010011011110100111010111100011101111111011010110100110010101001111" + "1110001001111001001010101001100100011010100001110010000000000000110011000101" + "1101010000100110010000111110100001010100000000011101011001000001101100101011" + "0000011000100110000100100100011100011001010100110100111100111000000010111111" + "0101001011010000011101100010000100001100111001111101011101100011010110110000" + "0101000100101100010000011101011011010110011001011100100000001010010110101001" + "0100111000110111111011000010100010011000000001000111111101111100110101010110" + "0011101111111000111111101011101000011000101011100011100111110111011001000001" + "1001000010111010101001000001001101101110100011101010101101110111111010110100" + "1001000001100100010101001000010010110100111111100010111100110101001111110101" + "0100100111011110010001111010111100111001110111010111100011011000000011101000" + "1110001101100011101110101000011100110000111101100010100111010101011110100100" + "0000000111110010111111000001110001011110010010111111111100011101110000001000" + "0011101110011110001111100100001011101100010000010111001111111011100111110101" + "1011101001110000010110001111011010001101000011011110000000010111110110110000" + "0100111010111110100100001101010011100011111011010000001101100001010101101110" + "1001010001110011100101011100101001010001000011111100110011010110011001111110" + "0001000101001010011101010011100111000101001011101101010100001101100000010110" + "1111100011100101011000010010111110101110010000011011011111010000000011110110" + "0001011000101101111000110100000111001011101101011111", + "1001000010100000110100011001000110000101011101010000101000110101101110001000" + "1011010111110011101110111110100001000011000100101010110100100010010000111001" + "1100010101001100110100001010111011110101110100001100001000011000010111010111" + "1011101010000101100110010101000111001110000100100010010110101010010001100001" + "0000101111101110111001111101011010001000111011010110001010000101011101010000" + "1100010011000101100000101000010011111010010011100001010100000011010111011010" + "0101101001000000011100110100000110010111010101111111010111101001011110011010" + "0100001010010001111001101111010110110000010101111010100111101101011111000010" + "1001101001010010110000011000010011110001110101110001010110111010100011111011" + "0001110101000001010111001000000010111101101011001101110011101100100100110000" + "0101111101100101101011110000100001110111101010111010001011110000101100011111" + "0100001101101000011011000011001000011010101011111110010101100111000101110110" + "1000000001011111011110011101110100100011001011101111100111111101100110001010" + "0000110101111111010111011010110001011110110010010000010101110000110000100010" + "0010100111100111001001000100101101000010101000111001101111111001000110111000" + "0011001011101000001000111001100001101101010010100110110010110100001111001010" + "1011110011001010100100000110100100000000000010001000111011100000111100100000" + "1111011100000111110101011111001000111011110100000001010111100011100000011000" + "1010101111001100101101010100000111101000001110100011000111001010101110111010" + "1001100010011110000100000111000100011101011101111100011010011011010110111011" + "1000001110001101111001010110100110010110010101101111011010100100111001011110" + "0110100110110111011101101010101001001100100100110010101011000101011100111001" + "0000110110010011001100010111110001000000101100000111000001101001101000101001" + "1010111101011011000001100001001011111011111100001110", + "0000011000000010011011101100110010100010000111110010101110010011000101100111" + "0111010111011101100000011100110010010110110110100100110001111011001001000000" + "1001000100000110101011001100011010000110000000001001001111011100001000111000" + "1000010010010110010010101110111010110110101101001010001011110010000100011011" + "1011000111111010111010111001101100010100101110001101000100000001001001011100" + "0101101011111101000100001111000001101110100000101000011110011111100001101110" + "1001101010110110011111000001011110111111101011100010101100001011101101000001" + "1101001110101011100000110010101110110111010010010110110100010000110010101000" + "1010000010110000101100111001100110110100110000100101110011000110010000101011" + "1100101100010110110000000000001111011011101001001001110110101110001110000001" + "0110011110111100000101001110100011001110010011101111101010000100110111110011" + "0101111000100001110100001011010000111011010111100101110100000000001110101100" + "0100001010011101000100010011010101010011000011011101110101010001011000110010" + "1111010000000011110111111001110111101110000001101111111011111001100110100111" + "0100010110001101111111000111001101011110100011101000001111000011110111101010" + "1110101011010010101001010001100100000010110011000001010010100001011001001100" + "0011010101000111100000011100011000100011101010100110100001100100110100011000" + "0101100001101101111101010000110110010111110011011100011010010110100100011011" + "1001001110111001111100111100000100010110000101101010100110110111111101100110" + "1100010100001000101100011011101110011101110001111101100111111000010111011000" + "0000101000111100011000010100111000100101111111010101111111100010010110111110" + "0001101000001000011111101100100101011001011110100111100101111101100010010111" + "0110100010110001111111100100010101100100000101101110110101110000110000001111" + "0010011010011011111100110011111111110111110100000110", + "1110011001001100010010111110000111000001100100111000000101010011010100110011" + "0010010111001010111110100100101001100101110010011110000000000010000011111110" + "0110111110101101011101100111111101000100000100110011001101011010110011111000" + "1100001110101111111010000110100110011010010111001001000001111010011011000000" + "1000110001000011011011110111110000010000101100010110101110001100010110101101" + "0000101101111111001011011011010010110111100100000001101000110011101011111100" + "0010100111100010110101101001010001001110011100100100011001101011110001100000" + "1011001100111001010111110100001111000001010101001001001000011110001011011011" + "1111000110010111110001110000011100101010001100100011101000011110100000011010" + "1110010010001111110111100110101010101001100011001101010101010010001101010000" + "1110010111011110011010010000011110010001001001100101110000010111110000001011" + "1111000100010011000110011010111111010010011010100111011001010000001011110011" + "1000011111111101101000110000010111111010010010110101100001101110000010001100" + "0001111001011101111110110111110111110001010101101100111001111111010101000100" + "1011011110000110101000001001101111110111011011010100011011111110001100110010" + "0110010111000101010011110111011010111100010111111100010000111110010101101010" + "0100111101110110011111110110011000011011110010000111001001100111000001010100" + "1101001011100001101111000010000000000010000111100101000111000110001100010000" + "0100010000011101101000110001100101010101101110111000110111010101010100100000" + "1101100010111000001000000000101001010111011011001111000101111111000101110010" + "1001010001011101110010101000010010000001110010110111011111110010101110110001" + "0000101000011100110110010001110010111111101001110001001101100111000010100001" + "0001101110101000111111011101101001110000001001000010101001110111010001010010" + "1001110100011111110100011110011011011101010010100000", + "1101011010010010000010011000111001010111111101011011001110000101101010010100" + "1010110101000111001000100001111111011000100011101111110100101111101010011010" + "1110011110011011001101101100010101001101000010010100110110110111110000010101" + "0001100010100011011110010011000011011001010000001011111000011000000111100000" + "1101111100011000000001010111110011110101101111001011000011100111111101010001" + "0001001110100100000000000111001100000001000011111001001010101100110000011101" + "1110101001111101111010100010100001011001011010011111110010000010100001110011" + "0111100101000101100101011000001101101011000101100100000110110101001111000110" + "0110010001011111100000110011010000110110000101010111101011001010000111101011" + "1010100001100011001001010100000011000010100110100010001001110101001010101000" + "0011001010111100001100101000010101010010111111100101001010010000010011010001" + "1001100111001000000111001000110011100010101011001111011101111110100101001100" + "0101001101010010100011010001100000111111011011110010110000111111100110011101" + "1010111101101100001101100000010010111101010010100011011101111111110000100100" + "1110101000111011001001000101110011100101000010101110011111110101100110101100" + "0111110000100001110010110100001100010001011101100111000101010110111101001111" + "0100111000110111001000111111011111111001100100000010011000001011011111101101" + "1101110010011001101101010011001111111101010011100110011000011111101111000010" + "0100010100001110100001010100110111001101100110111001000010011001001011111101" + "0011000100010110110110111101001111000111111100011010110001010010010001101101" + "0011111010111011001000110110110101100001010010111000011100001010010100101101" + "1111110001111010100101011010110000000010100010001011010111001000111010100001" + "0100111101110100000001111011101001111001011101111000000010111011110010100001" + "0101110001001110101101000100010100000000110101101010", + "0100110100001101011010011011011110010010011101011000011000111101011011111011" + "0111110001010010101101110001111110010001111111111111111010100011000110101000" + "0110000110100011100000001110010110100011110100010001010010110100110100001100" + "0110111110000000001000101001011101110011001011100100100010000110101000010101" + "1110000000010001011010111011110100001111100001101100110100010001001001000110" + "0111110101101000101001011001000101011111100010111011110011110001101100000001" + "0111011011011000000000101100100011110001011010111000101111110110100000101100" + "1111100001001100010010001010101010011110110011110011100010011101011010110110" + "1011000111111111110110011101101100101100000111100000111111100000101011000100" + "1011011000101010100011100100000000100111111110101100101000110111001001110110" + "0110110000011101110001110000100111100000111101000010000111101001110001110011" + "0111000001100010111101010011110011111100111100110111010010011110110101110110" + "1111101011001110100100010100101000011100001100011001010100001010110111001010" + "0100101110110111110000001111111001111100011101010001101000001000010011110100" + "1001110011011110110110001110001100111001000111101000100101101101000100101110" + "1110011001100100011100000000101110101000111010010110001101111001001100110011" + "1010110100000000010011010101000100101010110110000000100101010101101001101110" + "1110011000000011000101110001000001010111111001011100111111001001100101010101" + "1001111001111000001000100000101000011101010111110000011110110100001011100000" + "0010001110110010000001100101111011010101011101010000011011101000110111000010" + "1110100100100011011010011001110011011110011011111001001010111110100110010111" + "1100100011110001001111101001100101111101010010011111011001111011001110011001" + "0110110011001001011101000011101100010111011000001010111010101011011110100110" + "0000010011011100010000000111010000101101111000001111", + "1111111111110000011100011110011110010111001011101101100001101010001010010001" + "1110110001010001011110101010110010011011100101110110011110011101000110100000" + "1110000001101111011100000111000110100001100100010000101010100010001000100010" + "1000011110001110110000101000100100111001001011101011100111000101001000101010" + "1111111001110111111101100001011111101101010001010110110110111001101010011110" + "0000001000001011110001110001010111110010101001001101001100011011110000010001" + "1011001000010111010001001010101111000110001011100010101001010000110001100001" + "0010111001001000001010001011111001001010100100010111110010001101111101010100" + "1110010100000001001000011100001101001100001010010110111111110111000110110100" + "0001011110100111011100100111101100011000110100011000000110100010000100011000" + "1000111010010101101111001011001110110011001011011010001110001001110110011111" + "0101011111110110010010010111010111001111010110011101000110101100001101000110" + "1011000011101011000011111110010111100101001011010000010100001001011110001101" + "0110001110011000101111010000011100110101011110111001111011001010100101111111" + "0001000100001111111110011000110011011000110010000100101111101110100000101011" + "0011011000000111100000101100011101010010111001000111101101001101100110000101" + "1000001010001100100101001110110100010111010110101001010100011111110000001010" + "0100100011000010010001000100111111101011100100111111111000100100001101100000" + "0111110001100000110101110011000011110010111100110100111101101101010000110110" + "1000110111111010000111101101000110000010111001111111101001001000110110001110" + "0101011110100100101010110100111100010000010101101111111001011010011110010110" + "1001111111011010100000100011110010110101010010010111101010011100011011000100" + "1001011111111001110100000110001011011110000101111110110001011011000010101101" + "1011110010110011110100111100001100111010110000011000", + "1111001011000001101110111101011101010110101100101001000110111111001101111010" + "0000111011110000001111000101001110001111100110000110010001001110000110000101" + "1011010101110001010011111111001010011111111110100001111011111001011110011001" + "0000000000000101011111110010100110000010010010101110101101010010001001000001" + "1100000100010100001001110100000110100011101111001001011110100111010101011100" + "0001111110100101010101001000000010110011010110011011011110011101111110011000" + "1100001100001111010011110000000010000100111110011111000100110011100001000100" + "1101111100101111100011001101111110010000001010001001111000111110101111010010" + "1110110000101010010011111010001011110101011010111101110111111100000000110101" + "0000001001011010001011011111101010010101100100100101011011010010111000100010" + "0101011001001100000000111111101100100011011101010000110100100101111101010011" + "1101101111010111000101111111101111101001000110011001000000001000110100110110" + "0100010100110011001001111101010001000111011001100101001011001010001100101110" + "0101100100111100101101001001000010010110101010111000101011000011010011110111" + "1100000101011100000010110010001100101010110100111100000010111010100011011100" + "0101111001001100010001110110011001010111110010110101110111111001100111011011" + "1111100011010101101100001100110111000001011110000100111110101111001001011010" + "1110111110110100111110100101000101011110010110000011010110010001100111110101" + "0101101100000011100001000011100100001000110001000111000010100110010111001011" + "1011010010011000011111101000011000001111100111011111010110101110111100110011" + "1001100111101110101101011111011100111110000011000010111111000011001001011011" + "1010011101001100101000011100010001100010000100111000010000111000000110110101" + "0101111100110001001101011000001101001111010100010100101111100101101111101110" + "1011010010011110101111100100001111010000011101100110", + "1110011100010010111110111001100110000101011011000100010101000001001001100111" + "0010011101011010111111101000100000000111100001000010010010101000000100000011" + "0010110101000010011000111001101111110111010010010001110001110001011001001110" + "0000000010001110001010110110110011100100111000111100000110101110001000011111" + "1110000100011101011000001111000111001001110011011011010100011100010000000001" + "1100100110100011100011100010010010111011111101100111000110010000101011010011" + "0000001000000101010010010000100001111000000001000101111111010110101110010011" + "1001100100100000101010001000110110101000011001100111011111010010001110011110" + "0011111010100011010111110000000101100011000011011110110000110001001100101100" + "1011101111000011110110101110010100000100100110011000010001001100101101110111" + "0011111011010100111000100100110100011100111100000011011110111011110111111100" + "1011111100000010110010111111111111110100010110111100001001000001110010101101" + "0100100101101011100101010011101101110010000101100000011010111010000001001111" + "0001100111010000001001010000011000000010110000000100000001110111101011110011" + "1110110000100110110010011011111000100011011001111110100101010000010011100001" + "1011010111110101100100110110101011111101000100101101101011000011110100001111" + "1101100110000000001111010101110110011100001111100100000111100000111101110101" + "0101011110110011000000111001001100000111100001100001000110010011001100010100" + "0110101000101010100111010100111011111010101000010011111110001000101011111100" + "0010110010110101100110111001110011000101001110011101000110001001101010011111" + "1101010000110111111001110101000100000010111100110111100110011101010000010010" + "1101111111100010001111011110000000110101111001010100011111000010100111100110" + "1010011001111000100011100101100000010100101011010011011101110001111000010100" + "0001101010010001111010110011010011111011001010011010", + "0111110001011110100001100010010101001001111101001001010100101101111101101100" + "1110101010011001010001100101111101001100010100110010101011100110110111110110" + "1001010100100101111100100101010010001100001011110100011111000000001101001111" + "1101101010001000010101000101110010001101110011101111011111111101100111001001" + "1001011100111111011111001110010010110011110011000001000111100111100000001101" + "0111101110000110000001001101010110110111000010101000011010011110001100110101" + "0111100011101010000100010010000011011111011011000010101110111110011011100100" + "1101100000011101010010000110001100110100110001110000100001100110100010011110" + "0100110111010111011001111001010111100011111101110011110101111011110001111100" + "0100001111110100010000110010000010110100111001001011010110000111001110110001" + "1010110010111010010011000011001101111000011001010000110001111101010100101011" + "0101111111011111010000000000111011101100011110001100101101001010110111111010" + "0111100110011001000000001011111100101100101101110001000101001001110001110111" + "0001011101101101100001000000011011100110000001010101110000011101000000110101" + "1000000001010110100000110010101011110000101000111110000000111110101111011000" + "1101100111111111111011101000010011010011000001000000111100000110110111100000" + "1011010100111001101111101001111011011101110010100000011010111000010000101111" + "1101000101101001000101111101001101110000110111111101110001010111101000111000" + "0100001101111010110101000111111001000000100100100001001001010100000101101110" + "1001100100000001100100001100000000111100011001011100100001101001101001011011" + "1111111001001000001000110010011001000010101000111001110010111100110000011011" + "1101000001100101101001010010101000001010000110100100000110110111110101101000" + "1110000100011110110100111101010100001100000110100010111110101100000001001100" + "0001010001111110001101010110011111111111011011101101", + "0100110000101010011101001111000010110010001011001010001101101011010100000111" + "0101011011001101011001010010001101000100011110011110001000101100010010100110" + "1011001101101010111000001010110101101100010100110100010011010000111100101110" + "0101010000110010100010000011001100101110111110011001000001000100101111010010" + "1011110001110111110100110110001000011011000000111010010100100000100000100100" + "0000111101011101010011110101010000111100110011000110110110100001010100110101" + "1111011100101011010101010101000100110111001100000000110110101011100100010111" + "0000101101011000010101110110011111100111000001101000001011010000010000000001" + "0001010110010011101100000100100010001110000101100101101101011001100010011101" + "0011000110111011010011010100111111111111100100110110011000011010010010001010" + "0111001011001010111011101100101110000000111010110011011011100001110111111111" + "0010100100110101110000010110111011101001010101010100011011100110001100001111" + "0110110111010000010000100111111110010011011111001011011110101101010011010100" + "0100111101011000000111100101001010000010000111111011100000111111101000111100" + "1111100000010111101101011001101110001010010111101001111000000011110111100111" + "0010100110111010110111101100011011100101110100010010011000100000100000001101" + "0101010000010001110111010100100000000101111000001110111101010000010010110011" + "0111110111010111010000000101010011011110100010000001101000101001111100011111" + "0010011111011010101111110111100011101000100100111111000101101010011000000010" + "1100110111100011011111011111100111011000010101110110010011010011111110111010" + "1101110010100000011011010010100101111100110110010000001111001110001000111110" + "0111011100100010100010001110111111011110010110111100001010000110000111110001" + "0011110101110001100001100000000101001110011000010101001010010111111110111100" + "0110100000000011011011111000100001101100111001111011", + "1000010110101111101000001010000111100101111110000100001101100101101011011011" + "0110001101110110001101101101101011010011011000010000111111010011110000101000" + "0010111110101101000011011001010001111110111001100101110101010011100001001101" + "1100111101101101011011000101000101101001100110101111001010110101111101101011" + "1101111001001101001110110011110001001110011011111111110000100011111000110110" + "0001000001111100001000011111000000011110101000110111110011011001111111100111" + "0100010100010110000010100001011100101111100001000100101111011111101110010111" + "1110111110001001100111000101100010010100111111101001110001010010100011011010" + "0011001010101000010111100110001111111001011011010100111000001110010110010000" + "1101111100110000000100000100110110011010001010010100010110001101101000111000" + "1010101011110010010011111011011110011101001110101110100110110001110000101010" + "0101001011110110010100100000100001010101010111110011011010111010100100111010" + "1000111100001110110101111010110110100000001111111100000110011010001001000100" + "1000001010010100100101011111010101100101000000001110000100000001111110100000" + "1011101001011001001010110111000110000110110101000100010101011100100001000011" + "0110001001000110011011011000011010101011000010011001010011110000110001110100" + "0000010001110010010101110001000001111010011100111000011111111111000001010010" + "0110011100100011001110010100111001001000011011001011011100111000111101010110" + "1100001101101111101001001100010101101001011101001100000011010101101111101010" + "0011011010101110100100011110001011010000011011100010000011011111001101000010" + "1110010001101010101001001111110110110010011011001000011100111101100000000000" + "0001110100010010110101100011110100001001011011011101010000111010001101110110" + "1000001100110011001010101000011100110011110001001110010000100011010001110110" + "0100101011100011100111110111111000111001100001110110", + "1100010010100000000100111010101111000010010101001110010101001000011110101011" + "1001000000001010010001100000101111000110001111000011111111010000100001011111" + "0111111100100011010011000011101110101001000111000110110111001100100001100011" + "0010011001110101000010101100001111111101101000001100010010011110100100111111" + "1001011100100000011110010110111010001001111111001010000110100111110100111000" + "1111101000010001100001000011101001110101100010010011011100011101101110101011" + "0101100011110111010111011010110100011011011000001010011011011011110110001110" + "1001010100110111111100111100010011011010110000100100000011111000000000011110" + "1010110101111111110110000111101100010011101010001011100110000011011110000010" + "1110011010010001000111101011001011110000001001011101001110110001101010110100" + "0110010111100111111110011111110111000101010110101101110111111101110110000011" + "1100010010001100010100100000101001101011011100001010101010011101110001100111" + "0010111010110010001001011110010101110001000100000111100101010011110000110101" + "0111100101001111100101101110111111011011100110111011011000000101100011101111" + "0110010000000000011111111000100011111101110000001001110011101011100010101011" + "0011100100001101001100100010100000111000101101010101110000101110001001111011" + "1010001000100010001011001010101010100100000001001101100011111110111110000110" + "0110110011101110010110100011011001110000000110100010011110011000111011101110" + "1110100000000100101010010100001010001100111111011010011001011110110010110100" + "0001111000011011100011101110010001101011011001000101110000010100100011111000" + "0111010010100010101010100010110110001001000111001011100101110001110100101001" + "1011110000110100011001010010010010100010100011001011110110110011110010110001" + "0100000011101010101100111110110100001100010100011101011010100100101110000001" + "1100001010010100010000000100100110010011010111000110", + "0001100100111000001000000100000010000011100100110000111110001011000000001111" + "0001010001000001000100101000101101100011111001010110101100011111101100101011" + "1010000000011011010111001001011000111000110110001000111001010000101001011100" + "1101001011111110101011000000110000101101001101101000010111100001111110100111" + "0110001110011100101010101100111011000100111010110110111011001000101100111101" + "0011001110000101111101111110111110001001101001010110101001100001110010011011" + "1000100010010101110011011111000011101011001011010011000011111001000010010001" + "1001010001100011010111010000111100001101110011000101001100010100111010011010" + "0100000001110000011010111001000001011010000001011111100110010100000011010000" + "0011011010010100101001110100101001001010110010110101011001001110100111110000" + "1101100001101000110011101001110111100111100001011111111101000101101100010010" + "0100111010001001011100110011101110110111010001000000110011101110100111110001" + "1010100010010101011010110001000110110111100100011100110011000100101101010111" + "1000000100001110001100111010011010001011110011111011011010011000101101000000" + "1011101011111100010010010100000111111110111101000111111010000010100110000111" + "1101000000000011100101101111001111010000110001110111000001010100111100110001" + "0111011000000101010101010100111110010001111111001110010011011110101101011110" + "1101111111110000001010111100011010010110000000001111001000111111110011110101" + "0000000110011110000100110110000010011000110100110111001101010001110101111010" + "0000101111000011010111001010110111011101000010110010100001100000011101110110" + "0100001000101011001101001111000010001001000100001010001010111111011101101101" + "0001000100101111111101101100111111111011110011101111000011001001111111000001" + "0011010111100101100101011001101110001001010010011100000111111110100010110011" + "0111110000110100110000011101011111011000101001011000", + "1111001000101011010100111010001101100110110001011100101011010100010011111010" + "1101010011010110010110111101011100000000111001011110101101111001100101011011" + "1010001110101010101001010111010000101010101110110001101000010111000000110111" + "1101000110111001000001001111010011111011000111100000010111100000110110001111" + "0001110100111101110100010011101110110101011111011010101000001010011110001101" + "0100100111010101011001110110101100111010010100001110000010110100000010111100" + "1110100100110001000101110010110110100000101100000000110110110110111010110001" + "1010010011110110111111010100110111010101111101001100010110100001111000101101" + "1111111100110001110011110010000011011110011100100101010111100011101110010010" + "0111100110101111111001010001011110000101010010111110001101100110010110011000" + "1000100100100000000000011000010111101100111110011010111110000111010110001111" + "1100101011011101111110011101000000101000000110110111111001010010100000001100" + "1001101010010100001001100011110111010010100000011110011100101000011111010010" + "0100101100110100101011010101000010110101110000000111001010110000111000101011" + "1010010000000111011011111011111011110111110010110001010110001010001110010101" + "0010111100000100001010001101110000011100101111011111110010100100000111010011" + "0001001000111000011001101011001100000000101100111111100010101101110100000000" + "0101011011100100100101101100100001010011000100101100110011110001111000001000" + "0111101011000000000110000100011010011001101001010101010111001100110011101101" + "0011111000000010101101001011000000001011001110000000010101111011110001001100" + "0000010110110101000001110110100110010000010101111010101100011000111111011011" + "0100010100011110011011011011101101111000111101101000001100001100110010110110" + "0011100011011001101000101111001000010011011111001011101000010111011011110111" + "1101100100011001010101011010000000111100100011010000", + "0110001010001100011111100011010010000100010110010010110010000010110000110011" + "1011110100000101110001111111010110111011001000001111101000010000011111001010" + "0111001010101111101010100111001010011111000001000010111110000010011011101101" + "0111111100011101000001011110111001100001101000001001101001001101000100001001" + "0110001111110001100010100011010100101000000101100011011001011100111010001101" + "1000001000110001111111011001101000001010111011110000101001111010110101110011" + "1000010111100010110000001111001110011010101111110100101000000000111001101001" + "1000001101010100100110111000000011111000001010010110011011111111001000100001" + "0011100010111011011110001110101101011101001101110001101100111011111101011111" + "1101100100010000110111010001100100010110100010000101101111100011101011000000" + "1101010010010011000101111101011011001101101101011000000101001100110010111111" + "0111111001110010111101111010101001110000010111001001110000111111011010010001" + "1011011110011000100001110110101110001111001101010111001110001000110011001011" + "1011100101010001110011101011001100110100110011101100010111010001000110010011" + "0010100100101100001000111001001100100000101110100010100000011001100010110010" + "1100111111100010000110011011000011010001101101110000000000000000010001101001" + "0000101001111100000001101100001001100011111110011111101010100111101011101011" + "0000101110011101101101101100011000101111010011000100001111101101011010110011" + "0101001110101000101111111000110001100011110010100001111100100000100110000000" + "0001000001110101010111000011001000000011010100100101110110101110001110110000" + "0110000011011001100101010110101111000000001011111110111101000010001001101010" + "1110110010011000101100111100001010111101000110010111001000111000001011001011" + "1111111000111111111010101010110110111010001111010101001011000001000011011100" + "0001111011111001101000111001000111010111011010000100", + "1000100011011000101001010101101111111100110111101101010101000001111110001010" + "0101010100011100111100000001100111010110001011100101110011100111110011110100" + "1011111011110001110110110001001110100110000100000001010010110100101010011101" + "1011110011100111100001110101011000101001100101010011010110110101001101111100" + "0000010011100000010110000000111010101110100100000101110010001110111011010000" + "0111111101010100111110100110011100111011100010011011001010101111011010001100" + "0111001101111010010101001001011101111010010010000101110011111111011111011101" + "1110101001000011111011010110011000100100111111111010001000010110000111010111" + "1110000100100010001011100010101111101011001110111111100101011010110000100100" + "1000110000100010110011110101011011100010100101010100001010110100011000110110" + "0101111100011001001111000010100000101010001101101001101101011001001101110000" + "0011110100001100011100100011100001101111111101001100110100111110110000110111" + "0011101101100011100010101000010001100110100010000001111111011000100101101110" + "0001011010010000101101010010111111110100010100010110110011011101011101111101" + "1100100100011011101101110100000000010100110111001011101010000011001001110001" + "0101101011000011101000101111110010100001010001011010010001011000100110001000" + "0100011011101000001110101101000000101101001100101110100000111000101000101010" + "1000100011101111110111010000101111101001001101101100100100111010010100101001" + "1011010110010100001100100100100100011011011001000011001001110001000010100101" + "1011101101010011101010111100111000110011001110001000001011010001011110000010" + "0110100001111011111100000100101010000000110110010101000111000101110111000011" + "1101011101110111001011011111100011101101101111011010000000001111011011010000" + "0110100001001010011100000100110111010100011110111100010010100000100011110000" + "0011000000111100010000010100100011110111100010101110", + "0010010101000001001110010100110100100100101101100101101000100100100101110011" + "1111011101101010010010001101100111110011010001011001001001101110110011000000" + "0111001000110000111100011011110101000111111000100110111011010111000010101100" + "1001111010011110000001111101110100100111101100110010011101010101000100111101" + "0010101001011000100100000101101111001001110000011111000000001101010011011101" + "0010000010101100100001100101010101111100100110100101100111010010000001101100" + "1110100011010000111110100101111101111100011110101110011100110010101110010001" + "1100101001011110001110010011010111100010101100100100001010100111000011010101" + "1101110010001011001100010000011011010111000010110110011100011111111011100110" + "1101010011110010101100010110110000011010000101010101010101110011100000101101" + "1001101000001100101110111111110010100011111100101101101000000100011100101111" + "1001111110100011101000110111111000100110000111101101111000001010011011011100" + "1111010101000101010000100101011010000101100111001111101011110010001110011000" + "0101001001010001100110110100111010001101111100010100000011010101111000001001" + "0001010000101000010001110100010001111011101111101010110010110011101000100100" + "0110110000101001110011001010001110100110111001011001001101001101110001110000" + "1101111100111111111001001000110000100101001100001010001110011000000001001000" + "0011010010101000011010000110001110001110000001110110000001101001010000011001" + "1110110100010110011001010010000001001001110001010111101100010100011101100000" + "1111010100010010011100001011011101000111101011010110110101001100011111100100" + "1000000011100111100110110100010000101101011010000110011001000110111111001100" + "1111110110001001100110000101101011010000100010110110011110011100000001001001" + "1111100011001010110110101101011110001011101101000011100100100010101111000001" + "1011100010100011011110101000111001001000000100101001", + "0110101000110001001000000000010001110101100000000001101101110010000001110000" + "0010011101101100000000001101011100010000000000100100011000101011010001010100" + "1000001000100100001001101111011001000110000001100001101001010100011010100101" + "1101000101001111111111110111010001111111000011011011010110011111010111000000" + "1000001011111001110111110101010101010011000101000101110010001001110001111101" + "1011011010000100101001101100011011110010100100001100001011110101101110110000" + "1111001000111001111000110101101010011010010101101111001100111111100110101000" + "1101100110011101000110110100100011110101100011011000110000111010100001001000" + "0001111101000111001011000010010001110001110111001010011111111010110100110000" + "0001010111011100100010011010001111000100001000101111100111001111001011001111" + "1110100001001100010100110010011010110100000001101000010111001011110110100110" + "1100110010010110111101010100001010110001100011100011100111110011101000101100" + "0101111111010100111000111011110101001001001101110111010111011011111000110110" + "0010000011010001011010101000110111011001011100000011101101010101110001011010" + "1101001100000111101010010110101001111110100010011100110010011010111000111001" + "1000011100111010000011010001111001001101110011100001111100010110110100010000" + "1110100000101100100001111001001111000100110001111010111001111010111111010011" + "0010011100001001001111110010000111111110011111011011101110000010011011001101" + "0110000010010101011101000000110110011010100011000100100100001000011000111011" + "0110111100101101100100010000110000000111000011110000010100111110101111111110" + "1110010101010100110110110100110110101101001011011100001101100100100001010110" + "1001010100101110001001011010000101000011101001101101110000111001011011000111" + "1011111001011110110110010011101000100010000010000101110011000010010101100101" + "1101001010000001001011111011000010001001001111110000", + "1001011000100110111000111110010011010010100110011111001111110001110010000111" + "0000111010001001111111001101100111100110100110000001001100100010001110101001" + "0001110110011011110010011010011001101100000110111010001000011010010011001011" + "1011000010011010001111010100011000110111010111100100001010100011111011111110" + "0110101000010001110011011011001101101110111110011011100000111011100100010101" + "0011100100011000000101011001101000111111111110111011000010001101101101001001" + "0110100111111100000111010000001001001110110100010110010011100101010001100000" + "0011110100110001010100001011111101000010110100100011000000011000111011110000" + "1010110011111000111110110101110001101011010110000000101001110001011101111010" + "0001000001111001000100001100000101001101001100010100100000000110110010010000" + "1011100000101000001010111110111010011010101101010010001111111011010011101011" + "0010110110001100000110101100010100100010011111101110101111110101000100000001" + "0011100000100110110101000010001011100010101111100010011001110011010101111010" + "0110001010011100101010110111111011100000100010110001101001100010010111001011" + "0010110101111100101111110000100001010011011111110010100010010101110010000110" + "1000001000100101110101011001000010101010000111010010100010010101011111001100" + "0111100100110010000011111001101100100100100111100001001011111001100101110001" + "0001000011110110001100111010100100111110001111101100101101001010010001000101" + "0100110100101000101011100100010001100101001000001110011011101000010100111111" + "0000101101111000110111100110100111010001010100001100001111100111010101111010" + "0110101100100110010011110001100110000110101001101100010111011010111011100110" + "0011101101101010010111100000010000110010110111011010011000010000001111010010" + "1011011011100011001110111010110111010001101100101011000011001100011110010011" + "0010011010110010111101010111001111100001100001010100", + "0001000101011001011110110001110011011110011111111100100001000100111001000111" + "1101010000000111010010000111111001100011111011110101100111010110011100001111" + "1111100100100100101100010001101100000100100010000101011011100110010110010011" + "0010000010000111001111000011011010000010001100001010111110010001010100001000" + "0100100000110101100100110110110110000010111000000100001000010000011110010100" + "1011010111111000011101110000110101101101111000010011010111110001111111101111" + "1111111010001111010110101011011000011010111001010110110001010110110110000110" + "0010111111000000110101100111010001011000010110111001011111010110001101001100" + "1111011001111100111000110011111100011110010110011111111000110100101000110011" + "0000101100110011010001001101000000001111110111000111000100011110111011000111" + "1001110100110010110111111110010011110000101001101000010011011000011011011010" + "1011011111011001111110011000011111001001111010101100101100100100001100100101" + "0101100000111001011101001010111011100100010101001000000010000101111100000100" + "1111000010111101000111111010101101010000000010111110111010001000101111110011" + "1010100010101000101000101111111101000011111010011001110101000011010111110011" + "0001001110101010000100000010101100000000010100111100001010101000101100100011" + "0110010010001111100111011101011001011110000011100110001011100001110100011000" + "1001100011111100111101010110010000101000001110001011000011101011000111110010" + "0100010001010101001011111110001010001000111010010100110101000110101110011101" + "0010011111101101100011100110110010010100010011100100010010001111001110101000" + "1110101010101101101100011101110001100110000001011100110011111110011111110101" + "0100011000101010101101000011100010101100110110011010100000001111110110010000" + "1010001000110111001111101101111100111011000100010100001001101111110000000101" + "0110011011001101010001110000101101010101000110001010", + "0000000010000001001001000000011101110010111110000111000001101001011011000110" + "0100011110011100100101011010101011010100100111001111000100110001101101001011" + "0000011100001111101001110111000000010010010000001000000001011000110011100000" + "1000000100101101111111100001110000010000011001010010111011110010100111010111" + "1101100111000111001011010111010110001110101000001010111010011100101101000000" + "0001011011001111010011001001101100000100010011111111011011110100011101011010" + "0001101111010111111000101000001111100001000101100011010110111000000111110000" + "0100110010000010110100111111101010011110100101111101010101101100101010111110" + "1101111010010110011100001000110010001010001000101001010010101001111100001000" + "0001110010101001000001110110000111001001001011000010000000010100011011010110" + "0000101110011000011110101010001110001010100111101101000001100111101001101100" + "0111011101110111110001010111101001001001111100011010001110101101111111100111" + "1111010110101100010001000000010010000111010001001110101100100100011000100101" + "0101111001111001011000001100010001011100101000001100011101111011101110010000" + "1100100100010001101000111000011011111011100011110011000110100011111001100101" + "0000010101011011011011101100010010111011000111101001101010010101111101011000" + "0101110101011101100001010100011110010111111011010111111110001111100011110100" + "0101011000110011001101111100111010010111000110001110011001011011011011001011" + "1011010011011111110100000001110111001011010101100000000001101100001100011110" + "0111001000011101110011111110010111100111010110001000101111010111010001011111" + "0111000011001001001110101110011111000001111110111001110000111111000000000010" + "1001000100101110110000101000010101010011011110110100011001101000011010110111" + "0110000101101111111000100010100101111110011010110010100011101101110101000110" + "0100100000100001100010011111100011011011000000110110", + "0010000100100111100011011010101101101110000111001010100000110111001110000011" + "1000010001110100100010001000001010101011111010011110011101010111111000010010" + "1111111111001111101101010011010010011111011000101000101011000010010010010110" + "0001010011000111000111001011101110001111000010110011101101011010101000111001" + "1001110001010101101011011100110100001111000111011101001110001110001100101000" + "0110100100100100001101010001010001101111100100101100101011011111001111111111" + "0100100001111110101011100111100101111101010101000001000100010010111000100001" + "1100000111001110110000010101001110000111011011010101101100011110010010000100" + "1100000001110100001001101011100110010101010100010111011010111001111101111010" + "1101001110001111011101000000100000111011000110001100001100111111110001000111" + "1000101111010101111011000100011000111010011100000111000001011110101111110100" + "0101000110100011011001000010100100111110101100111010100001001100010001000111" + "0001001011011101001111101001001001000001101000001101101000000011101101111011" + "0011000001111000000110110011010010100110110111100001001011011100010101100110" + "1001110011011111111100000011000000011011011100111101010111001001101101001001" + "0111110011111100000001101001001010001001001010010101011101100011001011001101" + "1001011101001011011010110010111111011101000000010100111111110101001011110101" + "0111001010000110011000010110110010110100100110101011111011101110001011100110" + "0111101110000001010111110101110100111111001001100110100100100110010100000000" + "0100011000101010000001110001110011100000111101011000000101010100010101111110" + "0110000110010010011011110111001010111001111101111001101101110111111110000001" + "0011101110000101111011111101110011110111011010111001100111101101101000000101" + "0100100010000001001001100101011111111000001111011101100001101000100000000001" + "1010000000011101101110011000101000110011000100010100", + "1001110111000001000110001001000010001111100000000000010010011001111100111010" + "0100100100101000000000100000100111110100101000101001000110110100101111001101" + "1111100011000111010110000011111101000111000001001101000110100101010011110001" + "0110101100101101101111010101110011100100111010000011011011010101000111011111" + "1010111100011110111011011001010111101001001011101010100011011010001000110101" + "0010010001101000000011111001101011011001101101010111011110111000100110110101" + "1100101011110100110100111010000000111001100111101011100001011011011111101000" + "1010101111000101011100110001101111000110011011100010011111101100100000011010" + "0011110011111100010011100111101000100010101001010010111101100111010000101001" + "0011011110011110010010100010010100111100100101001011000110001111101100001100" + "0101000001101000100011010001111010011100010111111101101001000100101001100011" + "0011101111110001111011111001100011111100011111010101011000110001111101000101" + "0111010001111001110101001101110111011101010011001111000110100011010010100110" + "1000010010000111101101101001000000111000001100100010000101110111101100001000" + "1011111100011111110010110010111100101100011000100000101111000010010011111110" + "1111000111010101111000000100000010010011010111000100111000000100011110010110" + "0000011111000100001001000101010110010111010101001110001100101001111110100100" + "1111110111101101101001110100110111111100101101100011100101100110000110110010" + "0000100001000111010111000111010011110001010001101111100110101010000000110000" + "0101000011100111110111000111100000110101111101000100000101111011100010000000" + "1010010001001000110000100110111110010101000101111100011000011101100001000001" + "1111101100101011010100100111110110001000011001000011111111110110001011110000" + "1011001010100100101001001001000011010010010101111010100100101100001001001001" + "0100100101010011010000111101000110111111111100001001", + "1101011110100011111000011100101010001100001011111011101001001000111010110101" + "1011100110100111000000011011010110011111110101110110111100001000001000001010" + "0100110110011110011001101101010111101011101000100010100011001111100000111110" + "1101011101111100011010100110100110011001111000000011111010100100010010000011" + "0001001001111111001001101101111101111101100101111110111100000000101111001010" + "0010100100111100101100111000111101000100010110101110101111100000010111100110" + "1111001111000001010011100010111111000110010111011011001100110000001111011100" + "1110110111101111001010110110000100111100100001001010111111000111101101001010" + "0101100001001110011100010111001110011101001001011010011011010111010101001010" + "0010011010110001001111111100010000010000000011111110001111110011101010000000" + "0011000100000101010100100001011111010011100000101101010010010000101001011010" + "1101101110111010001101111111110001101110100111101110000110001000001000111101" + "1001011111100101111000111011010000101101111101110101110010101001000101101000" + "1101110010011011001001100000010011010110110101011100110010110110101000110010" + "0111000101000111010011010110101111101011101110110010110100110001001110111100" + "0001100011001000010010111001001010010100100010101000111111010001111011000100" + "0101111010011011001000010101100010011100110101101110010110011101011010101001" + "1100001000100010100111101100111110110000101000000000001011001110000001001000" + "0010001000101011000000000010110111011101010101111011000110111000110011001101" + "1010000000001100110101110010101101000011111010111110100110011011000000001100" + "1011100111001011010100011101111111111001101001101011110000100001110111111001" + "0010011011100100010001111100100111110001000100111011001001001111110111000010" + "0001111010110010110011111111110111000101011010011100111010011000000001101100" + "1100101111101011111000010110101001110101100110000000", + "1011100000001100000101000010111101000100010101011000111100101101110011011110" + "0110011110101110010110000011111000011000101000011101000100001010011001110011" + "1001101001100000010011001110010000101111011100010011011000111110011111010111" + "1000100000111111011010101001111010101111000001110011111000111000001111111110" + "1111000010100001111010110001101010111110010011011010010101010100010000110110" + "0010110110110110100101110000000111000110011011001100111001101110101010100000" + "1011011110000000011011110001001010011101011100101100111100010000110010001101" + "0010100001001011111010001101101111100111001101111000010001000010001010001111" + "0101010010011100001101000000111010001011101100110001000101110111100000110010" + "1110111001000111010100011001100111101001110010000110101011001001100000111101" + "0100011000011101011001011101010100010010010000010000100001111101101010110101" + "0010010010011111011110011010011001001111110101011111110100010001111001101100" + "1111110110010011111111100001110001100001111010000101010000100111001001101010" + "0001010010011101000010011101010000001000001111101101111000000111100101011101" + "0000111110111111000001001011010000001010101100100010010111000010110011011000" + "0011100110001011100110010110110001100010101111001110101001010100100110101011" + "0000000011010011011010001111010100000101111000011011100001010110001110000000" + "0010010110001101101001010110011111111101111100100000010000101111100100110100" + "1010010100100010000011000101100011000010110010101110101010110110101011110101" + "1110110100101100010111010011000000000000000011001011101000110100101101111010" + "1111010101101101010101110101001101000011000110100011000001000100101001010010" + "1100100111110100001000000100111110111111111001101010010110110001101001000000" + "0001110001101010000111011000011110100000101011110001011011001011000000001101" + "0101100100101010010101110011110101000110001101111001", + "1000100101100100100011101101001111111100010011010010111001011110100000001101" + "0110111001000000101010100010111110101000101100000000011111111001110100111100" + "0101111101010011101001010110110010100010010111101100011010111010001110001000" + "0001010011111100100010110000000101001100111011111101001011001011000100100011" + "1101111100001110011010100011001011101010100010001101000101011101001010110010" + "0011111010110000101011111100101011110011001011110100011001111110000110110001" + "0100101011111011100101011001000101001011110110011101110011111000101101011010" + "0100010111000001010011011110010010000001010000011010100000011110110110011001" + "1100001111101100111010101010010110010010011010011100111010100001010000010101" + "1000110001100011111111011010110111101101010001000100000101010111001101100011" + "0011100000110101111011001111111010101101011010000001000011010001101011011101" + "1111100111111000000111010000001000000000111000000111010111100110100001111101" + "1010110100100101111010111110101000100001101011011111101010101100000101110111" + "1111110010011101100110101111111001111011000110110111010000110110111011110001" + "0111011001001111100100111001100010000100111010111100001110111100111010010100" + "1101111101100001101101101101010110010001111100111000001001001011000000011111" + "1000101000010010011000111111000001100111101100100000000110111101011001101000" + "0110010101001100001010011100111111010101011111010101101000001110010110011110" + "0000100000000000001100111011100111100011011100000000001000010100010011100000" + "1000011011011110001101100100101000111011011000110001101101101000010011110101" + "0110100000010101100101111011010110100111001011010110111101001101010000001011" + "0101011110010000101101101100011000110110111000101001001101100011110110110000" + "1000001110010001010000100000000001110110001111001110111001100000000000001000" + "0011110011010011100000101101010111110101010111111001", + "0000100100101101101000101011000110111001100110110101101001110101100001001011" + "1111001100000011011001001111001010001111110000100000101100001010111101101010" + "1100000010110101011001100111010110010001111000010000000010010011011111010101" + "0100010001010110011000010011001000100001110110110111101000110100111000101110" + "0010000101001010100111100001011001000001000011011000001011010000111000100100" + "0000100100101010011101110010000011110000010011101110010101001001000000100100" + "0111000010110100000110110000100000100110100001111001010100101000010001110100" + "0111001011000101111011011011100001000100110010000110011010100010001010101011" + "1110110010010000000010000111100010011010111001100110101011010000001101010110" + "1111010100001101000001000011111100010100111100100110100000001100111111010010" + "0001101011100101101011011001100111011000110101000101101101001001000001110111" + "0100111110101001010001101100100100101110111011011010101111011101000000000101" + "1101010000100011110010111111111101011101110100110110100010111000110101001011" + "0000110110111001101100000111010010101011111101110100110011110010001010001100" + "0000110001111000000110100001010001101101110001100100101101011101111001111001" + "1111000001110010111101000010110110100010010100011111101100101001010111111000" + "0011110010111110101100101001110000000011111100001111100110100011000011001011" + "1101100111100100100111100001111110111111000001011000111110010001000100011010" + "1110111010111010010100001101110101110010100111100001011001101111001111001000" + "0010000010010010110011110100110000011110001010111111111101101100111010101000" + "0001100101101010010101100111011000000011111010001011101000111010011010000001" + "0101100100001101110010100101010110101010011111101110010001001111110100100010" + "1010000010001011101100011001111011000001000011001011010110101110111100000101" + "1111101011001110110101101101111100011001000110110011", + "0110001001110100010101101101001100000010111000011011111000001010100100111111" + "1011111111100010000110101111000000111111110001110010011100101111010110111000" + "1110101101011100110000101001011000011101111100111100111100111110111000011010" + "0101000011001110101101011100011101101011110100111001001110001111111100000011" + "1101011000010001111111110111111100100101010000011111011000011101000000110010" + "1101101010001011100100011001011011010111110101001101001100111011101010101001" + "0001100111000001100100111011001011100110111001011011010101110010100111010111" + "1011110111100110010101101010011001010011001001000000011101101101011001111100" + "1101111001100111110001111110100110111010101101000101110000110011111101001111" + "1011100001011001000110101100010100000011010101010001100001110011111110001010" + "0110000010000101000000000011111001110111011111110101110110011100001100010100" + "0011110001001010000011011011100101000000101011100110001000101010110001000011" + "0110010101000001010010111000010001110111001111100111101100011010000111001001" + "0000110100101110100010000110111111001000101110001001111000111010101000001000" + "1110110001111011000100011000010011100010011001010111001111111010011010001100" + "0100100001101010101001000000100001010011000000100001000010100111111010100001" + "0100101101000111100110111101111000100111111110111001000010111110000010011101" + "0010010111101010110001010111011000000010001110100100100001101101000110110010" + "0010100110110011100111010111000110010011110100001000101101001110100011110101" + "0001011010011001100110011001011001001111110100001011110100001101011011001010" + "0000101100111111100100011110111001010100101011100110010100100110101111111010" + "0010010100110011111111011110011011001001010100000101001011111111100100000110" + "0001010001001010110000111000001101000001111100001011100011100001110100001101" + "1001000010100011000001000100111101101110100011010001", + "1001000000110100011001010010010111001010110001110011101001111000011110110000" + "0010110111111011111010101000111001001011011000000100001010101111110010100000" + "0011111100111010001111001010101100101010010111010100101010010000011111000000" + "0001110000001110010011001000110011111100110001010001100100010101100101101001" + "0011111000110000111101100100000110100010001110000110110011001111010110010101" + "0000001010010110111011100100011011100110001111001011010011101001011101001110" + "1011100010110100111110011011001100101101000000000101000110000111101010010100" + "0100111010101001101011011010000001110110010111101111101101001100000011111111" + "0110111010111001011101010110001001100101110010010000011101010110110001001100" + "1101101100111101101011011110110000111000101011011000101010100001100001011110" + "0110010000000010101100100000011110011010111010011101111000110110110011110111" + "1001011111100111001101001011101101110001100111011010000000111111000000111010" + "0011001000011101100000101000000101010100000100111101001100110010010011001010" + "0000110011100010010010011000001011110011101000011100101111111010010100011101" + "1100101101010011101101011001100110000111000111110000101110001010111011000000" + "0000101111011010101101011111101110101001101001100110100000010111001101011010" + "1001110001011011001011100110000101001010000101010010010101001010011011101001" + "0001000111000011001001001100001010110100110000101101101000101100101011100101" + "0111111011110100001001001011000100100011100011110111000001100111000000100001" + "1110100010111101111110011010101010101100101100111000011101111010101011010000" + "0110101101110111011110111111010010001001010001110011010011011111100011001101" + "0001110101010111100100001011000001111100110000110111100010111111001101000111" + "0100110110000111111001100011101100010011111001010111000011110011000011001100" + "0100101101010111001011110101111010011001010110100100", + "1011001011010011011110011011000111110000101101001010000011001111100011101001" + "1000011110101011000000011010000000100110111001110010000000101001001111101000" + "1101001101011010001110001100110001001000101111101011110110001001110111001100" + "1001100011111100000010000110011011000110110011110100110001100101101010001100" + "0111010010000101000011001111001110101001001011011101010000110110101000001011" + "1100001011000001001110010110010011011100011100011010110010101101111010110010" + "1010111100001001000101101000110111010001110101011110111010011010011000000000" + "1111011000100110011111100010100000111001001111001100111101100011000000110001" + "0010010111100101010101110010011100011100011011101100001101011001000110101100" + "0011101000101100001110111100010010010010101101011100110010111001111000001010" + "0001001001110011001100000011110101100110100011000111111111100110111100011001" + "1101000100110111011001001000001111000010101111000000000010111001110111100100" + "0111000100010111010010011010001010010111011101010001010001011111000110001011" + "1010100111110100111000010110111101000001110101101110110001111010101011011111" + "1111010000001101111110110110100111001111110010011111010111001111001000110010" + "0001110001100000101010101011010101110101111000011001110000000100000000010011" + "1110111001111110101110101101111100100110010010100101100101011000111001010000" + "1001101101000100101111110101000100111011001001111100110001111000011111100000" + "1011110000001100110111010000101000100100100111101010110011110001111010001001" + "1010001111011010111110011101010100110000100010110110001001111010000101001100" + "1010110101101010001011000001001011000101100011011000101110111101101001000000" + "0001111110100000101101101010100001001001101111011010111000111100010001111111" + "1110001000111100011101011011110110010010000101010110110100000101111110000000" + "0010010110111101110100011011000110100011010010000011", + "1000001110010000001000101000011100001010000011110100010111010011000011001010" + "0001000100001010011011100100010010011101110010110111011100001001010011010000" + "1001010011011111001011010110000100011010100010000101110111000001100110101100" + "1110011011100101011101010001011011101101110100010110101001101101111100101110" + "1111001110010001111100110001100011011111001101110100101110111010010110101110" + "1100100010101101010000001111000110110000100100011100000111001001101110010001" + "1011100010000000110101111000010010011001110001010010110111100101111000111001" + "0101101010010101111111000111100000010010010110101000110011100000001110111011" + "0010001111101011000000000110101011000000100100001111011010101011010000111001" + "1101000011000010100100011110110110101001111111110100111000010011001100010110" + "0001111000101100000100011010100010000001111110101101111110010010110011101011" + "1011000001010000111011100100000010010000100010111010110101001000010100010001" + "1101001000111011101100011001101000111011101100010010100101110110010100001110" + "1101110100101000000101100000000011111100010010001010110101000101111000110100" + "0100011010111101111011110010001111001011010011010110011000100000100010011010" + "0000101000110010011110110001100101110110001111000000110110101001100110010100" + "0111000001011101010010101000111101101101101010011010001111010001110100001110" + "1001010111111001110101101111111011100110101100111000100110110000111100101100" + "0011000010000101011111001111001111011111011011111100101001000001011111101110" + "0110101110110100011111010101001110101110001001011101111111110000010010100110" + "1111011101101010011000000010100000101010101110010100110100010111011110101010" + "0000111111111100111101110101011100011111001001011000100010011011000111111010" + "0011110110111000000110101110001100100110110101010010101101010010101011011001" + "0011000111010110000001110110111100010111111000110110", + "0000011011100001110111101110100110001101001110000010100101001100101001011000" + "0010110100010111101001000010111011011100010101100101111000111100110101010011" + "0010001110000100101011101100001000100010100100011110000001100000001001010111" + "0100100110010100101101100010001010111011010101010001011011000011001110100110" + "1110011000000101101001001011000101101111001101000001011010111001100101011110" + "0001000100101010111011000111101000111011001011100010011011110000011111001011" + "0101000010011111111011001011100111001011110101011111000011001010000001100110" + "1100111100000100000000110110100100100101101001110100110101100001111100111010" + "1111110101011101100111111110010100101001001001101100010100100111101111001101" + "0110010111100111011000101110010000101110110000110010111101100010000100010001" + "0111110001100100000000000001110111100001100000000000110000100011000110111010" + "1000000111111100010011000000001011110001010010011100011111001111100101101001" + "1111001100100010111111101100110110010010100101100100001111100100011111001110" + "0010011000111011111110101111101110000000011011000001000111110100001001000110" + "0100100001100000100000100010100111000101100011001011010011100100011010010100" + "0101000010010010101001111100110110111101110101111001100110111100001111001000" + "1001010011111011111001011000100101010001000100101010111010111000010011001110" + "1010001011001011001100101011011001001110101101011001101111010111110001101001" + "0011110000101101000110101011111110010000100011101011001100110110111001100111" + "1000011000001001101101001111100000001001101000100000010111001100111010111000" + "1001011010001110001110111111000001110001101111100101001011100010110101010110" + "0110111011111010011001111111111001010111111100101100011110001010101010101100" + "1001001101010101010100011110001101001111111010100111111111100110010111110111" + "0110011010101011010001110100101001111101100011100000", + "0010011110101010111011001010111000101011000111100011010110010101110100100010" + "1011001001101101110010111010001111110011100110100010100111110001011111001111" + "1110100001011010100100110001001001010010010000010011100101001110000011010000" + "0011001001000010011010001011100101000001001000011111101101011011100000100000" + "1101010000101110111111001011010010110111000001100001011011100011010111011011" + "0000011001111111010011001101011000011110010000010111000010010100010001100111" + "1011110011101111111100001111001111111011001110111010111001100010100000111111" + "1001101100001001000010000111010010101011101100010011001000001111001110101111" + "0000000000111111101110001111000101011110111000001010101000010101011011010010" + "0010010111000010011101011010001010000110110111001101101101010100011000010000" + "1110000001000111111101101001101110010000010111000100011010110011110001111000" + "0101001000000100010111001010011001001000001111101111010101101011110101111100" + "1001101101100111010110100001010110010100110101111101101101111111101000011011" + "1011110010001000110110110010100100011110100111110111101100001111011100110011" + "0101000110100010100101010001010110011010010110100011110110001110110111110111" + "0101100001100111100111010010101000101000101111111001000001100100010001010110" + "0101010111011110001100000101110100011111000100011010011011100001100111010000" + "1101100001111101000011000100100011101100111011010100010101110110000110000010" + "0010001000001100111001010011100101100110110010001101010101101010111000101110" + "1110101111100010001100101110110100100000001101011100001001011111000101111011" + "0011010000110100111100011010000010001100110001111000110001000101000010001000" + "1000010100010001100011110001100110001000001011000111100101100001011001101110" + "0100011111010010000111010110000000100101101110100110001000111110101110111010" + "0011101010110101010110001001101100110100111001010011", + "1001111101111101000110101011010100010011110001000101011101101100100000011100" + "0010110100101110000101110110010111001110111111011011110111100000101011010110" + "0011000100011110110100010100001110001001000100001101110001101000000010111000" + "0011011110100010001110101000110001111011111111101011000101000100010110000001" + "1100011000100111111101111011001110100010000111010011111101001010110001101010" + "0101110001001001100011100101010111101101101111100111011010011000101110110110" + "0011101100010100011010000010111011110000000001101001011000010100100011001101" + "1000111101110000111011101000100010010110000101000011110101000001111011000000" + "0111101101110101101100010101100101000011001010010001111011111000110101011010" + "1011000010111101010010010011000110011101101110001001000010010101010111110011" + "1110101001010111010110100011010011000101001101001101111110100111100111010101" + "0100100100110100100000101111100010110000110000100110100011010100010111111100" + "0111001111101100001100010000010101110001111010111110010001010001101001000100" + "1110111001100010010100110000011000011010011000101001111110111011110010011010" + "1011111011101111010110011001111101011101100011111110011111001000001101100111" + "1111011011010110110010101111011000010011011011110100001110100000110010100101" + "1111010001101011101010011010001001001010110011001011010011111000110001111010" + "1011101101100110001000111011111111011000100010110111011010110100110100100101" + "0111010110010101110010000101101000000110000001100001000001101010110011110010" + "0110001000111101000001100100011101100010000000001001010100000111111000110111" + "0010000100101110011011101100001010101010001110100110010000100001100110000010" + "0110000110101000101000001001011011001000111110110011010111010101000001010111" + "1011110111101010000010101011101011001101111100010011011010010000010100010101" + "1000011001000001100110000100001001100101110001010101", + "0101011010110000110010000010101111111110111000111100010101110100000110000100" + "1011111101100100100011101101011100101000010000110011001011110001101000100001" + "0100010011000110100101110101101110011000101101011110101101111001101101010001" + "1000001010101100000100110000111110110011110011001110100001001000011011101100" + "1000000001100010110010101010010100111101101011010110100010100110011010101101" + "1000101111111100001000110011011010100100001010001110000000000000011011100010" + "0110001111011110111001110000000100011010011111101111001110000101111000100110" + "1001011011100110001001000100001111101111011100111101111000111000101100100100" + "1101110101000111110010110110101010111001001110101000011111001101001110011111" + "1000010001000101100011000001101100101101111111110011011100100101011011100010" + "1100011000001011010010111100010000101001010000111011111000101110110001101001" + "1011011000011101110011110100111001000000010100100111111001011100001111100110" + "1010110110100101011001101011101110111000000011111001001111100100110000011000" + "0110110010101110111110100110100000100010100100010000001110000111111111000101" + "0101001010101111101000011100000000111011001100001000011110110000010111100000" + "1101000001010111011000010110010100010111101000110110110011011011000001110100" + "0110011000000000000110101010111011011111111111100000100010101010011000110100" + "1001000110111001001000100001000001101000101011011010100110010110011100001100" + "1011110010010011010111111010111100110110100000001011100111110100111100110100" + "1000000110101111111001110001100010111011010110101011110111100000100101011010" + "0000101010001011010000010101100111000111001101101111110111010001011110001101" + "0001111110111010000001111010010010110100100011001001101001001000101111001010" + "0001010011110100010010010110010011000100101101001001011110000001011101111110" + "0010110001111010001011101111110110110011100011100110", + "0111001110011111011001010101011001001101010101101100010011001110011110011001" + "0111001000001011111011000000111000011100000011011111010000010011101001100111" + "1001110011001000110110101010110010011010101010011011111001110011101101000000" + "0101000100001111101100000111110100110100101011001001010010100000111101100000" + "0111101101110001101110011010001000100101010100011000110111000111100001111100" + "0110110110010111010110110111010111000101010101111111011100101001001011001101" + "1100000101011011101110100101111011001001110100101000000111000000001000110001" + "1111001011100001100011010000001000011101101010110000001111001000011110110011" + "0011101100100000000000100110101101100001100101001001110000010000001111000010" + "1101010010101000100001101111001110001010101010011010111110100110111100101000" + "0010000111110100101000110011010101111001110011001101100000110010000101111000" + "0001101110110000110100111010001001100111111110111000010001010001100010001110" + "0011000101101101100110011111001101001110101110101010010010101100010010000010" + "1011000011110101011100100010000001111100010101101011001011001111001110100011" + "1000110000010000101010010111010100010101111111011101100001100100111111111001" + "1001111111101001011111110101111100110011100110110100101010110011011001101100" + "0010000000100001001001011000011111001010001101100101100101001011001111100101" + "0010000011000011010001010100011100110110111000010100110001011001011111101010" + "0011001010010000000100111110000011001001111001110011001110110010001111000000" + "1010000100010110101000001101000001110111100010000110110010010001000001111101" + "1010111100011001011110011011101100101000101101010111100010101100100011000001" + "0101110000111111101011111010011001101000001101110101111110101111100110011011" + "1010111001010011101110111111111111000110011110110000100000100100011010001010" + "1100000010100010101101000100110001101101011011011110", + "1010011010010100100111001101100101010010011100011101010000110100011001101011" + "0011000101100001010111000111001001010100110110011100100101001011001011010010" + "0000110111111101111111111100101001000100101110111100001100010001110110110010" + "1010010111011111110000110100101101000111100110001010001111101001011011110000" + "0011011110111101000101011000001100010110101110110011010010101010000110011111" + "0000101001101100011100010100110110001110011110011001001001101101110001001110" + "0100000100111000110100111100110111011111110000111000010011011111011111110110" + "0001011101000101110001000110011101100111101010001011011110101010010101000100" + "0110010000111001011000110100010110011000100000001101111110100010100011010010" + "1000101111101111100101001011010111101111010010010101100001100110111001010110" + "0100110101111100100101010111100000100111110111000011100011110001111000101101" + "0110100110110000101011110110001100001100100100000101100101011011011101001010" + "1101111001111010011011100001110100100111010110001011101000001011111111101001" + "1101100001111011001011111101100001101010111000010001100101000111000000101110" + "0011000101001010001000010010110101001110001100001101011101000101111111111000" + "0011011101100111011101101011000001000000001100011000010010011000000001011111" + "0101111000001110111010000101011011011010101100110010101110011001000011110111" + "0010110100110011100110111101011001100001110100101011101000001111100001100100" + "1100000000111101101110110001100110101000001001010100011111111010101010001100" + "0101100110010010010000111011101011111111101011010101011000100110010001111100" + "1111001100001100000001011011100100000001101100000111101111000101110100111000" + "1111011111101111101010100010101101100100001001010101000110101100101011101110" + "0011100110000100011000100001010100110111010110111001001100110010101101010100" + "1101110001010100100001000101100000011101111010001110", + "0000011101001011111110001111010101101101000000001110101000000110010001010010" + "0110011110001111111001100000000101101000000100101111011011110111000101110111" + "0000111011000001000001011101011001010011011101111111001011101110100110010010" + "0111101101111010000010000101010101101000110011001111001011101010011001000001" + "1010110101000000001101100000011000000000000101110011101111010001111010001111" + "0111000111001011110000010010111010011011100001000010100101011100100011001100" + "1010000111011111111001011000111100010110000111111101000100101001110100101100" + "1100000010111111010010011100000101111111010101010011011101001011100011001101" + "0001001100101000010010001010011001100111011110101100101101000001110000010111" + "0010010110101010100001111101011011110011100010100011001010100010000110001000" + "1011110011111101010011100001001110010001101111111000011000010000011010110100" + "0000000100111010111000111111010110111110001011101100111010101011000010100000" + "0001101010011101010010010001001110111010111100001101011110001100010001100110" + "1111110110011110010110001111101000101101000011100010100000000001111101011001" + "0001000100001101111100000001001000111101001011110100100001100011000111001110" + "0001000000110001000010111101111110100001111110011010110111110101011011110000" + "1101101100010111100101101111110100001101001001100100101001110010001010100011" + "1110010001001111011010000001110011110110011011001011111001101110111111111001" + "0101010001100111111111110100101100010011110001111000001111100011010011011010" + "0101111000001011001001100100001010111110110111001100011000110011100011110011" + "0110111101101110100100111111010101011010101001011101011011001001011010011110" + "1001001010001010100011001010001100000000001110111101011111101100111000100110" + "0110111010100010011010000101110010011010101000000001010101100100111010000101" + "1001000101011101100110010001110011011111101011110111", + "0001010111100111001010110110001110010111010011111101000011010000000110000100" + "0001101111010001000011101110010111011001101110010001000100001000101111000011" + "1101010100110010111010011011100010101000111011010110000111101111101010110001" + "0010001000010011110011001101111000001000010101110110011100100001100101010100" + "1010011000010111111111001011010001110010110101101100111011100011111100111110" + "1100111011010101110100010011110011101010010100010110010100111100101101011110" + "1001000001110101100110110111010010110001010011001010010111101000001011110111" + "1111001010100100011000011101010110101011111001110111000101100000001101111111" + "1100001101001110100111000110111000110011110001111111010110101111011011001000" + "0000110100101001101100111111010011000000001111010000010110010111011111111000" + "0111010101010100110010101101010110011011000100101100110101110111001011110010" + "0111101010110101000001101100000000011101110100110101001110111010000101111100" + "0011110100000010001011001101010000101001101101100010001000110110001110010101" + "1101011111010000000001110110001111011100000110001001100101100001001000001001" + "0010010110000010000000110010110101110111110110001111010000110111100101100110" + "0110101101110010011110010010101100010100001000001001010111011000011011100000" + "0110011011110101111000010010111011101001101110010010010101111101010110010011" + "1110110011001111001011101001011001111010010100100000011100110001101100100101" + "1110110101001100010110111100100100000111001001100000111010000100110011100100" + "0000010000001000011001100001000000100000001001110011001000010111000001100100" + "1110000010010011110110100011001010110111101001001101100011001110000001001010" + "0101111001101001011101001111001100110111110010011010101111101010010010011101" + "1001011101110100100001111010111101100110000001110110000110111010100100000100" + "0010100011010100100111100100111011010110011001101001", + "1111101110100000010111011111001000011000100000010010011010101011110110000011" + "0000101110000101011011011000101010010001001101111001011011010111111011101111" + "0101000001010010000011111111100011000000000010000000110010100100001001111100" + "1101110001000001100000100101000111100000000001001011010000011011110001010101" + "0110000000011010010010110001100000100100101110101101101010110101011011000011" + "0101110010011100100101000101010111010001111111001001011010010111000111000110" + "1100011111100101110101100110000110110001000011110101001110010110011000100101" + "1000111010100100110010100000111110001110101001101110100101010010101110100011" + "1110010101010001000100011000010100011111110101000010000111011011000101010101" + "1101000011001110011111101001100111101100000101011111100010110100001110011011" + "1011010010010011111100001101111101011000111111111101101110000010001101000001" + "1010110110101101110011010101011000101101111000001110111010100111101110010100" + "1101000010101110100000001101010101110011110100111000011111101110110000010011" + "1101110110011010101000110011111011110101100010100111000100010011111001010000" + "1100011100001110011101000000111100100100001100111111011111111001100001110111" + "1011110001011011101000101111100100010001000101111101000001001100111001001011" + "0101011010010001110111011100011111001000011010010100110101111010001000011110" + "1001101100100111010110110100110011001101110100010110010001001000011010011011" + "1000100100001010011111110110000110001000011110101011101011111011001111110101" + "0101101000110000111001001011101100001010000000100101000101000010110001111100" + "0110000100001101100100110010001111000011110011000101100111100010001100011110" + "1011101001110110101001001000101010001001000000001011001000010100100111110000" + "1110010100100101010101111111001011111100100111011011001011010010110100111100" + "1011110011111001100111010100011111011000100110010111", + "0101001110101001000001111111101011111100101000110010111000110001101010100101" + "0001111011110111001011011010011011000000011101110101100100101111011100110001" + "0001010000101011010001101000111000110110011001110101101011001100111110110111" + "1110101011101001110111000011110001100100010010111010011100011100001111010101" + "1110010110011110100101010000111000000100011000111101110010000001000000100100" + "0011011001010001110000011110101010110000010000111000010100100101011110111110" + "1001101110010101101111110011001000000011110011110101010001111111000011010111" + "1001111101000101110011000011111001000101101010000011110001011110011010001010" + "1001001000000010000101110011001110000111110100100011011101001101111100000101" + "1001110100010101000000110000010101011111101101101001100111100101101110000111" + "1100001010110101111101110110100101001111101100111001101001111011010001000100" + "1011011001111111111101100100111011110110100000111000101010011100011000101001" + "1101100100101110111011111110100001100011010010011000110100110110010001100011" + "1100101100100101101101101101000100110000111101000010110100000101001001000111" + "0011010100110100000101011001111111001000010111100110010000011000011000110110" + "0001100011110000110101111111011111011111000100001010001010111110101101111010" + "0001001000011001011011100010011001001000000111110011110011110111100010111001" + "1000110111010101101111001001100011010000111100101100110110101111010010000110" + "0011101010001000100110010111011110111001110111110000000100100110111000111100" + "1111100101011110111111001100100001011001001000011001100101111000000001000110" + "0100010110111001000111011100000111000101101010011110101101011000011100000001" + "1100010111000111001000111000111011000101001001000100010000001010000100000100" + "0100000001111110001011100001100100110000100110101010100100101111001100101101" + "0100110000111001000111100000010111000101001010001110", +}; + +#endif diff --git a/src/core/system_parameters/Beidou_B1C_prn.h b/src/core/system_parameters/Beidou_B1C_prn.h new file mode 100644 index 000000000..24be1015a --- /dev/null +++ b/src/core/system_parameters/Beidou_B1C_prn.h @@ -0,0 +1,403 @@ +/*! + * \file Beidou_B1C_prn.h + * \brief B1C PRN Weil code parameters from BDS-SIS-ICD-B1C-1.0 Table 5-2/5-3/5-4 + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * SPDX-License-Identifier: GPL-3.0-or-later + * ----------------------------------------------------------------------------- + */ +#ifndef GNSS_SDR_BEIDOU_B1C_PRN_H +#define GNSS_SDR_BEIDOU_B1C_PRN_H +#include +constexpr int32_t BEIDOU_B1C_DATA_PRN_W[63] = { + 2678, + 4802, + 958, + 859, + 3843, + 2232, + 124, + 4352, + 1816, + 1126, + 1860, + 4800, + 2267, + 424, + 4192, + 4333, + 2656, + 4148, + 243, + 1330, + 1593, + 1470, + 882, + 3202, + 5095, + 2546, + 1733, + 4795, + 4577, + 1627, + 3638, + 2553, + 3646, + 1087, + 1843, + 216, + 2245, + 726, + 1966, + 670, + 4130, + 53, + 4830, + 182, + 2181, + 2006, + 1080, + 2288, + 2027, + 271, + 915, + 497, + 139, + 3693, + 2054, + 4342, + 3342, + 2592, + 1007, + 310, + 4203, + 455, + 4318, +}; +constexpr int32_t BEIDOU_B1C_DATA_PRN_P[63] = { + 699, + 694, + 7318, + 2127, + 715, + 6682, + 7850, + 5495, + 1162, + 7682, + 6792, + 9973, + 6596, + 2092, + 19, + 10151, + 6297, + 5766, + 2359, + 7136, + 1706, + 2128, + 6827, + 693, + 9729, + 1620, + 6805, + 534, + 712, + 1929, + 5355, + 6139, + 6339, + 1470, + 6867, + 7851, + 1162, + 7659, + 1156, + 2672, + 6043, + 2862, + 180, + 2663, + 6940, + 1645, + 1582, + 951, + 6878, + 7701, + 1823, + 2391, + 2606, + 822, + 6403, + 239, + 442, + 6769, + 2560, + 2502, + 5072, + 7268, + 341, +}; +constexpr int32_t BEIDOU_B1C_PILOT_PRN_W[63] = { + 796, + 156, + 4198, + 3941, + 1374, + 1338, + 1833, + 2521, + 3175, + 168, + 2715, + 4408, + 3160, + 2796, + 459, + 3594, + 4813, + 586, + 1428, + 2371, + 2285, + 3377, + 4965, + 3779, + 4547, + 1646, + 1430, + 607, + 2118, + 4709, + 1149, + 3283, + 2473, + 1006, + 3670, + 1817, + 771, + 2173, + 740, + 1433, + 2458, + 3459, + 2155, + 1205, + 413, + 874, + 2463, + 1106, + 1590, + 3873, + 4026, + 4272, + 3556, + 128, + 1200, + 130, + 4494, + 1871, + 3073, + 4386, + 4098, + 1923, + 1176, +}; +constexpr int32_t BEIDOU_B1C_PILOT_PRN_P[63] = { + 7575, + 2369, + 5688, + 539, + 2270, + 7306, + 6457, + 6254, + 5644, + 7119, + 1402, + 5557, + 5764, + 1073, + 7001, + 5910, + 10060, + 2710, + 1546, + 6887, + 1883, + 5613, + 5062, + 1038, + 10170, + 6484, + 1718, + 2535, + 1158, + 526, + 7331, + 5844, + 6423, + 6968, + 1280, + 1838, + 1989, + 6468, + 2091, + 1581, + 1453, + 6252, + 7122, + 7711, + 7216, + 2113, + 1095, + 1628, + 1713, + 6102, + 6123, + 6070, + 1115, + 8047, + 6795, + 2575, + 53, + 1729, + 6388, + 682, + 5565, + 7160, + 2277, +}; +constexpr int32_t BEIDOU_B1C_PILOT_SECONDARY_W[63] = { + 269, + 1448, + 1028, + 1324, + 822, + 5, + 155, + 458, + 310, + 959, + 1238, + 1180, + 1288, + 334, + 885, + 1362, + 181, + 1648, + 838, + 313, + 750, + 225, + 1477, + 309, + 108, + 1457, + 149, + 322, + 271, + 576, + 1103, + 450, + 399, + 241, + 1045, + 164, + 513, + 687, + 422, + 303, + 324, + 495, + 725, + 780, + 367, + 882, + 631, + 37, + 647, + 1043, + 24, + 120, + 134, + 136, + 158, + 214, + 335, + 340, + 661, + 889, + 929, + 1002, + 1149, +}; +constexpr int32_t BEIDOU_B1C_PILOT_SECONDARY_P[63] = { + 1889, + 1268, + 1593, + 1186, + 1239, + 1930, + 176, + 1696, + 26, + 1344, + 1271, + 1182, + 1381, + 1604, + 1333, + 1185, + 31, + 704, + 1190, + 1646, + 1385, + 113, + 860, + 1656, + 1921, + 1173, + 1928, + 57, + 150, + 1214, + 1148, + 1458, + 1519, + 1635, + 1257, + 1687, + 1382, + 1514, + 1, + 1583, + 1806, + 1664, + 1338, + 1111, + 1706, + 1543, + 1813, + 228, + 2871, + 2884, + 1823, + 75, + 11, + 63, + 1937, + 22, + 1768, + 1526, + 1402, + 1445, + 1680, + 1290, + 1245, +}; +#endif diff --git a/src/core/system_parameters/Beidou_CNAV1.h b/src/core/system_parameters/Beidou_CNAV1.h new file mode 100644 index 000000000..2d9c73f50 --- /dev/null +++ b/src/core/system_parameters/Beidou_CNAV1.h @@ -0,0 +1,82 @@ +/*! + * \file Beidou_CNAV1.h + * \brief B-CNAV1 navigation message constants (BDS-SIS-ICD-B1C-1.0 §6.2, §7) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_CNAV1_H +#define GNSS_SDR_BEIDOU_CNAV1_H + +#include +#include + +#ifndef GNSS_SDR_TWO_N8 +constexpr double GNSS_SDR_TWO_N8 = 0.00390625; +#endif +#ifndef GNSS_SDR_TWO_N9 +constexpr double GNSS_SDR_TWO_N9 = 0.001953125; +#endif +#ifndef GNSS_SDR_TWO_N30 +constexpr double GNSS_SDR_TWO_N30 = 9.313225746154785e-10; +#endif +#ifndef GNSS_SDR_TWO_N32 +constexpr double GNSS_SDR_TWO_N32 = 2.3283064365386963e-10; +#endif +#ifndef GNSS_SDR_TWO_N34 +constexpr double GNSS_SDR_TWO_N34 = 5.820766091053686e-11; +#endif +#ifndef GNSS_SDR_TWO_N44 +constexpr double GNSS_SDR_TWO_N44 = 5.684341886080802e-14; +#endif +#ifndef GNSS_SDR_TWO_N50 +constexpr double GNSS_SDR_TWO_N50 = 8.881784197001252e-16; +#endif +#ifndef GNSS_SDR_TWO_N57 +constexpr double GNSS_SDR_TWO_N57 = 6.938893903907228e-18; +#endif +#ifndef GNSS_SDR_TWO_N66 +constexpr double GNSS_SDR_TWO_N66 = 1.3552527156068805e-20; +#endif + +constexpr int32_t BEIDOU_CNAV1_FRAME_SYMBOLS = 1800; +constexpr int32_t BEIDOU_CNAV1_FRAME_PERIOD_S = 18; +constexpr int32_t BEIDOU_CNAV1_SYMBOL_RATE_SPS = 100; +constexpr int32_t BEIDOU_CNAV1_SUBFRAME1_SYMBOLS = 72; +constexpr int32_t BEIDOU_CNAV1_SUBFRAME2_SYMBOLS = 1200; +constexpr int32_t BEIDOU_CNAV1_SUBFRAME3_SYMBOLS = 528; +constexpr int32_t BEIDOU_CNAV1_SOH_LSB_S = 18; +constexpr int32_t BEIDOU_CNAV1_INTERLEAVED_SYMBOLS = 1728; +constexpr int32_t BEIDOU_CNAV1_INTERLEAVE_ROWS = 36; +constexpr int32_t BEIDOU_CNAV1_INTERLEAVE_COLS = 48; +constexpr int32_t BEIDOU_CNAV1_SF2_DATA_BITS = 600; +constexpr int32_t BEIDOU_CNAV1_SF3_DATA_BITS = 264; +constexpr int32_t BEIDOU_CNAV1_CRC_BITS = 24; + +constexpr int32_t BEIDOU_CNAV1_PAGE_IONO_UTC = 1; + +constexpr double BEIDOU_CNAV1_A_REF_MEO = 27906100.0; +constexpr double BEIDOU_CNAV1_A_REF_IGSO = 42162200.0; +constexpr double BEIDOU_CNAV1_TOE_TOC_LSB = 300.0; +constexpr double BEIDOU_CNAV1_DELTA_A_LSB = GNSS_SDR_TWO_N9; +constexpr double BEIDOU_CNAV1_A_DOT_LSB = 3.725290298461914e-9; //!< 2^-25 m/s, Table 7-8 +constexpr double BEIDOU_CNAV1_DELTA_N0_LSB = GNSS_SDR_TWO_N44 * M_PI; +constexpr double BEIDOU_CNAV1_DELTA_N0_DOT_LSB = GNSS_SDR_TWO_N57 * M_PI; +constexpr double BEIDOU_CNAV1_M0_LSB = GNSS_SDR_TWO_N32 * M_PI; +constexpr double BEIDOU_CNAV1_E_LSB = GNSS_SDR_TWO_N34; +constexpr double BEIDOU_CNAV1_OMEGA_LSB = GNSS_SDR_TWO_N32 * M_PI; +constexpr double BEIDOU_CNAV1_I0_LSB = GNSS_SDR_TWO_N32 * M_PI; +constexpr double BEIDOU_CNAV1_OMEGADOT_LSB = GNSS_SDR_TWO_N44 * M_PI; +constexpr double BEIDOU_CNAV1_IDOT_LSB = GNSS_SDR_TWO_N44 * M_PI; +constexpr double BEIDOU_CNAV1_CIS_LSB = GNSS_SDR_TWO_N30; +constexpr double BEIDOU_CNAV1_CIC_LSB = GNSS_SDR_TWO_N30; +constexpr double BEIDOU_CNAV1_CRS_LSB = GNSS_SDR_TWO_N8; +constexpr double BEIDOU_CNAV1_CRC_LSB = GNSS_SDR_TWO_N8; +constexpr double BEIDOU_CNAV1_CUS_LSB = GNSS_SDR_TWO_N30; +constexpr double BEIDOU_CNAV1_CUC_LSB = GNSS_SDR_TWO_N30; +constexpr double BEIDOU_CNAV1_AF0_LSB = GNSS_SDR_TWO_N34; +constexpr double BEIDOU_CNAV1_AF1_LSB = GNSS_SDR_TWO_N50; +constexpr double BEIDOU_CNAV1_AF2_LSB = GNSS_SDR_TWO_N66; +constexpr double BEIDOU_CNAV1_TGD_LSB = GNSS_SDR_TWO_N34; +constexpr double BEIDOU_CNAV1_ISC_LSB = GNSS_SDR_TWO_N34; + +#endif // GNSS_SDR_BEIDOU_CNAV1_H diff --git a/src/core/system_parameters/CMakeLists.txt b/src/core/system_parameters/CMakeLists.txt index 0dd5e7a6b..7c9a342a1 100644 --- a/src/core/system_parameters/CMakeLists.txt +++ b/src/core/system_parameters/CMakeLists.txt @@ -24,6 +24,9 @@ set(SYSTEM_PARAMETERS_SOURCES galileo_reduced_ced.cc beidou_dnav_navigation_message.cc beidou_dnav_ephemeris.cc + beidou_cnav1_ephemeris.cc + beidou_cnav1_navigation_message.cc + beidou_cnav1_ldpc.cc sbas_ephemeris.cc gps_cnav_navigation_message.cc glonass_gnav_ephemeris.cc @@ -90,6 +93,15 @@ set(SYSTEM_PARAMETERS_HEADERS GPS_L2C.h GPS_L5.h Beidou_B1I.h + Beidou_B1C.h + Beidou_B1C_codes.h + Beidou_B1C_prn.h + Beidou_CNAV1.h + beidou_cnav1_ldpc.h + beidou_cnav1_ephemeris.h + beidou_cnav1_navigation_message.h + beidou_cnav1_iono.h + beidou_cnav1_utc_model.h Beidou_B3I.h Beidou_DNAV.h MATH_CONSTANTS.h diff --git a/src/core/system_parameters/beidou_cnav1_ephemeris.cc b/src/core/system_parameters/beidou_cnav1_ephemeris.cc new file mode 100644 index 000000000..e66da80eb --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_ephemeris.cc @@ -0,0 +1 @@ +#include "beidou_cnav1_ephemeris.h" diff --git a/src/core/system_parameters/beidou_cnav1_ephemeris.h b/src/core/system_parameters/beidou_cnav1_ephemeris.h new file mode 100644 index 000000000..3f0a333c4 --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_ephemeris.h @@ -0,0 +1,69 @@ +/*! + * \file beidou_cnav1_ephemeris.h + * \brief BeiDou B-CNAV1 ephemeris storage (BDS-SIS-ICD-B1C-1.0 §7) + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * SPDX-License-Identifier: GPL-3.0-or-later + * ----------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_BEIDOU_CNAV1_EPHEMERIS_H +#define GNSS_SDR_BEIDOU_CNAV1_EPHEMERIS_H + +#include "gnss_ephemeris.h" +#include + +class Beidou_Cnav1_Ephemeris : public Gnss_Ephemeris +{ +public: + Beidou_Cnav1_Ephemeris() = default; + + double TGD_B1Cp{}; //!< §7.6 B1C pilot group delay + double TGD_B2ap{}; //!< §7.6 B2a pilot group delay + double ISC_B1Cd{}; //!< §7.6 B1C data-to-pilot intra-frequency delay correction + double IODC{}; //!< §7.4.2 + double IODE{}; //!< §7.4.1 + int32_t sig_type{7}; //!< B1C data component identifier for PVT + int32_t nav_type{1}; //!< 0: GEO, 1: MEO/IGSO + + template + void serialize(Archive& archive, const unsigned int version) + { + if (version) + { + }; + archive& BOOST_SERIALIZATION_NVP(PRN); + archive& BOOST_SERIALIZATION_NVP(M_0); + archive& BOOST_SERIALIZATION_NVP(delta_n); + archive& BOOST_SERIALIZATION_NVP(ecc); + archive& BOOST_SERIALIZATION_NVP(sqrtA); + archive& BOOST_SERIALIZATION_NVP(OMEGA_0); + archive& BOOST_SERIALIZATION_NVP(i_0); + archive& BOOST_SERIALIZATION_NVP(omega); + archive& BOOST_SERIALIZATION_NVP(OMEGAdot); + archive& BOOST_SERIALIZATION_NVP(idot); + archive& BOOST_SERIALIZATION_NVP(Cuc); + archive& BOOST_SERIALIZATION_NVP(Cus); + archive& BOOST_SERIALIZATION_NVP(Crc); + archive& BOOST_SERIALIZATION_NVP(Crs); + archive& BOOST_SERIALIZATION_NVP(Cic); + archive& BOOST_SERIALIZATION_NVP(Cis); + archive& BOOST_SERIALIZATION_NVP(toe); + archive& BOOST_SERIALIZATION_NVP(toc); + archive& BOOST_SERIALIZATION_NVP(af0); + archive& BOOST_SERIALIZATION_NVP(af1); + archive& BOOST_SERIALIZATION_NVP(af2); + archive& BOOST_SERIALIZATION_NVP(WN); + archive& BOOST_SERIALIZATION_NVP(tow); + archive& BOOST_SERIALIZATION_NVP(TGD_B1Cp); + archive& BOOST_SERIALIZATION_NVP(TGD_B2ap); + archive& BOOST_SERIALIZATION_NVP(ISC_B1Cd); + archive& BOOST_SERIALIZATION_NVP(IODC); + archive& BOOST_SERIALIZATION_NVP(IODE); + archive& BOOST_SERIALIZATION_NVP(sig_type); + archive& BOOST_SERIALIZATION_NVP(nav_type); + } +}; + +#endif // GNSS_SDR_BEIDOU_CNAV1_EPHEMERIS_H diff --git a/src/core/system_parameters/beidou_cnav1_iono.h b/src/core/system_parameters/beidou_cnav1_iono.h new file mode 100644 index 000000000..0e0cf0e83 --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_iono.h @@ -0,0 +1,25 @@ +/*! + * \file beidou_cnav1_iono.h + * \brief BeiDou B-CNAV1 ionospheric model (§7.8) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_CNAV1_IONO_H +#define GNSS_SDR_BEIDOU_CNAV1_IONO_H + +class Beidou_Cnav1_Iono +{ +public: + double alpha1{}; + double alpha2{}; + double alpha3{}; + double alpha4{}; + double alpha5{}; + double alpha6{}; + double alpha7{}; + double alpha8{}; + double alpha9{}; + bool valid{}; +}; + +#endif diff --git a/src/core/system_parameters/beidou_cnav1_ldpc.cc b/src/core/system_parameters/beidou_cnav1_ldpc.cc new file mode 100644 index 000000000..ce2d647cd --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_ldpc.cc @@ -0,0 +1,703 @@ +/*! + * \file beidou_cnav1_ldpc.cc + * \brief B-CNAV1 LDPC graph and non-binary BP decoder over GF(64) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "beidou_cnav1_ldpc.h" +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +constexpr int32_t BITS_PER_SYMBOL = 6; +constexpr int32_t Q = 64; +constexpr int32_t NM = BEIDOU_CNAV1_LDPC_NM; +constexpr int32_t FP_CANDIDATES = 8 + 2 * NM; +constexpr float LLR_FALLBACK_GAP = 25.0F; + +struct TruncMessage +{ + std::array sym{}; + std::array llr{}; +}; + +struct FixedPathCandidate +{ + uint8_t sym = 0; + float llr = std::numeric_limits::max(); +}; + +uint8_t bits_to_symbol_msb_first(const float* bit_llr, int32_t bit_offset) +{ + uint8_t symbol = 0; + for (int32_t bit = 0; bit < BITS_PER_SYMBOL; bit++) + { + symbol = static_cast((symbol << 1U) | (bit_llr[bit_offset + bit] >= 0.0F ? 1U : 0U)); + } + return symbol; +} + +void normalize_message(TruncMessage& msg) +{ + const float min_llr = msg.llr[0]; + for (int32_t i = 0; i < NM; i++) + { + msg.llr[i] -= min_llr; + } +} + +float lookup_message_llr_var_domain(const TruncMessage& c2v_msg, uint8_t h_inv, uint8_t x_var) +{ + for (int32_t i = 0; i < NM; i++) + { + const uint8_t mapped = GaloisField64::mul(h_inv, c2v_msg.sym[i]); + if (mapped == x_var) + { + return c2v_msg.llr[i]; + } + } + return c2v_msg.llr[NM - 1] + LLR_FALLBACK_GAP; +} + +void truncate_metric_vector(const std::array& metric, TruncMessage& out) +{ + std::array used{}; + for (int32_t kept = 0; kept < NM; kept++) + { + float best_llr = std::numeric_limits::max(); + int32_t best_sym = 0; + for (int32_t x = 0; x < Q; x++) + { + if (!used[static_cast(x)] && metric[static_cast(x)] < best_llr) + { + best_llr = metric[static_cast(x)]; + best_sym = x; + } + } + used[static_cast(best_sym)] = true; + out.sym[kept] = static_cast(best_sym); + out.llr[kept] = best_llr; + } + normalize_message(out); +} + +uint8_t row_syndrome(const BeidouCnav1LdpcGraph& graph, int32_t check_index, const std::vector& codeword) +{ + uint8_t syndrome = GaloisField64::kZero; + const uint32_t begin = graph.check_offsets[static_cast(check_index)]; + const uint32_t end = graph.check_offsets[static_cast(check_index + 1)]; + for (uint32_t edge = begin; edge < end; edge++) + { + const uint16_t var = graph.check_to_var[edge]; + const uint8_t h_ij = graph.check_to_h[edge]; + syndrome = GaloisField64::add(syndrome, GaloisField64::mul(h_ij, codeword[var])); + } + return syndrome; +} + +bool syndrome_is_zero(const BeidouCnav1LdpcGraph& graph, const std::vector& codeword) +{ + for (int32_t row = 0; row < graph.num_checks; row++) + { + if (row_syndrome(graph, row, codeword) != GaloisField64::kZero) + { + return false; + } + } + return true; +} + +void symbols_to_bits(const std::vector& symbols, int32_t num_info_symbols, uint8_t* info_bits) +{ + for (int32_t symbol_index = 0; symbol_index < num_info_symbols; symbol_index++) + { + const uint8_t symbol = symbols[static_cast(symbol_index)]; + for (int32_t bit = 0; bit < BITS_PER_SYMBOL; bit++) + { + info_bits[symbol_index * BITS_PER_SYMBOL + bit] = static_cast((symbol >> (5 - bit)) & 1U); + } + } +} + +bool graph_is_valid(const BeidouCnav1LdpcGraph& graph) +{ + if (graph.num_checks <= 0 || graph.num_variables <= 0 || graph.row_weight <= 0) + { + return false; + } + const int32_t expected_edges = graph.num_checks * graph.row_weight; + return graph.check_offsets.size() == static_cast(graph.num_checks + 1) && + graph.var_offsets.size() == static_cast(graph.num_variables + 1) && + graph.check_to_var.size() == static_cast(expected_edges) && + graph.check_to_h.size() == static_cast(expected_edges) && + graph.var_to_check.size() == static_cast(expected_edges) && + graph.var_to_edge.size() == static_cast(expected_edges) && + graph.var_to_h.size() == static_cast(expected_edges) && + graph.var_to_h_inv.size() == static_cast(expected_edges); +} + +void initialize_channel_llr( + const float* bit_llr, + int32_t num_symbols, + std::vector& hard_symbol, + std::vector& channel_llr) +{ + hard_symbol.assign(static_cast(num_symbols), 0U); + channel_llr.assign(static_cast(num_symbols) * Q, 0.0F); + + for (int32_t j = 0; j < num_symbols; j++) + { + const int32_t bit_offset = j * BITS_PER_SYMBOL; + const uint8_t hard = bits_to_symbol_msb_first(bit_llr, bit_offset); + hard_symbol[static_cast(j)] = hard; + std::array abs_bit_llr{}; + for (int32_t b = 0; b < BITS_PER_SYMBOL; b++) + { + abs_bit_llr[b] = std::fabs(bit_llr[bit_offset + b]); + } + for (int32_t x = 0; x < Q; x++) + { + float metric = 0.0F; + const auto diff = static_cast(x ^ hard); + for (int32_t b = 0; b < BITS_PER_SYMBOL; b++) + { + const auto bit_mask = static_cast(1U << (BITS_PER_SYMBOL - 1 - b)); + if ((diff & bit_mask) != 0U) + { + metric += abs_bit_llr[b]; + } + } + channel_llr[static_cast(j) * Q + static_cast(x)] = metric; + } + } +} + +void initialize_v2c_messages( + const BeidouCnav1LdpcGraph& graph, + const std::vector& channel_llr, + std::vector& v2c) +{ + const int32_t edge_count = graph.num_checks * graph.row_weight; + for (int32_t edge = 0; edge < edge_count; edge++) + { + const uint16_t var = graph.check_to_var[static_cast(edge)]; + const uint8_t h_ij = graph.check_to_h[static_cast(edge)]; + std::array mapped_metric{}; + for (int32_t x = 0; x < Q; x++) + { + const uint8_t y = GaloisField64::mul(h_ij, static_cast(x)); + mapped_metric[static_cast(y)] = + channel_llr[static_cast(var) * Q + static_cast(x)]; + } + truncate_metric_vector(mapped_metric, v2c[static_cast(edge)]); + } +} + +void variable_node_update( + const BeidouCnav1LdpcGraph& graph, + const std::vector& channel_llr, + std::vector& v2c, + const std::vector& c2v, + std::vector& hard_codeword) +{ + std::array posterior{}; + std::array outgoing_metric{}; + + for (int32_t var = 0; var < graph.num_variables; var++) + { + const uint32_t begin = graph.var_offsets[static_cast(var)]; + const uint32_t end = graph.var_offsets[static_cast(var + 1)]; + + for (int32_t x = 0; x < Q; x++) + { + float metric = channel_llr[static_cast(var) * Q + static_cast(x)]; + for (uint32_t p = begin; p < end; p++) + { + const uint32_t edge = graph.var_to_edge[p]; + const uint8_t h_fj_inv = graph.var_to_h_inv[p]; + metric += lookup_message_llr_var_domain(c2v[edge], h_fj_inv, static_cast(x)); + } + posterior[static_cast(x)] = metric; + } + + int32_t hard_symbol = 0; + float best_hard_llr = posterior[0]; + for (int32_t x = 1; x < Q; x++) + { + if (posterior[static_cast(x)] < best_hard_llr) + { + best_hard_llr = posterior[static_cast(x)]; + hard_symbol = x; + } + } + hard_codeword[static_cast(var)] = static_cast(hard_symbol); + + for (uint32_t p = begin; p < end; p++) + { + const uint32_t edge_out = graph.var_to_edge[p]; + const uint8_t h_ij = graph.var_to_h[p]; + for (int32_t y = 0; y < Q; y++) + { + outgoing_metric[static_cast(y)] = std::numeric_limits::max(); + } + for (int32_t x = 0; x < Q; x++) + { + float metric = channel_llr[static_cast(var) * Q + static_cast(x)]; + for (uint32_t q = begin; q < end; q++) + { + const uint32_t edge_in = graph.var_to_edge[q]; + if (edge_in == edge_out) + { + continue; + } + const uint8_t h_fj_inv = graph.var_to_h_inv[q]; + metric += lookup_message_llr_var_domain(c2v[edge_in], h_fj_inv, static_cast(x)); + } + const uint8_t y_out = GaloisField64::mul(h_ij, static_cast(x)); + outgoing_metric[static_cast(y_out)] = metric; + } + truncate_metric_vector(outgoing_metric, v2c[edge_out]); + } + } +} + +void build_fixed_path_candidates( + const std::array& in, + std::array& cand) +{ + for (auto& c : cand) + { + c.sym = 0U; + c.llr = std::numeric_limits::max(); + } + + const uint8_t s0 = in[0].sym[0]; + const uint8_t s1 = in[1].sym[0]; + const uint8_t s2 = in[2].sym[0]; + const uint8_t s3 = in[3].sym[0]; + const float r0 = in[0].llr[0]; + const float r1 = in[1].llr[0]; + const float r2 = in[2].llr[0]; + const float r3 = in[3].llr[0]; + const uint8_t base_sym = GaloisField64::add(GaloisField64::add(s0, s1), GaloisField64::add(s2, s3)); + const float base_llr = r0 + r1 + r2 + r3; + + int32_t idx = 0; + cand[idx++] = {base_sym, base_llr}; + + for (int32_t l = 0; l < 4; l++) + { + const uint8_t sym = GaloisField64::add(base_sym, GaloisField64::add(in[l].sym[0], in[l].sym[1])); + const float llr = base_llr - in[l].llr[0] + in[l].llr[1]; + cand[idx++] = {sym, llr}; + } + + constexpr std::array, 6> pairs = { + std::pair{0, 1}, + {0, 2}, + {0, 3}, + {1, 2}, + {1, 3}, + {2, 3}, + }; + for (const auto& pair : pairs) + { + const int32_t a = pair.first; + const int32_t b = pair.second; + const uint8_t sym = GaloisField64::add( + base_sym, + GaloisField64::add( + GaloisField64::add(in[a].sym[0], in[a].sym[1]), + GaloisField64::add(in[b].sym[0], in[b].sym[1]))); + const float llr = base_llr - in[a].llr[0] - in[b].llr[0] + in[a].llr[1] + in[b].llr[1]; + cand[idx++] = {sym, llr}; + } + + for (int32_t rank = 2; rank < NM && idx < FP_CANDIDATES; rank++) + { + for (int32_t l = 0; l < 4 && idx < FP_CANDIDATES; l++) + { + const uint8_t sym = GaloisField64::add(base_sym, GaloisField64::add(in[l].sym[0], in[l].sym[rank])); + const float llr = base_llr - in[l].llr[0] + in[l].llr[rank]; + cand[idx++] = {sym, llr}; + } + } +} + +void fixed_path_check_update( + const BeidouCnav1LdpcGraph& graph, + const std::vector& v2c, + std::vector& c2v) +{ + std::array edge_idx{}; + std::array order{}; + std::array in_sorted{}; + std::array candidates{}; + std::array T{}; + std::array Tbar{}; + + for (int32_t check = 0; check < graph.num_checks; check++) + { + const uint32_t begin = graph.check_offsets[static_cast(check)]; + const uint32_t end = graph.check_offsets[static_cast(check + 1)]; + if (static_cast(end - begin) != 4) + { + continue; + } + for (int32_t l = 0; l < 4; l++) + { + edge_idx[l] = static_cast(begin) + l; + order[l] = l; + } + std::sort(order.begin(), order.end(), [&](int32_t a, int32_t b) { + return v2c[static_cast(edge_idx[a])].llr[1] < v2c[static_cast(edge_idx[b])].llr[1]; + }); + for (int32_t l = 0; l < 4; l++) + { + in_sorted[l] = v2c[static_cast(edge_idx[order[l]])]; + } + + build_fixed_path_candidates(in_sorted, candidates); + + int32_t theta = 0; + int32_t beta = 1; + float min2 = in_sorted[0].llr[1]; + float second2 = in_sorted[1].llr[1]; + if (second2 < min2) + { + std::swap(min2, second2); + std::swap(theta, beta); + } + for (int32_t l = 2; l < 4; l++) + { + const float v = in_sorted[l].llr[1]; + if (v < min2) + { + second2 = min2; + beta = theta; + min2 = v; + theta = l; + } + else if (v < second2) + { + second2 = v; + beta = l; + } + } + const int32_t ref_idx = NM / 2; + const float theta_ref = in_sorted[theta].llr[ref_idx]; + const float beta_ref = in_sorted[beta].llr[ref_idx]; + for (int32_t k = 0; k < FP_CANDIDATES; k++) + { + T[k] = (candidates[k].llr <= theta_ref) ? 1U : 0U; + Tbar[k] = (candidates[k].llr <= beta_ref) ? 1U : 0U; + } + + for (int32_t l = 0; l < 4; l++) + { + TruncMessage out{}; + int32_t filled = 0; + for (int32_t k = 0; k < FP_CANDIDATES && filled < NM; k++) + { + bool pass_gate = false; + if (l == 0) + { + pass_gate = (T[k] != 0U); + } + else if (l == theta) + { + pass_gate = (Tbar[k] != 0U); + } + else + { + pass_gate = (T[k] != 0U) || (Tbar[k] != 0U); + } + if (!pass_gate) + { + continue; + } + out.sym[filled] = GaloisField64::add(in_sorted[l].sym[0], candidates[k].sym); + out.llr[filled] = candidates[k].llr - in_sorted[l].llr[0]; + filled++; + } + while (filled < NM) + { + out.sym[filled] = out.sym[filled - 1]; + out.llr[filled] = out.llr[filled - 1] + 1.0F; + filled++; + } + normalize_message(out); + c2v[static_cast(edge_idx[order[l]])] = out; + } + } +} + +void reorder_icd_column_bands_to_check_rows( + int32_t num_checks, + int32_t row_weight, + int32_t num_entries, + const uint16_t* icd_index, + const uint8_t* icd_element, + std::vector& reordered_index, + std::vector& reordered_element) +{ + // ICD publishes a compact matrix with 4-column bands; decoding should read each band + // top-to-bottom ("按栏读取"), then move left-to-right to the next band. + const int32_t base_rows = num_checks / row_weight; + const int32_t cols_per_base_row = row_weight * row_weight; + + reordered_index.assign(static_cast(num_entries), 0U); + reordered_element.assign(static_cast(num_entries), 0U); + + for (int32_t band = 0; band < row_weight; band++) + { + for (int32_t row = 0; row < base_rows; row++) + { + const int32_t src_offset = row * cols_per_base_row + band * row_weight; + const int32_t check_row = band * base_rows + row; + const int32_t dst_offset = check_row * row_weight; + for (int32_t k = 0; k < row_weight; k++) + { + reordered_index[static_cast(dst_offset + k)] = + icd_index[static_cast(src_offset + k)]; + reordered_element[static_cast(dst_offset + k)] = + icd_element[static_cast(src_offset + k)]; + } + } + } +} + +bool decode_block( + const BeidouCnav1LdpcGraph& graph, + const float* bit_llr, + int32_t num_bits, + uint8_t* info_bits, + uint8_t* codeword_bits) +{ + if (!graph_is_valid(graph)) + { + return false; + } + + const int32_t n = graph.num_variables; + const int32_t k = n - graph.num_checks; + if (num_bits < n * BITS_PER_SYMBOL) + { + return false; + } + + std::vector hard_codeword(static_cast(n), 0U); + std::vector hard_symbol; + std::vector channel_llr; + initialize_channel_llr(bit_llr, n, hard_symbol, channel_llr); + hard_codeword = hard_symbol; + + const int32_t edge_count = graph.num_checks * graph.row_weight; + std::vector v2c(static_cast(edge_count)); + std::vector c2v(static_cast(edge_count)); + initialize_v2c_messages(graph, channel_llr, v2c); + c2v = v2c; + + for (int32_t iteration = 0; iteration < BEIDOU_CNAV1_LDPC_MAX_ITER; iteration++) + { + variable_node_update(graph, channel_llr, v2c, c2v, hard_codeword); + if (syndrome_is_zero(graph, hard_codeword)) + { + if (info_bits != nullptr) + { + symbols_to_bits(hard_codeword, k, info_bits); + } + if (codeword_bits != nullptr) + { + symbols_to_bits(hard_codeword, n, codeword_bits); + } + return true; + } + fixed_path_check_update(graph, v2c, c2v); + } + + return false; +} + +bool init_graph_impl( + int32_t num_checks, + int32_t num_variables, + int32_t row_weight, + const uint16_t* icd_index, + const uint8_t* icd_element, + int32_t num_entries, + BeidouCnav1LdpcGraph& graph) +{ + if (num_checks <= 0 || num_variables <= 0 || row_weight <= 0 || icd_index == nullptr || icd_element == nullptr) + { + return false; + } + if (num_entries != num_checks * row_weight) + { + return false; + } + if (num_checks % row_weight != 0) + { + return false; + } + + const int32_t base_rows = num_checks / row_weight; + const int32_t cols_per_base_row = row_weight * row_weight; + if (base_rows * cols_per_base_row != num_entries) + { + return false; + } + + std::vector reordered_index; + std::vector reordered_element; + reorder_icd_column_bands_to_check_rows( + num_checks, + row_weight, + num_entries, + icd_index, + icd_element, + reordered_index, + reordered_element); + const uint16_t* check_index = reordered_index.data(); + const uint8_t* check_element = reordered_element.data(); + + graph.num_checks = num_checks; + graph.num_variables = num_variables; + graph.row_weight = row_weight; + graph.check_offsets.assign(static_cast(num_checks + 1), 0U); + graph.check_to_var.assign(static_cast(num_entries), 0U); + graph.check_to_h.assign(static_cast(num_entries), 0U); + graph.var_offsets.assign(static_cast(num_variables + 1), 0U); + graph.var_to_check.assign(static_cast(num_entries), 0U); + graph.var_to_edge.assign(static_cast(num_entries), 0U); + graph.var_to_h.assign(static_cast(num_entries), 0U); + graph.var_to_h_inv.assign(static_cast(num_entries), 0U); + + for (int32_t i = 0; i < num_checks; i++) + { + graph.check_offsets[static_cast(i + 1)] = + graph.check_offsets[static_cast(i)] + static_cast(row_weight); + } + + std::vector var_degree(static_cast(num_variables), 0U); + for (int32_t edge = 0; edge < num_entries; edge++) + { + const uint16_t var = check_index[edge]; + const uint8_t h_ij = check_element[edge]; + if (var >= static_cast(num_variables) || + !GaloisField64::valid_symbol(h_ij) || + h_ij == GaloisField64::kZero) + { + return false; + } + graph.check_to_var[static_cast(edge)] = var; + graph.check_to_h[static_cast(edge)] = h_ij; + var_degree[static_cast(var)]++; + } + + for (int32_t j = 0; j < num_variables; j++) + { + graph.var_offsets[static_cast(j + 1)] = + graph.var_offsets[static_cast(j)] + var_degree[static_cast(j)]; + } + + std::vector cursor = graph.var_offsets; + for (int32_t i = 0; i < num_checks; i++) + { + const uint32_t begin = graph.check_offsets[static_cast(i)]; + const uint32_t end = graph.check_offsets[static_cast(i + 1)]; + for (uint32_t edge = begin; edge < end; edge++) + { + const uint16_t var = graph.check_to_var[edge]; + const uint8_t h_ij = graph.check_to_h[edge]; + const uint32_t pos = cursor[static_cast(var)]++; + graph.var_to_check[pos] = static_cast(i); + graph.var_to_edge[pos] = edge; + graph.var_to_h[pos] = h_ij; + graph.var_to_h_inv[pos] = GaloisField64::inv(h_ij); + } + } + + return true; +} +} // namespace + +bool beidou_cnav1_ldpc_init_graph( + int32_t num_checks, + int32_t num_variables, + int32_t row_weight, + const uint16_t* icd_index, + const uint8_t* icd_element, + int32_t num_entries, + BeidouCnav1LdpcGraph& graph) +{ + return init_graph_impl(num_checks, num_variables, row_weight, icd_index, icd_element, num_entries, graph); +} + +const BeidouCnav1LdpcGraph& beidou_cnav1_ldpc_graph_200_100() +{ + static const BeidouCnav1LdpcGraph graph = []() { + BeidouCnav1LdpcGraph out; + const bool ok = beidou_cnav1_ldpc_init_graph( + BEIDOU_CNAV1_LDPC_M200, + BEIDOU_CNAV1_LDPC_N200, + BEIDOU_CNAV1_LDPC_DC200, + BEIDOU_CNAV1_H100_200_INDEX, + BEIDOU_CNAV1_H100_200_ELEMENT, + BEIDOU_CNAV1_LDPC_M200 * BEIDOU_CNAV1_LDPC_DC200, + out); + if (!ok) + { + return BeidouCnav1LdpcGraph{}; + } + return out; + }(); + return graph; +} + +const BeidouCnav1LdpcGraph& beidou_cnav1_ldpc_graph_88_44() +{ + static const BeidouCnav1LdpcGraph graph = []() { + BeidouCnav1LdpcGraph out; + const bool ok = beidou_cnav1_ldpc_init_graph( + BEIDOU_CNAV1_LDPC_M88, + BEIDOU_CNAV1_LDPC_N88, + BEIDOU_CNAV1_LDPC_DC88, + BEIDOU_CNAV1_H44_88_INDEX, + BEIDOU_CNAV1_H44_88_ELEMENT, + BEIDOU_CNAV1_LDPC_M88 * BEIDOU_CNAV1_LDPC_DC88, + out); + if (!ok) + { + return BeidouCnav1LdpcGraph{}; + } + return out; + }(); + return graph; +} + +bool beidou_cnav1_ldpc_decode_200_100(const float* symbol_llr, int32_t num_bits, uint8_t* info_bits600) +{ + return decode_block(beidou_cnav1_ldpc_graph_200_100(), symbol_llr, num_bits, info_bits600, nullptr); +} + +bool beidou_cnav1_ldpc_decode_88_44(const float* symbol_llr, int32_t num_bits, uint8_t* info_bits264) +{ + return decode_block(beidou_cnav1_ldpc_graph_88_44(), symbol_llr, num_bits, info_bits264, nullptr); +} + +bool beidou_cnav1_ldpc_decode_200_100_codeword(const float* symbol_llr, int32_t num_bits, uint8_t* codeword_bits1200) +{ + return decode_block(beidou_cnav1_ldpc_graph_200_100(), symbol_llr, num_bits, nullptr, codeword_bits1200); +} + +bool beidou_cnav1_ldpc_decode_88_44_codeword(const float* symbol_llr, int32_t num_bits, uint8_t* codeword_bits528) +{ + return decode_block(beidou_cnav1_ldpc_graph_88_44(), symbol_llr, num_bits, nullptr, codeword_bits528); +} diff --git a/src/core/system_parameters/beidou_cnav1_ldpc.h b/src/core/system_parameters/beidou_cnav1_ldpc.h new file mode 100644 index 000000000..9558e7a6c --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_ldpc.h @@ -0,0 +1,183 @@ +/*! + * \file beidou_cnav1_ldpc.h + * \brief B-CNAV1 NB-LDPC decoder (BDS-SIS-ICD-B1C-1.0 §6.2.2, Appendix) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_CNAV1_LDPC_DECODER_H +#define GNSS_SDR_BEIDOU_CNAV1_LDPC_DECODER_H + +#include +#include +#include + +constexpr int32_t BEIDOU_CNAV1_LDPC_N200 = 200; +constexpr int32_t BEIDOU_CNAV1_LDPC_K200 = 100; +constexpr int32_t BEIDOU_CNAV1_LDPC_M200 = 100; +constexpr int32_t BEIDOU_CNAV1_LDPC_DC200 = 4; +constexpr int32_t BEIDOU_CNAV1_LDPC_N88 = 88; +constexpr int32_t BEIDOU_CNAV1_LDPC_K88 = 44; +constexpr int32_t BEIDOU_CNAV1_LDPC_M88 = 44; +constexpr int32_t BEIDOU_CNAV1_LDPC_DC88 = 4; +constexpr int32_t BEIDOU_CNAV1_LDPC_NM = 8; +constexpr int32_t BEIDOU_CNAV1_LDPC_MAX_ITER = 15; + +/* + * GF(2^6) LUTs follow BDS-SIS-ICD-B1C-1.0 Appendix mapping tables. + * Primitive polynomial: p(x)=x^6+x+1. + */ +constexpr uint16_t BEIDOU_CNAV1_H100_200_INDEX[400] = { + 11, 62, 102, 150, 9, 60, 100, 148, 0, 51, 142, 197, 22, 80, 116, 154, 4, 90, + 131, 177, 47, 95, 138, 191, 51, 79, 146, 195, 44, 75, 142, 190, 13, 57, 135, + 198, 24, 65, 120, 173, 6, 88, 129, 179, 7, 89, 130, 176, 6, 58, 106, 158, 8, + 60, 108, 160, 44, 92, 139, 188, 4, 56, 104, 156, 10, 61, 101, 149, 39, 87, 123, + 168, 15, 67, 105, 167, 50, 78, 145, 194, 17, 98, 151, 187, 46, 94, 137, 190, + 14, 66, 104, 166, 7, 59, 107, 159, 21, 83, 119, 153, 31, 87, 114, 167, 2, 49, + 140, 199, 12, 64, 106, 164, 40, 53, 132, 159, 19, 96, 149, 185, 16, 68, 112, + 168, 14, 58, 132, 199, 34, 69, 125, 162, 23, 75, 119, 175, 42, 96, 144, 192, + 8, 63, 103, 151, 23, 81, 117, 155, 24, 93, 111, 182, 20, 72, 116, 172, 17, 69, + 113, 169, 34, 82, 130, 182, 1, 53, 101, 153, 46, 73, 140, 188, 13, 65, 107, + 165, 2, 54, 102, 154, 18, 70, 114, 170, 26, 67, 122, 175, 29, 77, 125, 177, + 36, 84, 120, 169, 25, 94, 108, 183, 39, 89, 137, 185, 21, 73, 117, 173, 28, + 76, 124, 176, 36, 90, 138, 186, 33, 68, 124, 161, 12, 56, 134, 197, 29, 85, + 112, 165, 45, 93, 136, 189, 27, 64, 123, 172, 28, 84, 115, 164, 25, 66, 121, + 174, 37, 85, 121, 170, 3, 50, 141, 196, 48, 76, 147, 192, 35, 70, 126, 163, + 32, 80, 128, 180, 0, 52, 100, 152, 43, 52, 135, 158, 35, 83, 131, 183, 10, + 62, 110, 162, 19, 71, 115, 171, 15, 59, 133, 196, 33, 81, 129, 181, 41, 54, + 133, 156, 20, 82, 118, 152, 38, 86, 122, 171, 30, 78, 126, 178, 9, 61, 109, + 161, 26, 95, 109, 180, 45, 72, 143, 191, 1, 48, 143, 198, 40, 98, 146, 194, + 18, 99, 148, 184, 5, 57, 105, 157, 41, 99, 147, 195, 31, 79, 127, 179, 3, 55, + 103, 155, 22, 74, 118, 174, 37, 91, 139, 187, 5, 91, 128, 178, 30, 86, 113, + 166, 43, 97, 145, 193, 16, 97, 150, 186, 11, 63, 111, 163, 32, 71, 127, 160, + 42, 55, 134, 157, 38, 88, 136, 184, 47, 74, 141, 189, 49, 77, 144, 193, 27, + 92, 110, 181}; +constexpr uint8_t BEIDOU_CNAV1_H100_200_ELEMENT[400] = { + 35, 13, 51, 60, 1, 44, 53, 24, 1, 45, 15, 6, 45, 15, 6, 1, 1, 44, 53, 24, 1, + 45, 15, 6, 35, 46, 56, 15, 6, 1, 45, 15, 15, 6, 1, 45, 44, 53, 24, 1, 24, 1, + 44, 30, 1, 45, 15, 6, 30, 24, 1, 44, 24, 1, 44, 30, 45, 15, 6, 1, 17, 38, 49, + 11, 24, 1, 44, 30, 24, 1, 44, 53, 24, 1, 44, 53, 30, 24, 1, 44, 33, 42, 14, + 24, 33, 42, 14, 24, 45, 15, 6, 1, 1, 45, 15, 6, 30, 24, 1, 44, 24, 1, 44, 53, + 1, 44, 30, 24, 57, 25, 9, 41, 1, 45, 15, 6, 1, 45, 15, 6, 42, 36, 12, 57, 6, + 1, 45, 15, 24, 1, 44, 53, 24, 1, 44, 30, 1, 45, 15, 6, 1, 45, 15, 6, 44, 53, + 24, 1, 30, 24, 1, 44, 1, 44, 30, 24, 53, 24, 1, 44, 1, 44, 53, 24, 27, 28, + 30, 31, 53, 24, 1, 44, 24, 1, 44, 30, 45, 15, 6, 1, 30, 24, 1, 44, 1, 45, 15, + 6, 26, 22, 14, 2, 35, 13, 18, 60, 45, 15, 6, 1, 30, 1, 44, 7, 6, 1, 45, 15, + 6, 1, 45, 15, 53, 24, 1, 44, 24, 1, 44, 53, 30, 24, 1, 44, 1, 44, 30, 24, 44, + 53, 24, 1, 53, 24, 1, 44, 44, 30, 24, 1, 30, 24, 1, 44, 1, 44, 30, 24, 1, 44, + 30, 24, 41, 16, 29, 51, 1, 44, 30, 24, 38, 23, 22, 7, 44, 53, 24, 1, 1, 45, + 15, 6, 30, 24, 1, 44, 53, 24, 1, 44, 6, 1, 45, 15, 24, 1, 44, 53, 35, 46, 56, + 15, 5, 33, 42, 14, 54, 7, 38, 23, 1, 45, 15, 6, 44, 30, 24, 1, 6, 1, 45, 15, + 53, 24, 1, 44, 44, 53, 24, 1, 1, 44, 53, 24, 1, 44, 30, 24, 44, 30, 24, 1, 1, + 44, 53, 24, 45, 15, 6, 1, 6, 1, 45, 15, 1, 44, 53, 24, 42, 47, 37, 32, 51, 60, + 35, 13, 29, 28, 30, 31, 6, 1, 45, 15, 24, 1, 44, 53, 44, 53, 24, 1, 44, 30, + 24, 1, 38, 49, 11, 17, 44, 30, 24, 1, 24, 1, 44, 30, 24, 1, 44, 30, 1, 44, 53, + 24, 53, 24, 1, 44}; +constexpr uint16_t BEIDOU_CNAV1_H44_88_INDEX[176] = { + 14, 35, 56, 70, 11, 29, 55, 73, 13, 39, 53, 69, 15, 34, 57, 71, 1, 27, 45, 54, + 23, 41, 63, 87, 2, 20, 46, 68, 6, 24, 50, 61, 2, 26, 61, 79, 9, 33, 59, 77, 4, + 30, 48, 74, 22, 42, 59, 76, 12, 38, 52, 68, 23, 43, 58, 77, 19, 21, 63, 64, 11, + 25, 65, 82, 17, 39, 44, 75, 9, 35, 49, 72, 19, 29, 66, 84, 13, 36, 56, 82, 17, + 43, 67, 81, 22, 40, 62, 86, 3, 21, 47, 69, 10, 24, 64, 83, 0, 37, 70, 86, 5, 31, + 49, 75, 4, 40, 53, 84, 5, 41, 52, 85, 18, 28, 67, 85, 0, 26, 44, 55, 10, 28, 54, + 72, 7, 30, 50, 81, 1, 36, 71, 87, 16, 38, 45, 74, 8, 34, 48, 73, 8, 32, 58, 76, + 12, 37, 57, 83, 6, 31, 51, 80, 15, 33, 47, 79, 16, 42, 66, 80, 7, 25, 51, 60, 3, + 27, 60, 78, 14, 32, 46, 78, 18, 20, 62, 65}; +constexpr uint8_t BEIDOU_CNAV1_H44_88_ELEMENT[176] = { + 30, 24, 1, 44, 24, 1, 44, 30, 40, 32, 61, 18, 53, 24, 1, 44, 51, 60, 35, 13, 18, + 15, 32, 61, 15, 6, 1, 45, 30, 24, 1, 44, 6, 1, 45, 15, 45, 15, 6, 1, 1, 45, 15, + 6, 1, 44, 53, 24, 24, 1, 44, 53, 44, 30, 24, 1, 34, 33, 45, 36, 55, 9, 34, 3, + 1, 44, 53, 24, 61, 47, 20, 8, 53, 24, 1, 44, 15, 6, 1, 45, 13, 18, 60, 35, 45, + 15, 6, 1, 24, 1, 44, 53, 37, 32, 52, 47, 44, 53, 24, 1, 39, 36, 34, 33, 44, 35, + 31, 50, 12, 25, 36, 14, 15, 35, 46, 56, 53, 24, 1, 44, 1, 44, 53, 24, 24, 1, 44, + 30, 44, 30, 24, 1, 15, 6, 1, 45, 30, 24, 1, 44, 2, 50, 22, 14, 33, 42, 14, 5, 34, + 3, 55, 9, 44, 35, 61, 50, 15, 6, 1, 45, 45, 15, 6, 1, 1, 44, 30, 24, 6, 1, 45, + 15, 1, 44, 53, 24}; +constexpr uint8_t BEIDOU_CNAV1_GF64_EXP[64] = { + 1, 2, 4, 8, 16, 32, 3, 6, 12, 24, 48, 35, 5, 10, 20, 40, 19, 38, 15, 30, 60, 59, 53, + 41, 17, 34, 7, 14, 28, 56, 51, 37, 9, 18, 36, 11, 22, 44, 27, 54, 47, 29, 58, 55, + 45, 25, 50, 39, 13, 26, 52, 43, 21, 42, 23, 46, 31, 62, 63, 61, 57, 49, 33, 1}; +constexpr int8_t BEIDOU_CNAV1_GF64_LOG[64] = { + 0, 0, 1, 6, 2, 12, 7, 26, 3, 32, 13, 35, 8, 48, 27, 18, 4, 24, 33, 16, 14, 52, 36, + 54, 9, 45, 49, 38, 28, 41, 19, 56, 5, 62, 25, 11, 34, 31, 17, 47, 15, 23, 53, 51, + 37, 44, 55, 40, 10, 61, 46, 30, 50, 22, 39, 43, 29, 60, 42, 21, 20, 59, 57, 58}; + +bool beidou_cnav1_ldpc_decode_200_100(const float* symbol_llr, int32_t num_bits, uint8_t* info_bits600); +bool beidou_cnav1_ldpc_decode_88_44(const float* symbol_llr, int32_t num_bits, uint8_t* info_bits264); +bool beidou_cnav1_ldpc_decode_200_100_codeword(const float* symbol_llr, int32_t num_bits, uint8_t* codeword_bits1200); +bool beidou_cnav1_ldpc_decode_88_44_codeword(const float* symbol_llr, int32_t num_bits, uint8_t* codeword_bits528); + +namespace GaloisField64 +{ +constexpr uint8_t kZero = 0U; +constexpr uint8_t kOrder = 63U; +constexpr uint8_t kFieldSize = 64U; + +// LUT values come from BDS-SIS-ICD-B1C-1.0 Appendix GF(2^6) mapping rules. +inline bool valid_symbol(uint8_t x) +{ + return x < kFieldSize; +} + +inline uint8_t add(uint8_t a, uint8_t b) +{ + if (!valid_symbol(a) || !valid_symbol(b)) + { + return kZero; + } + return static_cast(a ^ b); +} + +inline uint8_t mul(uint8_t a, uint8_t b) +{ + if (!valid_symbol(a) || !valid_symbol(b) || a == kZero || b == kZero) + { + return kZero; + } + const int32_t log_sum = static_cast(BEIDOU_CNAV1_GF64_LOG[a]) + + static_cast(BEIDOU_CNAV1_GF64_LOG[b]); + return BEIDOU_CNAV1_GF64_EXP[log_sum % kOrder]; +} + +inline uint8_t inv(uint8_t a) +{ + if (!valid_symbol(a) || a == kZero) + { + return kZero; + } + const int32_t exponent = static_cast(kOrder) - static_cast(BEIDOU_CNAV1_GF64_LOG[a]); + return BEIDOU_CNAV1_GF64_EXP[exponent % kOrder]; +} +} // namespace GaloisField64 + +struct BeidouCnav1LdpcGraph +{ + int32_t num_checks = 0; + int32_t num_variables = 0; + int32_t row_weight = 0; + + // Check-node (CSR-like) adjacency: [check_offsets[i], check_offsets[i+1]). + std::vector check_offsets; + std::vector check_to_var; + std::vector check_to_h; + + // Variable-node (CSC-like) adjacency: [var_offsets[j], var_offsets[j+1]). + std::vector var_offsets; + std::vector var_to_check; + std::vector var_to_edge; + std::vector var_to_h; + std::vector var_to_h_inv; +}; + +bool beidou_cnav1_ldpc_init_graph( + int32_t num_checks, + int32_t num_variables, + int32_t row_weight, + const uint16_t* icd_index, + const uint8_t* icd_element, + int32_t num_entries, + BeidouCnav1LdpcGraph& graph); + +const BeidouCnav1LdpcGraph& beidou_cnav1_ldpc_graph_200_100(); +const BeidouCnav1LdpcGraph& beidou_cnav1_ldpc_graph_88_44(); + +#endif // GNSS_SDR_BEIDOU_CNAV1_LDPC_DECODER_H diff --git a/src/core/system_parameters/beidou_cnav1_navigation_message.cc b/src/core/system_parameters/beidou_cnav1_navigation_message.cc new file mode 100644 index 000000000..22c68a17d --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_navigation_message.cc @@ -0,0 +1,884 @@ +/*! + * \file beidou_cnav1_navigation_message.cc + * \brief B-CNAV1 navigation message parser (BDS-SIS-ICD-B1C-1.0 §6.2) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "beidou_cnav1_navigation_message.h" +#include "Beidou_B1C.h" +#include "Beidou_CNAV1.h" +#include "beidou_cnav1_ldpc.h" +#include +#include +#include +#include +#include +#include + +namespace +{ +struct BchCodebook +{ + int32_t n = 0; + int32_t k = 0; + int32_t corr_threshold = 0; + std::vector bipolar_codewords; + std::vector messages; +}; + +std::vector encode_bch_hypothesis_bipolar( + uint16_t msg_bits, + int32_t n, + int32_t k, + const std::vector& feedback_pos_1based) +{ + std::vector register_state(static_cast(k), 1); + std::vector encoded(static_cast(n), 1); + + for (int32_t i = 0; i < k; i++) + { + const auto bit = static_cast((msg_bits >> static_cast(k - 1 - i)) & 1U); + register_state[static_cast(k - 1 - i)] = (bit == 0) ? 1 : -1; + } + + for (int32_t ind = 0; ind < n; ind++) + { + encoded[static_cast(ind)] = register_state.back(); + int8_t feedback = 1; + for (const int32_t pos : feedback_pos_1based) + { + feedback = static_cast(feedback * register_state[static_cast(pos - 1)]); + } + for (int32_t j = k - 1; j > 0; j--) + { + register_state[static_cast(j)] = register_state[static_cast(j - 1)]; + } + register_state[0] = feedback; + } + + return encoded; +} + +BchCodebook build_bch_codebook( + int32_t n, + int32_t k, + const std::vector& feedback_pos_1based, + int32_t corr_threshold) +{ + BchCodebook cb{}; + cb.n = n; + cb.k = k; + cb.corr_threshold = corr_threshold; + const uint32_t num_messages = 1U << static_cast(k); + cb.bipolar_codewords.resize(static_cast(num_messages) * static_cast(n)); + cb.messages.resize(num_messages); + for (uint32_t m = 0; m < num_messages; m++) + { + const auto encoded = encode_bch_hypothesis_bipolar(static_cast(m), n, k, feedback_pos_1based); + std::copy(encoded.begin(), encoded.end(), + cb.bipolar_codewords.begin() + static_cast(m) * static_cast(n)); + cb.messages[m] = static_cast(m); + } + return cb; +} + +bool decode_bch_codeword(const int32_t* in, int32_t* out_msg, const BchCodebook& cb) +{ + int32_t best_corr = std::numeric_limits::min(); + uint16_t best_message = 0U; + for (size_t i = 0; i < cb.messages.size(); i++) + { + int32_t corr = 0; + const auto* cw = cb.bipolar_codewords.data() + static_cast(i) * cb.n; + for (int32_t j = 0; j < cb.n; j++) + { + const int32_t bit = in[j] > 0 ? 1 : 0; + const int32_t bipolar = (bit == 0) ? 1 : -1; + corr += static_cast(cw[j]) * bipolar; + } + if (corr > best_corr) + { + best_corr = corr; + best_message = cb.messages[i]; + } + } + if (best_corr < cb.corr_threshold) + { + return false; + } + for (int32_t bit = 0; bit < cb.k; bit++) + { + out_msg[bit] = static_cast((best_message >> static_cast(cb.k - 1 - bit)) & 1U); + } + return true; +} + + +static bool decode_bch_21_6(const int32_t* in, int32_t* out_msg) +{ + static const std::vector feedback_pos = {2, 4, 5, 6}; + static const BchCodebook cb = build_bch_codebook(21, 6, feedback_pos, 20); + return decode_bch_codeword(in, out_msg, cb); +} + + +static bool decode_bch_51_8(const int32_t* in, int32_t* out_msg) +{ + static const std::vector feedback_pos = {1, 4, 5, 6, 7, 8}; + static const BchCodebook cb = build_bch_codebook(51, 8, feedback_pos, 50); + return decode_bch_codeword(in, out_msg, cb); +} + + +uint32_t bits_to_unsigned(const int32_t* bits, int32_t length) +{ + uint32_t value = 0; + for (int32_t i = 0; i < length; i++) + { + value = (value << 1) | static_cast(bits[i] & 1); + } + return value; +} + +template +UIntT read_bits_be(const uint8_t* bits, int32_t offset, int32_t length) +{ + UIntT value = 0; + for (int32_t i = 0; i < length; i++) + { + value = static_cast((value << 1U) | static_cast(bits[offset + i] & 0x1U)); + } + return value; +} + +template +IntT sign_extend(uint64_t raw, int32_t bit_width) +{ + const uint64_t sign_mask = 1ULL << static_cast(bit_width - 1); + if ((raw & sign_mask) == 0ULL) + { + return static_cast(raw); + } + const uint64_t extend_mask = ~((1ULL << static_cast(bit_width)) - 1ULL); + return static_cast(raw | extend_mask); +} + +double twos_pow(int32_t exponent) +{ + return std::ldexp(1.0, exponent); +} + + +void deinterleave_sf2_sf3(const float* interleaved, float* sf2, float* sf3) +{ + int32_t sf2_idx = 0; + int32_t sf3_idx = 0; + for (int32_t in_idx = 0; in_idx < BEIDOU_CNAV1_INTERLEAVED_SYMBOLS; in_idx++) + { + // Received stream is column-major readout of a 36x48 block. + const int32_t row = in_idx % BEIDOU_CNAV1_INTERLEAVE_ROWS; + const int32_t col = in_idx / BEIDOU_CNAV1_INTERLEAVE_ROWS; + if (row < 33) + { + const int32_t group = row / 3; // 0..10 + const int32_t rem = row % 3; // 0,1 => SF2 rows ; 2 => SF3 row + if (rem < 2) + { + const int32_t sf2_row = group * 2 + rem; // 0..21 + sf2[sf2_row * BEIDOU_CNAV1_INTERLEAVE_COLS + col] = interleaved[in_idx]; + sf2_idx++; + } + else + { + const int32_t sf3_row = group; // 0..10 + sf3[sf3_row * BEIDOU_CNAV1_INTERLEAVE_COLS + col] = interleaved[in_idx]; + sf3_idx++; + } + } + else + { + const int32_t sf2_row = 22 + (row - 33); // 22..24 + sf2[sf2_row * BEIDOU_CNAV1_INTERLEAVE_COLS + col] = interleaved[in_idx]; + sf2_idx++; + } + } + (void)sf2_idx; + (void)sf3_idx; +} + +uint64_t read_unsigned(const uint8_t* bits, int32_t offset, int32_t length) +{ + return read_bits_be(bits, offset, length); +} + +int64_t read_signed(const uint8_t* bits, int32_t offset, int32_t length) +{ + const uint64_t raw = read_unsigned(bits, offset, length); + return sign_extend(raw, length); +} +uint32_t crc24q(const uint8_t* bits, int32_t num_bits) +{ + // 寄存器初始值设为全 0 + uint32_t crc = 0; + + // 生成多项式去除了最高位 x^24 后的低 24 位掩码 (0x1864CFB & 0xFFFFFF) + const uint32_t POLY = 0x864CFBU; + + for (int32_t i = 0; i < num_bits; i++) + { + // 提取当前最高位(第24位,索引为23) + uint32_t msb = (crc >> 23) & 1U; + uint32_t bit = (bits[i] != 0U) ? 1U : 0U; + + // 寄存器左移,保持 24 位位宽 + crc = (crc << 1) & 0xFFFFFFU; + + // MSB 反馈与输入信息比特异或,决定是否执行多项式除法(异或生成多项式) + if (msb ^ bit) + { + crc ^= POLY; + } + } + + // 依次输出构成 CRC 校验序列 + return crc; +} + +bool verify_crc24q(const uint8_t* bits, int32_t data_bits) +{ + const uint32_t computed = crc24q(bits, data_bits); + const auto received = static_cast(read_unsigned(bits, data_bits, BEIDOU_CNAV1_CRC_BITS)); + return computed == received; +} + +double a_ref_from_sat_type(uint32_t sat_type) +{ + if (sat_type == 0b01U || sat_type == 0b10U) + { + return BEIDOU_CNAV1_A_REF_IGSO; + } + return BEIDOU_CNAV1_A_REF_MEO; +} + +int32_t nav_type_from_sat_type(uint32_t sat_type) +{ + if (sat_type == 0b01U) + { + return 0; + } + return 1; +} + +void parse_subframe2(const uint8_t* bits, Beidou_Cnav1_Ephemeris& eph, double soh_seconds) +{ + int32_t offset = 0; + eph.WN = static_cast(read_unsigned(bits, offset, 13)); + offset += 13; + const auto how = static_cast(read_unsigned(bits, offset, 8)); + offset += 8; + eph.IODC = static_cast(read_unsigned(bits, offset, 10)); + offset += 10; + eph.IODE = static_cast(read_unsigned(bits, offset, 8)); + offset += 8; + + const auto toe_raw = static_cast(read_unsigned(bits, offset, 11)); + offset += 11; + const auto sat_type = static_cast(read_unsigned(bits, offset, 2)); + offset += 2; + const auto delta_a = static_cast(read_signed(bits, offset, 26)) * BEIDOU_CNAV1_DELTA_A_LSB; + offset += 26; + const auto a_dot = static_cast(read_signed(bits, offset, 25)) * BEIDOU_CNAV1_A_DOT_LSB; + offset += 25; + eph.delta_n = static_cast(read_signed(bits, offset, 17)) * BEIDOU_CNAV1_DELTA_N0_LSB; + offset += 17; + const auto delta_n_dot = static_cast(read_signed(bits, offset, 23)) * BEIDOU_CNAV1_DELTA_N0_DOT_LSB; + offset += 23; + eph.M_0 = static_cast(read_signed(bits, offset, 33)) * BEIDOU_CNAV1_M0_LSB; + offset += 33; + eph.ecc = static_cast(read_unsigned(bits, offset, 33)) * BEIDOU_CNAV1_E_LSB; + offset += 33; + eph.omega = static_cast(read_signed(bits, offset, 33)) * BEIDOU_CNAV1_OMEGA_LSB; + offset += 33; + + eph.OMEGA_0 = static_cast(read_signed(bits, offset, 33)) * BEIDOU_CNAV1_OMEGA_LSB; + offset += 33; + eph.i_0 = static_cast(read_signed(bits, offset, 33)) * BEIDOU_CNAV1_I0_LSB; + offset += 33; + eph.OMEGAdot = static_cast(read_signed(bits, offset, 19)) * BEIDOU_CNAV1_OMEGADOT_LSB; + offset += 19; + eph.idot = static_cast(read_signed(bits, offset, 15)) * BEIDOU_CNAV1_IDOT_LSB; + offset += 15; + eph.Cis = static_cast(read_signed(bits, offset, 16)) * BEIDOU_CNAV1_CIS_LSB; + offset += 16; + eph.Cic = static_cast(read_signed(bits, offset, 16)) * BEIDOU_CNAV1_CIC_LSB; + offset += 16; + eph.Crs = static_cast(read_signed(bits, offset, 24)) * BEIDOU_CNAV1_CRS_LSB; + offset += 24; + eph.Crc = static_cast(read_signed(bits, offset, 24)) * BEIDOU_CNAV1_CRC_LSB; + offset += 24; + eph.Cus = static_cast(read_signed(bits, offset, 21)) * BEIDOU_CNAV1_CUS_LSB; + offset += 21; + eph.Cuc = static_cast(read_signed(bits, offset, 21)) * BEIDOU_CNAV1_CUC_LSB; + offset += 21; + + eph.toc = static_cast(read_unsigned(bits, offset, 11)); + offset += 11; + eph.af0 = static_cast(read_signed(bits, offset, 25)) * BEIDOU_CNAV1_AF0_LSB; + offset += 25; + eph.af1 = static_cast(read_signed(bits, offset, 22)) * BEIDOU_CNAV1_AF1_LSB; + offset += 22; + eph.af2 = static_cast(read_signed(bits, offset, 11)) * BEIDOU_CNAV1_AF2_LSB; + offset += 11; + eph.TGD_B2ap = static_cast(read_signed(bits, offset, 12)) * BEIDOU_CNAV1_TGD_LSB; + offset += 12; + eph.ISC_B1Cd = static_cast(read_signed(bits, offset, 12)) * BEIDOU_CNAV1_ISC_LSB; + offset += 12; + eph.TGD_B1Cp = static_cast(read_signed(bits, offset, 12)) * BEIDOU_CNAV1_TGD_LSB; + offset += 12; + (void)a_dot; + (void)delta_n_dot; + + const double a_ref = a_ref_from_sat_type(sat_type); + eph.sqrtA = std::sqrt(a_ref + delta_a); + eph.toe = static_cast(toe_raw * BEIDOU_CNAV1_TOE_TOC_LSB); + eph.toc = static_cast(eph.toc * BEIDOU_CNAV1_TOE_TOC_LSB); + eph.tow = static_cast(how * 3600 + soh_seconds); + eph.nav_type = nav_type_from_sat_type(sat_type); + eph.sig_type = 7; +} + +void parse_page_common( + const uint8_t* bits, + bool has_sisaioe, + bool has_sisaioc, + Bds3_B1c_PageData& page_data, + int32_t& offset) +{ + offset = 0; + page_data.common.page_id = static_cast(read_unsigned(bits, offset, 6)); + offset += 6; + page_data.common.hs = static_cast(read_unsigned(bits, offset, 2)); + offset += 2; + page_data.common.dif = read_unsigned(bits, offset, 1) != 0U; + offset += 1; + page_data.common.sif = read_unsigned(bits, offset, 1) != 0U; + offset += 1; + page_data.common.aif = read_unsigned(bits, offset, 1) != 0U; + offset += 1; + page_data.common.sismai = static_cast(read_unsigned(bits, offset, 4)); + offset += 4; + page_data.sisaioe = 0; + page_data.sisaioc = 0; + if (has_sisaioe) + { + page_data.sisaioe = static_cast(read_unsigned(bits, offset, 5)); + offset += 5; + } + if (has_sisaioc) + { + page_data.sisaioc = static_cast(read_unsigned(bits, offset, 22)); + offset += 22; + } +} + +void parse_reduced_almanac(const uint8_t* bits, int32_t& offset, Bds3_B1c_AlmanacReduced& almanac) +{ + almanac.prn = static_cast(read_unsigned(bits, offset, 6)); + offset += 6; + almanac.sat_type = static_cast(read_unsigned(bits, offset, 2)); + offset += 2; + almanac.delta_a_m = static_cast(read_signed(bits, offset, 8)) * twos_pow(9); + offset += 8; + almanac.omega0_rad = static_cast(read_signed(bits, offset, 7)) * twos_pow(-6) * M_PI; + offset += 7; + almanac.phi0_rad = static_cast(read_signed(bits, offset, 7)) * twos_pow(-6) * M_PI; + offset += 7; + almanac.health = static_cast(read_unsigned(bits, offset, 8)); + offset += 8; +} + +void parse_medium_almanac(const uint8_t* bits, int32_t& offset, Bds3_B1c_AlmanacMedium& almanac) +{ + almanac.prn = static_cast(read_unsigned(bits, offset, 6)); + offset += 6; + almanac.sat_type = static_cast(read_unsigned(bits, offset, 2)); + offset += 2; + almanac.wna = static_cast(read_unsigned(bits, offset, 13)); + offset += 13; + almanac.toa_s = static_cast(read_unsigned(bits, offset, 8)) * 4096; + offset += 8; + almanac.eccentricity = static_cast(read_unsigned(bits, offset, 11)) * twos_pow(-16); + offset += 11; + almanac.delta_i_rad = static_cast(read_signed(bits, offset, 11)) * twos_pow(-14) * M_PI; + offset += 11; + almanac.sqrt_a_m_sqrt = static_cast(read_unsigned(bits, offset, 17)) * twos_pow(-4); + offset += 17; + almanac.omega0_rad = static_cast(read_signed(bits, offset, 16)) * twos_pow(-15) * M_PI; + offset += 16; + almanac.omega_dot_rad_s = static_cast(read_signed(bits, offset, 11)) * twos_pow(-33) * M_PI; + offset += 11; + almanac.omega_rad = static_cast(read_signed(bits, offset, 16)) * twos_pow(-15) * M_PI; + offset += 16; + almanac.m0_rad = static_cast(read_signed(bits, offset, 16)) * twos_pow(-15) * M_PI; + offset += 16; + almanac.af0_s = static_cast(read_signed(bits, offset, 11)) * twos_pow(-20); + offset += 11; + almanac.af1_s_s = static_cast(read_signed(bits, offset, 10)) * twos_pow(-37); + offset += 10; + almanac.health = static_cast(read_unsigned(bits, offset, 8)); + offset += 8; +} + +void parse_eop(const uint8_t* bits, int32_t& offset, Bds3_B1c_Eop& eop) +{ + eop.t_eop_s = static_cast(read_unsigned(bits, offset, 16)) * 16; + offset += 16; + eop.pm_x_arcsec = static_cast(read_signed(bits, offset, 21)) * twos_pow(-20); + offset += 21; + eop.pm_x_dot_arcsec_day = static_cast(read_signed(bits, offset, 15)) * twos_pow(-21); + offset += 15; + eop.pm_y_arcsec = static_cast(read_signed(bits, offset, 21)) * twos_pow(-20); + offset += 21; + eop.pm_y_dot_arcsec_day = static_cast(read_signed(bits, offset, 15)) * twos_pow(-21); + offset += 15; + eop.delta_ut1_s = static_cast(read_signed(bits, offset, 31)) * twos_pow(-24); + offset += 31; + eop.delta_ut1_dot_s_day = static_cast(read_signed(bits, offset, 19)) * twos_pow(-25); + offset += 19; +} + +void parse_bgto(const uint8_t* bits, int32_t& offset, Bds3_B1c_Bgto& bgto) +{ + bgto.gnss_id = static_cast(read_unsigned(bits, offset, 3)); + offset += 3; + bgto.wn0_bgto = static_cast(read_unsigned(bits, offset, 13)); + offset += 13; + bgto.t0_bgto_s = static_cast(read_unsigned(bits, offset, 16)) * 16; + offset += 16; + bgto.a0_bgto_s = static_cast(read_signed(bits, offset, 16)) * twos_pow(-35); + offset += 16; + bgto.a1_bgto_s_s = static_cast(read_signed(bits, offset, 13)) * twos_pow(-51); + offset += 13; + bgto.a2_bgto_s_s2 = static_cast(read_signed(bits, offset, 7)) * twos_pow(-68); + offset += 7; +} + +void parse_page1( + const uint8_t* bits, + Beidou_Cnav1_Iono& iono, + Beidou_Cnav1_Utc_Model& utc, + Bds3_B1c_PageData& page_data) +{ + int32_t offset = 0; + parse_page_common(bits, true, true, page_data, offset); + iono.alpha1 = static_cast(read_signed(bits, offset, 10)) * 0.125; + offset += 10; + iono.alpha2 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha3 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha4 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha5 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha6 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha7 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha8 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + iono.alpha9 = static_cast(read_signed(bits, offset, 8)) * 0.125; + offset += 8; + + utc.A0 = static_cast(read_signed(bits, offset, 16)) * GNSS_SDR_TWO_N34; + offset += 16; + utc.A1 = static_cast(read_signed(bits, offset, 13)) * GNSS_SDR_TWO_N50; + offset += 13; + utc.A2 = static_cast(read_signed(bits, offset, 7)) * GNSS_SDR_TWO_N66; + offset += 7; + utc.delta_t_LSF = static_cast(read_signed(bits, offset, 8)); + offset += 8; + utc.tot = static_cast(read_unsigned(bits, offset, 16)); + offset += 16; + utc.WN_t = static_cast(read_unsigned(bits, offset, 13)); + offset += 13; + utc.WN_LSF = static_cast(read_unsigned(bits, offset, 13)); + offset += 13; + utc.DN = static_cast(read_unsigned(bits, offset, 3)); + offset += 3; + (void)read_signed(bits, offset, 8); +} + +void parse_page2(const uint8_t* bits, Bds3_B1c_PageData& page_data) +{ + int32_t offset = 0; + parse_page_common(bits, false, true, page_data, offset); + page_data.wna = static_cast(read_unsigned(bits, offset, 13)); + offset += 13; + page_data.toa_s = static_cast(read_unsigned(bits, offset, 8)) * 4096; + offset += 8; + for (auto& alm : page_data.reduced_almanac) + { + parse_reduced_almanac(bits, offset, alm); + } +} + +void parse_page3(const uint8_t* bits, Bds3_B1c_PageData& page_data) +{ + int32_t offset = 0; + parse_page_common(bits, true, false, page_data, offset); + parse_eop(bits, offset, page_data.eop); + parse_bgto(bits, offset, page_data.bgto); + // Consume trailing reserved block and CRC for layout completeness. + (void)read_unsigned(bits, offset, 14); + offset += 14; + (void)read_unsigned(bits, offset, 24); +} + +void parse_page4(const uint8_t* bits, Bds3_B1c_PageData& page_data) +{ + int32_t offset = 0; + parse_page_common(bits, false, true, page_data, offset); + parse_medium_almanac(bits, offset, page_data.medium_almanac); + // Consume trailing reserved block and CRC for layout completeness. + (void)read_unsigned(bits, offset, 47); + offset += 47; + (void)read_unsigned(bits, offset, 24); +} +} // namespace + + +bool Beidou_Cnav1_Navigation_Message::decode_frame( + const float* symbols, + int32_t num_symbols, + int32_t expected_prn, + int32_t* fail_stage) +{ + auto set_fail = [&](int32_t stage) { + if (fail_stage != nullptr) + { + *fail_stage = stage; + } + }; + + if (fail_stage != nullptr) + { + *fail_stage = -1; + } + if (num_symbols < BEIDOU_CNAV1_FRAME_SYMBOLS) + { + set_fail(0); + return false; + } + + std::array bit_llr{}; + for (int32_t i = 0; i < BEIDOU_CNAV1_FRAME_SYMBOLS; i++) + { + bit_llr[i] = symbols[i]; + } + + std::array hard_bits{}; + for (int32_t i = 0; i < BEIDOU_CNAV1_SUBFRAME1_SYMBOLS; i++) + { + hard_bits[i] = (symbols[i] >= 0.0F) ? 1 : 0; + } + + int32_t prn_bits[6]; + int32_t soh_bits[8]; + if (!decode_bch_21_6(hard_bits.data(), prn_bits)) + { + set_fail(1); + return false; + } + if (!decode_bch_51_8(hard_bits.data() + 21, soh_bits)) + { + set_fail(2); + return false; + } + + const uint32_t prn = bits_to_unsigned(prn_bits, 6); + if (prn < 1U || prn > static_cast(BEIDOU_B1C_NUMBER_OF_PRNS)) + { + set_fail(3); + return false; + } + if (expected_prn > 0 && static_cast(expected_prn) != prn) + { + set_fail(4); + return false; + } + + const uint32_t soh = bits_to_unsigned(soh_bits, 8); + const auto soh_seconds = static_cast(soh * BEIDOU_CNAV1_SOH_LSB_S); + ephemeris_.PRN = static_cast(prn); + + std::array sf2_llr{}; + std::array sf3_llr{}; + std::array sf2_llr_inv{}; + std::array sf2_llr_bitrev{}; + std::array sf2_llr_bitrev_inv{}; + std::array sf3_llr_inv{}; + std::array sf3_llr_bitrev{}; + std::array sf3_llr_bitrev_inv{}; + deinterleave_sf2_sf3(bit_llr.data() + BEIDOU_CNAV1_SUBFRAME1_SYMBOLS, sf2_llr.data(), sf3_llr.data()); + // LDPC works on GF(64): 6 bit-LLRs per symbol. Build four polarity/order variants + // (normal, inverted, per-symbol bit-reversed, both) and try each below. + for (int32_t i = 0; i < BEIDOU_CNAV1_SUBFRAME2_SYMBOLS; i++) + { + sf2_llr_inv[static_cast(i)] = -sf2_llr[static_cast(i)]; + } + // Reverse bit order within each 6-LLR GF(64) symbol; inv applies the same polarity flip. + for (int32_t symbol = 0; symbol < BEIDOU_CNAV1_SUBFRAME2_SYMBOLS / 6; symbol++) + { + const int32_t base = symbol * 6; + for (int32_t bit = 0; bit < 6; bit++) + { + sf2_llr_bitrev[static_cast(base + bit)] = + sf2_llr[static_cast(base + (5 - bit))]; + sf2_llr_bitrev_inv[static_cast(base + bit)] = + -sf2_llr_bitrev[static_cast(base + bit)]; + } + } + // SF3: same four LLR variants as SF2. + for (int32_t i = 0; i < BEIDOU_CNAV1_SUBFRAME3_SYMBOLS; i++) + { + sf3_llr_inv[static_cast(i)] = -sf3_llr[static_cast(i)]; + } + for (int32_t symbol = 0; symbol < BEIDOU_CNAV1_SUBFRAME3_SYMBOLS / 6; symbol++) + { + const int32_t base = symbol * 6; + for (int32_t bit = 0; bit < 6; bit++) + { + sf3_llr_bitrev[static_cast(base + bit)] = + sf3_llr[static_cast(base + (5 - bit))]; + sf3_llr_bitrev_inv[static_cast(base + bit)] = + -sf3_llr_bitrev[static_cast(base + bit)]; + } + } + + std::array sf2_data{}; + std::array sf3_data{}; + std::array sf2_codeword_bits{}; + std::array sf3_codeword_bits{}; + bool sf2_ldpc_ok = beidou_cnav1_ldpc_decode_200_100_codeword( + sf2_llr.data(), BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, sf2_codeword_bits.data()); + if (!sf2_ldpc_ok) + { + sf2_ldpc_ok = beidou_cnav1_ldpc_decode_200_100_codeword( + sf2_llr_inv.data(), BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, sf2_codeword_bits.data()); + } + if (!sf2_ldpc_ok) + { + sf2_ldpc_ok = beidou_cnav1_ldpc_decode_200_100_codeword( + sf2_llr_bitrev.data(), BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, sf2_codeword_bits.data()); + } + if (!sf2_ldpc_ok) + { + sf2_ldpc_ok = beidou_cnav1_ldpc_decode_200_100_codeword( + sf2_llr_bitrev_inv.data(), BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, sf2_codeword_bits.data()); + } + if (!sf2_ldpc_ok) + { + // SF2 LDPC fallback: after normal/inverted/bit-reversed attempts all fail, + // hard-slice the deinterleaved LLRs (sign of sf2_llr) as information bits. + for (int32_t i = 0; i < BEIDOU_CNAV1_SF2_DATA_BITS; i++) + { + sf2_data[static_cast(i)] = (sf2_llr[static_cast(i)] >= 0.0F) ? 1U : 0U; + } + } + else + { + // Some matrix descriptions/orderings are not guaranteed to keep information symbols + // in the first K symbols. Prefer the half that satisfies CRC if available. + std::copy_n(sf2_codeword_bits.begin(), BEIDOU_CNAV1_SF2_DATA_BITS, sf2_data.begin()); + if (!verify_crc24q(sf2_data.data(), BEIDOU_CNAV1_SF2_DATA_BITS - BEIDOU_CNAV1_CRC_BITS)) + { + std::copy_n( + sf2_codeword_bits.begin() + BEIDOU_CNAV1_SF2_DATA_BITS, + BEIDOU_CNAV1_SF2_DATA_BITS, + sf2_data.begin()); + } + } + bool sf3_ldpc_ok = beidou_cnav1_ldpc_decode_88_44_codeword( + sf3_llr.data(), BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, sf3_codeword_bits.data()); + if (!sf3_ldpc_ok) + { + sf3_ldpc_ok = beidou_cnav1_ldpc_decode_88_44_codeword( + sf3_llr_inv.data(), BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, sf3_codeword_bits.data()); + } + if (!sf3_ldpc_ok) + { + sf3_ldpc_ok = beidou_cnav1_ldpc_decode_88_44_codeword( + sf3_llr_bitrev.data(), BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, sf3_codeword_bits.data()); + } + if (!sf3_ldpc_ok) + { + sf3_ldpc_ok = beidou_cnav1_ldpc_decode_88_44_codeword( + sf3_llr_bitrev_inv.data(), BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, sf3_codeword_bits.data()); + } + if (!sf3_ldpc_ok) + { + for (int32_t i = 0; i < BEIDOU_CNAV1_SF3_DATA_BITS; i++) + { + sf3_data[static_cast(i)] = (sf3_llr[static_cast(i)] >= 0.0F) ? 1U : 0U; + } + } + else + { + std::copy_n(sf3_codeword_bits.begin(), BEIDOU_CNAV1_SF3_DATA_BITS, sf3_data.begin()); + if (!verify_crc24q(sf3_data.data(), BEIDOU_CNAV1_SF3_DATA_BITS - BEIDOU_CNAV1_CRC_BITS)) + { + std::copy_n( + sf3_codeword_bits.begin() + BEIDOU_CNAV1_SF3_DATA_BITS, + BEIDOU_CNAV1_SF3_DATA_BITS, + sf3_data.begin()); + } + } + + const bool sf2_crc_ok = verify_crc24q(sf2_data.data(), BEIDOU_CNAV1_SF2_DATA_BITS - BEIDOU_CNAV1_CRC_BITS); + const bool sf3_crc_ok = verify_crc24q(sf3_data.data(), BEIDOU_CNAV1_SF3_DATA_BITS - BEIDOU_CNAV1_CRC_BITS); + + if (!sf2_crc_ok) + { + set_fail(sf2_ldpc_ok ? 6 : 5); + return false; + } + + parse_subframe2(sf2_data.data(), ephemeris_, soh_seconds); + if (ephemeris_.sqrtA < 5000.0 || ephemeris_.sqrtA > 6700.0) + { + set_fail(7); + return false; + } + + ephemeris_.PRN = static_cast(prn); + tow_s_ = static_cast(ephemeris_.tow); + flag_new_ephemeris_ = true; + + if (sf3_crc_ok) + { + const auto page_id = static_cast(read_unsigned(sf3_data.data(), 0, 6)); + switch (page_id) + { + case 1: + parse_page1(sf3_data.data(), iono_, utc_model_, page_data_); + flag_new_iono_ = true; + flag_new_utc_ = true; + flag_new_page_data_ = true; + break; + case 2: + parse_page2(sf3_data.data(), page_data_); + flag_new_page_data_ = true; + break; + case 3: + parse_page3(sf3_data.data(), page_data_); + flag_new_page_data_ = true; + break; + case 4: + parse_page4(sf3_data.data(), page_data_); + flag_new_page_data_ = true; + break; + default: + break; + } + } + + return true; +} + + +bool Beidou_Cnav1_Navigation_Message::decode_frame_symbols( + const float* symbols, + int32_t num_symbols, + int32_t expected_prn, + int32_t* fail_stage) +{ + return decode_frame(symbols, num_symbols, expected_prn, fail_stage); +} + + +bool Beidou_Cnav1_Navigation_Message::probe_subframe1_prn(const float* symbols, int32_t num_symbols, int32_t expected_prn) const +{ + if (num_symbols < BEIDOU_CNAV1_SUBFRAME1_SYMBOLS) + { + return false; + } + + std::array hard_bits{}; + for (int32_t i = 0; i < BEIDOU_CNAV1_SUBFRAME1_SYMBOLS; i++) + { + hard_bits[i] = (symbols[i] >= 0.0F) ? 1 : 0; + } + + int32_t prn_bits[6]; + int32_t soh_bits[8]; + if (!decode_bch_21_6(hard_bits.data(), prn_bits)) + { + return false; + } + if (!decode_bch_51_8(hard_bits.data() + 21, soh_bits)) + { + return false; + } + + const uint32_t prn = bits_to_unsigned(prn_bits, 6); + if (prn < 1U || prn > static_cast(BEIDOU_B1C_NUMBER_OF_PRNS)) + { + return false; + } + return expected_prn <= 0 || static_cast(expected_prn) == prn; +} + + +bool Beidou_Cnav1_Navigation_Message::have_new_ephemeris() const +{ + return flag_new_ephemeris_; +} + +bool Beidou_Cnav1_Navigation_Message::have_new_iono() const +{ + return flag_new_iono_; +} + +bool Beidou_Cnav1_Navigation_Message::have_new_utc_model() const +{ + return flag_new_utc_; +} + +bool Beidou_Cnav1_Navigation_Message::have_new_page_data() const +{ + return flag_new_page_data_; +} + +void Beidou_Cnav1_Navigation_Message::clear_flags() +{ + flag_new_ephemeris_ = false; + flag_new_iono_ = false; + flag_new_utc_ = false; + flag_new_page_data_ = false; +} + +const Beidou_Cnav1_Ephemeris& Beidou_Cnav1_Navigation_Message::get_ephemeris() const +{ + return ephemeris_; +} + +const Beidou_Cnav1_Iono& Beidou_Cnav1_Navigation_Message::get_iono() const +{ + return iono_; +} + +const Beidou_Cnav1_Utc_Model& Beidou_Cnav1_Navigation_Message::get_utc_model() const +{ + return utc_model_; +} + +const Bds3_B1c_PageData& Beidou_Cnav1_Navigation_Message::get_page_data() const +{ + return page_data_; +} + +double Beidou_Cnav1_Navigation_Message::get_tow_s() const +{ + return tow_s_; +} diff --git a/src/core/system_parameters/beidou_cnav1_navigation_message.h b/src/core/system_parameters/beidou_cnav1_navigation_message.h new file mode 100644 index 000000000..bccf530e2 --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_navigation_message.h @@ -0,0 +1,122 @@ +/*! + * \file beidou_cnav1_navigation_message.h + * \brief B-CNAV1 navigation message parser (§6.2) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_CNAV1_NAVIGATION_MESSAGE_H +#define GNSS_SDR_BEIDOU_CNAV1_NAVIGATION_MESSAGE_H + +#include "beidou_cnav1_ephemeris.h" +#include "beidou_cnav1_iono.h" +#include "beidou_cnav1_utc_model.h" +#include + +struct Bds3_B1c_PageCommon +{ + int32_t page_id{}; + int32_t sismai{}; + int32_t hs{}; + bool dif{}; + bool sif{}; + bool aif{}; +}; + +struct Bds3_B1c_AlmanacReduced +{ + int32_t prn{}; + int32_t sat_type{}; + double delta_a_m{}; + double omega0_rad{}; + double phi0_rad{}; + int32_t health{}; +}; + +struct Bds3_B1c_AlmanacMedium +{ + int32_t prn{}; + int32_t sat_type{}; + int32_t wna{}; + int32_t toa_s{}; + double eccentricity{}; + double delta_i_rad{}; + double sqrt_a_m_sqrt{}; + double omega0_rad{}; + double omega_dot_rad_s{}; + double omega_rad{}; + double m0_rad{}; + double af0_s{}; + double af1_s_s{}; + int32_t health{}; +}; + +struct Bds3_B1c_Eop +{ + int32_t t_eop_s{}; + double pm_x_arcsec{}; + double pm_x_dot_arcsec_day{}; + double pm_y_arcsec{}; + double pm_y_dot_arcsec_day{}; + double delta_ut1_s{}; + double delta_ut1_dot_s_day{}; +}; + +struct Bds3_B1c_Bgto +{ + int32_t gnss_id{}; + int32_t wn0_bgto{}; + int32_t t0_bgto_s{}; + double a0_bgto_s{}; + double a1_bgto_s_s{}; + double a2_bgto_s_s2{}; +}; + +struct Bds3_B1c_PageData +{ + Bds3_B1c_PageCommon common{}; + int32_t sisaioc{}; + int32_t sisaioe{}; + int32_t wna{}; + int32_t toa_s{}; + std::array reduced_almanac{}; + Bds3_B1c_Eop eop{}; + Bds3_B1c_Bgto bgto{}; + Bds3_B1c_AlmanacMedium medium_almanac{}; +}; + +struct Beidou_Cnav1_PageData_Message +{ + int32_t PRN{}; + Bds3_B1c_PageData page_data{}; +}; + +class Beidou_Cnav1_Navigation_Message +{ +public: + bool decode_frame(const float* symbols, int32_t num_symbols, int32_t expected_prn = 0, int32_t* fail_stage = nullptr); + bool decode_frame_symbols(const float* symbols, int32_t num_symbols, int32_t expected_prn = 0, int32_t* fail_stage = nullptr); + bool probe_subframe1_prn(const float* symbols, int32_t num_symbols, int32_t expected_prn) const; + bool have_new_ephemeris() const; + bool have_new_iono() const; + bool have_new_utc_model() const; + bool have_new_page_data() const; + void clear_flags(); + const Beidou_Cnav1_Ephemeris& get_ephemeris() const; + const Beidou_Cnav1_Iono& get_iono() const; + const Beidou_Cnav1_Utc_Model& get_utc_model() const; + const Bds3_B1c_PageData& get_page_data() const; + double get_tow_s() const; + +private: + Beidou_Cnav1_Ephemeris ephemeris_{}; + Beidou_Cnav1_Iono iono_{}; + Beidou_Cnav1_Utc_Model utc_model_{}; + bool flag_new_ephemeris_{false}; + bool flag_new_iono_{false}; + bool flag_new_utc_{false}; + bool flag_new_page_data_{false}; + double tow_s_{0.0}; + Bds3_B1c_PageData page_data_{}; +}; + +#endif diff --git a/src/core/system_parameters/beidou_cnav1_utc_model.h b/src/core/system_parameters/beidou_cnav1_utc_model.h new file mode 100644 index 000000000..fe4f88886 --- /dev/null +++ b/src/core/system_parameters/beidou_cnav1_utc_model.h @@ -0,0 +1,24 @@ +/*! + * \file beidou_cnav1_utc_model.h + * \brief BeiDou B-CNAV1 UTC model (§7.12) + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef GNSS_SDR_BEIDOU_CNAV1_UTC_MODEL_H +#define GNSS_SDR_BEIDOU_CNAV1_UTC_MODEL_H + +class Beidou_Cnav1_Utc_Model +{ +public: + double A0{}; + double A1{}; + double A2{}; + int32_t tot{}; + int32_t WN_t{}; + int32_t WN_LSF{}; + int32_t DN{}; + int32_t delta_t_LSF{}; + bool valid{}; +}; + +#endif diff --git a/src/core/system_parameters/gnss_frequencies.h b/src/core/system_parameters/gnss_frequencies.h index 67664bdd5..c9237b541 100644 --- a/src/core/system_parameters/gnss_frequencies.h +++ b/src/core/system_parameters/gnss_frequencies.h @@ -57,6 +57,7 @@ const std::unordered_map SIGNAL_FREQ_MAP = { {"B1", FREQ1_BDS}, {"B2", FREQ2_BDS}, {"B3", FREQ3_BDS}, + {"1D", FREQ1}, {"J1", FREQ1}, {"J5", FREQ5}, }; diff --git a/src/core/system_parameters/gnss_obs_codes.h b/src/core/system_parameters/gnss_obs_codes.h index 1f6c9a3ae..a5d96a24b 100644 --- a/src/core/system_parameters/gnss_obs_codes.h +++ b/src/core/system_parameters/gnss_obs_codes.h @@ -83,7 +83,8 @@ constexpr uint32_t CODE_L9A = 52; //!< obs code: SA SPS (IRN) constexpr uint32_t CODE_L9B = 53; //!< obs code: SB RS(D) (IRN) constexpr uint32_t CODE_L9C = 54; //!< obs code: SC RS(P) (IRN) constexpr uint32_t CODE_L9X = 55; //!< obs code: SB+C (IRN) -constexpr int32_t MAXCODE = 55; //!< max number of obs code +constexpr uint32_t CODE_L1D = 56; //!< obs code: B1C data (BDS) +constexpr int32_t MAXCODE = 56; //!< max number of obs code /** \} */ diff --git a/src/core/system_parameters/gnss_signal.h b/src/core/system_parameters/gnss_signal.h index 6889e4d00..5333ff0f6 100644 --- a/src/core/system_parameters/gnss_signal.h +++ b/src/core/system_parameters/gnss_signal.h @@ -49,7 +49,7 @@ public: * - GPS: "1C" (L1 C/A), "2S" (L2C), "L5" * - GLONASS: "1G" (L1 C/A), "2G" (L2 C/A) * - Galileo: "1B" (E1B), "5X" (E5a), "7X" (E5b), "6C" (E6C) - * - BeiDou: "B1" (B1I), "B3" (B3I) + * - BeiDou: "B1" (B1I), "B3" (B3I), "1D" (B1C) */ std::string get_signal_str() const; @@ -59,8 +59,8 @@ public: friend std::ostream& operator<<(std::ostream& /*out*/, const Gnss_Signal& /*sig*/); //!< operator<< for pretty printing private: - Gnss_Satellite satellite{}; - std::string signal{}; + Gnss_Satellite satellite; + std::string signal; }; diff --git a/src/core/system_parameters/signal_flag.h b/src/core/system_parameters/signal_flag.h index 6f6e8fba5..ce06fde21 100644 --- a/src/core/system_parameters/signal_flag.h +++ b/src/core/system_parameters/signal_flag.h @@ -34,6 +34,7 @@ enum signal_flag : uint32_t GLO_2G = 0x1 << 8, BDS_B1 = 0x1 << 9, BDS_B3 = 0x1 << 10, + BDS_B1C = 0x1 << 13, QZS_J1 = 0x1 << 11, QZS_J5 = 0x1 << 12 }; diff --git a/tests/test_main.cc b/tests/test_main.cc index 492fb6c59..c43e563cd 100644 --- a/tests/test_main.cc +++ b/tests/test_main.cc @@ -235,6 +235,11 @@ private: #if EXTRA_TESTS #include "unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc" // #include "unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc" +#include "unit-tests/signal-processing-blocks/acquisition/beidou_b1c_pcps_acquisition_test.cc" +#include "unit-tests/signal-processing-blocks/libs/beidou_b1c_signal_replica_test.cc" +#include "unit-tests/signal-processing-blocks/tracking/beidou_b1c_dll_pll_veml_tracking_test.cc" +#include "unit-tests/system-parameters/beidou_cnav1_ldpc_test.cc" +#include "unit-tests/system-parameters/beidou_cnav1_navigation_message_test.cc" // #include "unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc" #ifndef EXCLUDE_TESTS_REQUIRING_BINARIES #include "unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc" diff --git a/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1c_pcps_acquisition_test.cc b/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1c_pcps_acquisition_test.cc new file mode 100644 index 000000000..f22ddab85 --- /dev/null +++ b/tests/unit-tests/signal-processing-blocks/acquisition/beidou_b1c_pcps_acquisition_test.cc @@ -0,0 +1,35 @@ +/*! + * \file beidou_b1c_pcps_acquisition_test.cc + * \brief Unit tests for BeidouB1cPcpsAmbiguousAcquisition + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "acquisition_interface.h" +#include "beidou_b1c_pcps_ambiguous_acquisition.h" +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "in_memory_configuration.h" +#include +#include + +TEST(BeidouB1cPcpsAcquisitionTest, Instantiate) +{ + auto configuration = std::make_shared(); + configuration->set_property("Acquisition_1D.implementation", "BEIDOU_B1C_PCPS_Ambiguous_Acquisition"); + configuration->set_property("Acquisition_1D.item_type", "gr_complex"); + auto factory = std::make_unique(); + std::shared_ptr acq_ = factory->GetBlock(configuration.get(), "Acquisition_1D", 1, 0); + auto acquisition = std::dynamic_pointer_cast(acq_); + ASSERT_NE(acquisition, nullptr); + EXPECT_STREQ("BEIDOU_B1C_PCPS_Ambiguous_Acquisition", acquisition->implementation().c_str()); +} diff --git a/tests/unit-tests/signal-processing-blocks/libs/beidou_b1c_signal_replica_test.cc b/tests/unit-tests/signal-processing-blocks/libs/beidou_b1c_signal_replica_test.cc new file mode 100644 index 000000000..739a8723c --- /dev/null +++ b/tests/unit-tests/signal-processing-blocks/libs/beidou_b1c_signal_replica_test.cc @@ -0,0 +1,81 @@ +/*! + * \file beidou_b1c_signal_replica_test.cc + * \brief Unit tests for BeiDou B1C signal replica generation + * \author GNSS-SDR contributors + * + * ----------------------------------------------------------------------------- + * + * GNSS-SDR is a Global Navigation Satellite System software-defined receiver. + * This file is part of GNSS-SDR. + * + * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors) + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ----------------------------------------------------------------------------- + */ + +#include "Beidou_B1C.h" +#include "beidou_b1c_signal_replica.h" +#include +#include +#include +#include +#include + +TEST(BeidouB1cSignalReplicaTest, SampledCodeLength) +{ + constexpr int32_t fs = 2046000; + const auto samples_per_chip = static_cast(std::lround(static_cast(fs) / BEIDOU_B1C_CODE_RATE_CPS)); + const auto expected_length = static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS * samples_per_chip); + std::vector> code(expected_length); + const std::array data_signal = {{'1', 'D', '\0'}}; + beidou_b1c_code_gen_complex_sampled(code, data_signal, false, 1, fs, 0); + EXPECT_EQ(code.size(), expected_length); +} + + +TEST(BeidouB1cSignalReplicaTest, Prn1DataFirst24ChipsMatchIcd) +{ + std::array chips{}; + const std::array data_signal = {{'1', 'D', '\0'}}; + beidou_b1c_code_gen_int(chips, data_signal, 1); + const char* expected = "101011111111011001001110"; + for (int i = 0; i < 24; i++) + { + EXPECT_EQ(chips[i], expected[i] - '0') << "chip index " << i; + } +} + + +TEST(BeidouB1cSignalReplicaTest, SinBoc11AutocorrelationShape) +{ + std::array code{}; + const std::array data_signal = {{'1', 'D', '\0'}}; + beidou_b1c_code_gen_sinboc11_float(code, data_signal, 1); + + double peak = 0.0; + double side = 0.0; + const int32_t samples_per_chip = 2; + const int32_t code_samples = static_cast(BEIDOU_B1C_CODE_LENGTH_CHIPS) * samples_per_chip; + for (int32_t lag = -code_samples; lag <= code_samples; lag++) + { + double corr = 0.0; + for (int32_t i = 0; i < code_samples; i++) + { + const int32_t j = (i + lag + code_samples) % code_samples; + corr += static_cast(code[i]) * static_cast(code[j]); + } + corr /= static_cast(code_samples); + if (lag == 0) + { + peak = std::abs(corr); + } + else if (std::abs(lag) == samples_per_chip) + { + side = std::max(side, std::abs(corr)); + } + } + EXPECT_GT(peak, 0.0); + EXPECT_GT(side, 0.0); + EXPECT_LT(side, peak); +} diff --git a/tests/unit-tests/signal-processing-blocks/tracking/beidou_b1c_dll_pll_veml_tracking_test.cc b/tests/unit-tests/signal-processing-blocks/tracking/beidou_b1c_dll_pll_veml_tracking_test.cc new file mode 100644 index 000000000..435f7c041 --- /dev/null +++ b/tests/unit-tests/signal-processing-blocks/tracking/beidou_b1c_dll_pll_veml_tracking_test.cc @@ -0,0 +1,25 @@ +/*! + * \file beidou_b1c_dll_pll_veml_tracking_test.cc + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "beidou_b1c_dll_pll_veml_tracking.h" +#include "gnss_block_factory.h" +#include "gnss_block_interface.h" +#include "in_memory_configuration.h" +#include "tracking_interface.h" +#include +#include + +TEST(BeidouB1cDllPllVemlTrackingTest, Instantiate) +{ + auto configuration = std::make_shared(); + configuration->set_property("Tracking_1D.implementation", "BEIDOU_B1C_DLL_PLL_VEML_Tracking"); + configuration->set_property("Tracking_1D.item_type", "gr_complex"); + configuration->set_property("GNSS-SDR.internal_fs_sps", "2046000"); + auto factory = std::make_unique(); + std::shared_ptr trk_ = factory->GetBlock(configuration.get(), "Tracking_1D", 1, 1); + auto tracking = std::dynamic_pointer_cast(trk_); + ASSERT_NE(tracking, nullptr); + EXPECT_STREQ("BEIDOU_B1C_DLL_PLL_VEML_Tracking", tracking->implementation().c_str()); +} diff --git a/tests/unit-tests/system-parameters/beidou_cnav1_ldpc_test.cc b/tests/unit-tests/system-parameters/beidou_cnav1_ldpc_test.cc new file mode 100644 index 000000000..44ef45a45 --- /dev/null +++ b/tests/unit-tests/system-parameters/beidou_cnav1_ldpc_test.cc @@ -0,0 +1,94 @@ +/*! + * \file beidou_cnav1_ldpc_test.cc + * \brief Unit tests for B-CNAV1 NB-LDPC decoder + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "Beidou_CNAV1.h" +#include "beidou_cnav1_ldpc.h" +#include +#include +#include + +namespace +{ +std::array make_bit_llrs(const uint8_t* bits, float magnitude) +{ + std::array llr{}; + for (int32_t i = 0; i < BEIDOU_CNAV1_SUBFRAME2_SYMBOLS; i++) + { + llr[static_cast(i)] = (bits[i] != 0U) ? magnitude : -magnitude; + } + return llr; +} + +std::array make_sf3_bit_llrs(const uint8_t* bits, float magnitude) +{ + std::array llr{}; + for (int32_t i = 0; i < BEIDOU_CNAV1_SUBFRAME3_SYMBOLS; i++) + { + llr[static_cast(i)] = (bits[i] != 0U) ? magnitude : -magnitude; + } + return llr; +} +} // namespace + +TEST(BeidouCnav1LdpcTest, DecodeZeroCodeword200_100) +{ + std::array bits{}; + const auto llr = make_bit_llrs(bits.data(), 4.0F); + std::array info{}; + EXPECT_TRUE(beidou_cnav1_ldpc_decode_200_100(llr.data(), BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, info.data())); + for (const auto bit : info) + { + EXPECT_EQ(bit, 0U); + } +} + +TEST(BeidouCnav1LdpcTest, DecodeZeroCodeword88_44) +{ + std::array bits{}; + const auto llr = make_sf3_bit_llrs(bits.data(), 4.0F); + std::array info{}; + EXPECT_TRUE(beidou_cnav1_ldpc_decode_88_44(llr.data(), BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, info.data())); + for (const auto bit : info) + { + EXPECT_EQ(bit, 0U); + } +} + +TEST(BeidouCnav1LdpcTest, CorrectSingleSymbolError200_100) +{ + std::array bits{}; + const uint8_t wrong_symbol = 5U; + for (int32_t bit = 0; bit < 6; bit++) + { + bits[static_cast(bit)] = static_cast((wrong_symbol >> (5 - bit)) & 1U); + } + + const auto llr = make_bit_llrs(bits.data(), 4.0F); + std::array info{}; + EXPECT_TRUE(beidou_cnav1_ldpc_decode_200_100(llr.data(), BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, info.data())); + for (const auto bit : info) + { + EXPECT_EQ(bit, 0U); + } +} + +TEST(BeidouCnav1LdpcTest, CorrectSingleSymbolError88_44) +{ + std::array bits{}; + const uint8_t wrong_symbol = 17U; + for (int32_t bit = 0; bit < 6; bit++) + { + bits[static_cast(bit)] = static_cast((wrong_symbol >> (5 - bit)) & 1U); + } + + const auto llr = make_sf3_bit_llrs(bits.data(), 4.0F); + std::array info{}; + EXPECT_TRUE(beidou_cnav1_ldpc_decode_88_44(llr.data(), BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, info.data())); + for (const auto bit : info) + { + EXPECT_EQ(bit, 0U); + } +} diff --git a/tests/unit-tests/system-parameters/beidou_cnav1_navigation_message_test.cc b/tests/unit-tests/system-parameters/beidou_cnav1_navigation_message_test.cc new file mode 100644 index 000000000..9ca9ee1f6 --- /dev/null +++ b/tests/unit-tests/system-parameters/beidou_cnav1_navigation_message_test.cc @@ -0,0 +1,164 @@ +/*! + * \file beidou_cnav1_navigation_message_test.cc + * \brief Unit tests for B-CNAV1 navigation message parser + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include "Beidou_CNAV1.h" +#include "beidou_cnav1_navigation_message.h" +#include "rtklib_conversions.h" +#include +#include +#include + +namespace +{ +void append_bch21_6(std::vector& frame, uint32_t prn) +{ + std::array msg{}; + for (int32_t bit = 5; bit >= 0; bit--) + { + msg[5 - bit] = static_cast((prn >> bit) & 1U); + } + static const int32_t g[7] = {1, 0, 1, 0, 1, 1, 1}; + std::array codeword{}; + for (int32_t i = 0; i < 6; i++) + { + codeword[i] = msg[i]; + } + for (int32_t i = 0; i < 6; i++) + { + if (codeword[i] != 0) + { + for (int32_t j = 0; j < 7; j++) + { + codeword[i + j] ^= g[j]; + } + } + } + for (const auto bit : codeword) + { + frame.push_back(bit != 0 ? 1.0F : -1.0F); + } +} + +void append_bch51_8(std::vector& frame, uint32_t soh) +{ + std::array msg{}; + for (int32_t bit = 7; bit >= 0; bit--) + { + msg[7 - bit] = static_cast((soh >> bit) & 1U); + } + static const int32_t g[9] = {1, 1, 0, 0, 1, 1, 1, 1, 1}; + std::array codeword{}; + for (int32_t i = 0; i < 8; i++) + { + codeword[i] = msg[i]; + } + for (int32_t i = 0; i < 8; i++) + { + if (codeword[i] != 0) + { + for (int32_t j = 0; j < 9; j++) + { + codeword[i + j] ^= g[j]; + } + } + } + for (const auto bit : codeword) + { + frame.push_back(bit != 0 ? 1.0F : -1.0F); + } +} + +void deinterleave_like_icd(const std::vector& sf2_bits, const std::vector& sf3_bits, std::vector& interleaved) +{ + std::array grid{}; + int32_t sf2_idx = 0; + int32_t sf3_idx = 0; + int32_t row = 0; + while (row < 33) + { + for (int32_t r = 0; r < 2; r++) + { + for (int32_t col = 0; col < BEIDOU_CNAV1_INTERLEAVE_COLS; col++) + { + grid[static_cast(row) * BEIDOU_CNAV1_INTERLEAVE_COLS + col] = sf2_bits[static_cast(sf2_idx++)]; + } + row++; + } + for (int32_t col = 0; col < BEIDOU_CNAV1_INTERLEAVE_COLS; col++) + { + grid[static_cast(row) * BEIDOU_CNAV1_INTERLEAVE_COLS + col] = sf3_bits[static_cast(sf3_idx++)]; + } + row++; + } + for (int32_t r = 0; r < 3; r++) + { + for (int32_t col = 0; col < BEIDOU_CNAV1_INTERLEAVE_COLS; col++) + { + grid[static_cast(row) * BEIDOU_CNAV1_INTERLEAVE_COLS + col] = sf2_bits[static_cast(sf2_idx++)]; + } + row++; + } + + interleaved.clear(); + for (int32_t col = 0; col < BEIDOU_CNAV1_INTERLEAVE_COLS; col++) + { + for (int32_t row_idx = 0; row_idx < BEIDOU_CNAV1_INTERLEAVE_ROWS; row_idx++) + { + interleaved.push_back(grid[static_cast(row_idx) * BEIDOU_CNAV1_INTERLEAVE_COLS + col]); + } + } +} + +std::vector encode_bits_to_llr(const std::vector& bits) +{ + std::vector llr; + llr.reserve(bits.size()); + for (const auto bit : bits) + { + llr.push_back(bit != 0U ? 4.0F : -4.0F); + } + return llr; +} +} // namespace + +TEST(BeidouCnav1NavigationMessageTest, DecodeSubframe1OnlyFrameFailsWithoutSf2Crc) +{ + std::vector frame; + append_bch21_6(frame, 19U); + append_bch51_8(frame, 1U); + frame.insert(frame.end(), BEIDOU_CNAV1_INTERLEAVED_SYMBOLS, 4.0F); + + Beidou_Cnav1_Navigation_Message nav; + EXPECT_FALSE(nav.decode_frame_symbols(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS)); +} + +TEST(BeidouCnav1NavigationMessageTest, DecodeEphemerisFromZeroSf2Payload) +{ + const auto sf2_llr = encode_bits_to_llr(std::vector(BEIDOU_CNAV1_SUBFRAME2_SYMBOLS, 0U)); + const auto sf3_llr = encode_bits_to_llr(std::vector(BEIDOU_CNAV1_SUBFRAME3_SYMBOLS, 0U)); + EXPECT_EQ(sf2_llr.size(), static_cast(BEIDOU_CNAV1_SUBFRAME2_SYMBOLS)); + EXPECT_EQ(sf3_llr.size(), static_cast(BEIDOU_CNAV1_SUBFRAME3_SYMBOLS)); + + std::vector interleaved; + deinterleave_like_icd(sf2_llr, sf3_llr, interleaved); + EXPECT_EQ(interleaved.size(), static_cast(BEIDOU_CNAV1_INTERLEAVED_SYMBOLS)); + + std::vector frame; + append_bch21_6(frame, 19U); + append_bch51_8(frame, 1U); + frame.insert(frame.end(), interleaved.begin(), interleaved.end()); + + Beidou_Cnav1_Navigation_Message nav; + ASSERT_TRUE(nav.decode_frame_symbols(frame.data(), BEIDOU_CNAV1_FRAME_SYMBOLS, 19)); + EXPECT_TRUE(nav.have_new_ephemeris()); + EXPECT_EQ(nav.get_ephemeris().PRN, 19); + EXPECT_DOUBLE_EQ(nav.get_tow_s(), 18.0); + + const auto rtklib_eph = eph_to_rtklib(nav.get_ephemeris()); + EXPECT_EQ(rtklib_eph.iode, 0); + EXPECT_EQ(rtklib_eph.iodc, 0); + EXPECT_NEAR(rtklib_eph.A, BEIDOU_CNAV1_A_REF_MEO, 1.0); +} diff --git a/utils/generate_beidou_b1c_codes.py b/utils/generate_beidou_b1c_codes.py new file mode 100644 index 000000000..cc13741bb --- /dev/null +++ b/utils/generate_beidou_b1c_codes.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +"""Generate Beidou_B1C_codes.h from ICD Weil parameters in Beidou_B1C_prn.h.""" + +from __future__ import annotations + +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +PRN_HEADER = ROOT / "src/core/system_parameters/Beidou_B1C_prn.h" +OUT_HEADER = ROOT / "src/core/system_parameters/Beidou_B1C_codes.h" + + +def extract(name: str, text: str) -> list[int]: + match = re.search(rf"{name}\[63\]\s*=\s*\{{([^}}]+)\}}", text, re.S) + if not match: + raise RuntimeError(f"Could not parse {name}") + return [int(x.strip()) for x in match.group(1).split(",") if x.strip()] + + +def legendre(n: int) -> list[int]: + seq = [0] * n + for x in range(1, n): + seq[(x * x) % n] = 1 + return seq + + +def weil_code(L: list[int], weil_len: int, w: int, p: int, out_len: int) -> list[int]: + W = [L[k] ^ L[(k + w) % weil_len] for k in range(weil_len)] + return [W[(n + p - 1) % weil_len] for n in range(out_len)] + + +def chips_to_hex(chips: list[int]) -> str: + out = "" + for i in range(0, len(chips), 4): + chunk = chips[i : i + 4] + value = 0 + for bit in chunk: + value = (value << 1) | bit + while len(chunk) < 4: + value <<= 1 + chunk.append(0) + out += format(value, "X") + return out + + +def chips_to_binstr(chips: list[int]) -> str: + return "".join(str(c) for c in chips) + + +def emit_array(name: str, rows: list[str]) -> str: + lines = [f"constexpr char {name}[63][{len(rows[0]) + 1}] = {{"] + lines.extend(f' "{row}",' for row in rows) + lines.append("};") + return "\n".join(lines) + + +def main() -> None: + text = PRN_HEADER.read_text(encoding="utf-8") + data_w = extract("BEIDOU_B1C_DATA_PRN_W", text) + data_p = extract("BEIDOU_B1C_DATA_PRN_P", text) + pilot_w = extract("BEIDOU_B1C_PILOT_PRN_W", text) + pilot_p = extract("BEIDOU_B1C_PILOT_PRN_P", text) + sec_w = extract("BEIDOU_B1C_PILOT_SECONDARY_W", text) + sec_p = extract("BEIDOU_B1C_PILOT_SECONDARY_P", text) + + L10243 = legendre(10243) + L3607 = legendre(3607) + + data_hex = [ + chips_to_hex(weil_code(L10243, 10243, data_w[i], data_p[i], 10230)) for i in range(63) + ] + pilot_hex = [ + chips_to_hex(weil_code(L10243, 10243, pilot_w[i], pilot_p[i], 10230)) for i in range(63) + ] + sec_bin = [chips_to_binstr(weil_code(L3607, 3607, sec_w[i], sec_p[i], 1800)) for i in range(63)] + + expected = "101011111111011001001110" + assert "".join(str(b) for b in weil_code(L10243, 10243, data_w[0], data_p[0], 10230)[:24]) == expected + + header = f"""/* Auto-generated by {Path(__file__).name}. Do not edit manually. */ +#ifndef GNSS_SDR_BEIDOU_B1C_CODES_H +#define GNSS_SDR_BEIDOU_B1C_CODES_H + +#include + +constexpr size_t BEIDOU_B1C_PRIMARY_CODE_STR_LENGTH = 2558; +constexpr size_t BEIDOU_B1C_PILOT_SECONDARY_CODE_STR_LENGTH = 1800; + +{emit_array("BEIDOU_B1C_DATA_PRIMARY_CODE", data_hex)} + +{emit_array("BEIDOU_B1C_PILOT_PRIMARY_CODE", pilot_hex)} + +{emit_array("BEIDOU_B1C_PILOT_SECONDARY_CODE", sec_bin)} + +#endif +""" + OUT_HEADER.write_text(header, encoding="utf-8") + print(f"Wrote {OUT_HEADER} ({len(header)} bytes)") + + +if __name__ == "__main__": + main() diff --git a/utils/generate_beidou_cnav1_ldpc.py b/utils/generate_beidou_cnav1_ldpc.py new file mode 100644 index 000000000..5ac36bec3 --- /dev/null +++ b/utils/generate_beidou_cnav1_ldpc.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +"""Generate Beidou_CNAV1_ldpc.h from BDS-SIS-ICD-B1C-1.0 PDF text.""" + +from __future__ import annotations + +import subprocess +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +ICD_PDF = ROOT / "docs/article/北斗卫星导航系统-空间信号接口控制文件-公开服务信号B1C(1.0版).pdf" +OUT = ROOT / "src/core/system_parameters/Beidou_CNAV1_ldpc.h" + + +def icd_text() -> str: + proc = subprocess.run( + ["pdftotext", "-layout", str(ICD_PDF), "-"], + check=True, + capture_output=True, + text=True, + ) + return proc.stdout + + +def is_numline(line: str) -> bool: + stripped = line.strip() + return bool(stripped) and all(part.isdigit() for part in stripped.split()) + + +def extract_numeric_lines( + text: str, + start_marker: str, + end_marker: str, + numbers_per_line: int, +) -> list[list[int]]: + section = text.split(start_marker, 1)[1].split(end_marker, 1)[0] + lines = section.splitlines() + rows: list[list[int]] = [] + for line in lines: + if not is_numline(line): + continue + nums = [int(part) for part in line.split()] + if len(nums) == numbers_per_line: + rows.append(nums) + return rows + + +def parse_matrix( + text: str, + start_marker: str, + end_marker: str, + expected_rows: int, + row_weight: int, +) -> list[tuple[int, ...]]: + lines = extract_numeric_lines(text, start_marker, end_marker, 16) + if len(lines) * 16 != expected_rows * row_weight: + raise RuntimeError( + f"{start_marker}: expected {expected_rows * row_weight} values, got {len(lines) * 16}" + ) + values: list[int] = [] + for line in lines: + values.extend(line) + rows: list[tuple[int, ...]] = [] + for row in range(expected_rows): + base = row * row_weight + rows.append(tuple(values[base + j] for j in range(row_weight))) + return rows + + +def flatten_rows(rows: list[tuple[int, ...]]) -> list[int]: + flat: list[int] = [] + for row in rows: + flat.extend(row) + return flat + + +def gf64_tables() -> tuple[list[int], list[int]]: + def gf_mul(a: int, b: int) -> int: + product = 0 + for _ in range(6): + if b & 1: + product ^= a + carry = a & 0x20 + a = (a << 1) & 0x3F + if carry: + a ^= 0x03 + b >>= 1 + return product + + exp = [0] * 64 + log = [0] * 64 + value = 1 + for i in range(63): + exp[i] = value + log[value] = i + value = gf_mul(value, 2) + exp[63] = exp[0] + return exp, log + + +def emit_array(name: str, c_type: str, values: list[int]) -> str: + return f"constexpr {c_type} {name}[{len(values)}] = {{{','.join(map(str, values))}}};" + + +def main() -> None: + text = icd_text() + idx100 = parse_matrix(text, "H100,200,index=[", "H100,200,element=[", expected_rows=100, row_weight=4) + el100 = parse_matrix(text, "H100,200,element=[", "H44,88,index=[", expected_rows=100, row_weight=4) + idx44 = parse_matrix(text, "H44,88,index=[", "H44,88,element=[", expected_rows=44, row_weight=4) + el44 = parse_matrix(text, "H44,88,element=[", "H44,88 的读取规则", expected_rows=44, row_weight=4) + exp, log = gf64_tables() + + header: list[str] = [ + "/* Auto-generated by utils/generate_beidou_cnav1_ldpc.py. Do not edit manually. */", + "#ifndef GNSS_SDR_BEIDOU_CNAV1_LDPC_MATRICES_H", + "#define GNSS_SDR_BEIDOU_CNAV1_LDPC_MATRICES_H", + "#include ", + "constexpr int32_t BEIDOU_CNAV1_LDPC_N200 = 200;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_K200 = 100;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_M200 = 100;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_DC200 = 4;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_N88 = 88;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_K88 = 44;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_M88 = 44;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_DC88 = 4;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_NM = 8;", + "constexpr int32_t BEIDOU_CNAV1_LDPC_MAX_ITER = 15;", + "", + "/*", + " * GF(2^6) LUTs follow BDS-SIS-ICD-B1C-1.0 Appendix mapping tables.", + " * Primitive polynomial: p(x)=x^6+x+1.", + " */", + ] + header.append(emit_array("BEIDOU_CNAV1_H100_200_INDEX", "uint16_t", flatten_rows(idx100))) + header.append(emit_array("BEIDOU_CNAV1_H100_200_ELEMENT", "uint8_t", flatten_rows(el100))) + header.append(emit_array("BEIDOU_CNAV1_H44_88_INDEX", "uint16_t", flatten_rows(idx44))) + header.append(emit_array("BEIDOU_CNAV1_H44_88_ELEMENT", "uint8_t", flatten_rows(el44))) + header.append(emit_array("BEIDOU_CNAV1_GF64_EXP", "uint8_t", exp)) + header.append(emit_array("BEIDOU_CNAV1_GF64_LOG", "int8_t", log)) + header.append("#endif // GNSS_SDR_BEIDOU_CNAV1_LDPC_MATRICES_H") + OUT.write_text("\n".join(header) + "\n", encoding="utf-8") + print(f"Wrote {OUT}") + + +if __name__ == "__main__": + main()