From 73f05eda5e6e4534ca579082283cbc416ed83dfb Mon Sep 17 00:00:00 2001 From: Michael Coracin Date: Mon, 25 Apr 2016 11:58:35 +0200 Subject: [PATCH] v3.2.1 * HAL: Fixed downlink support for SX1301AP2 reference design: soft reset of the FPGA was missing for proper IQ inversion configuration. * HAL: Added support for several versions of FPGA (currently v18 and v19) * HAL: Reduced radio TX PLL bandwidth to reduce the noise level. * util_tx_test: Added FSK support and added minimal TX gain LUT. * util_spectral_scan: Removed FPGA soft reset, now done by the HAL. * util_tx_continous: reworked to use HAL functions instead of 'manual' config, and use same SX1301 calibration firmware as the HAL. * Updated all makefiles to handle the creation of obj directory when necessary. --- VERSION | 2 +- libloragw/Makefile | 28 +- libloragw/obj/.gitkeep | 0 libloragw/readme.md | 8 +- libloragw/src/loragw_hal.c | 2 +- libloragw/src/loragw_reg.c | 21 +- libloragw/src/loragw_spi.native.c | 12 +- libloragw/tst/test_loragw_gps.c | 2 +- libloragw/tst/test_loragw_hal.c | 46 +- readme.md | 137 ++- util_pkt_logger/Makefile | 15 +- util_pkt_logger/obj/.gitkeep | 0 util_spectral_scan/Makefile | 21 +- util_spectral_scan/readme.md | 16 +- util_spectral_scan/src/util_spectral_scan.c | 77 +- util_spi_stress/Makefile | 11 +- util_spi_stress/obj/.gitkeep | 0 util_spi_stress/src/util_spi_stress.c | 6 +- util_tx_continuous/Makefile | 11 +- util_tx_continuous/obj/.gitkeep | 0 util_tx_continuous/readme.md | 124 +-- util_tx_continuous/src/cal_tx_fw.var | 530 ---------- util_tx_continuous/src/util_fw.var | 530 ---------- util_tx_continuous/src/util_tx_continuous.c | 1030 ++++++++----------- util_tx_test/Makefile | 11 +- util_tx_test/obj/.gitkeep | 0 util_tx_test/readme.md | 35 +- util_tx_test/src/util_tx_test.c | 763 ++++++++------ 28 files changed, 1201 insertions(+), 2237 deletions(-) delete mode 100644 libloragw/obj/.gitkeep delete mode 100644 util_pkt_logger/obj/.gitkeep delete mode 100644 util_spi_stress/obj/.gitkeep delete mode 100644 util_tx_continuous/obj/.gitkeep delete mode 100644 util_tx_continuous/src/cal_tx_fw.var delete mode 100644 util_tx_continuous/src/util_fw.var delete mode 100644 util_tx_test/obj/.gitkeep diff --git a/VERSION b/VERSION index 944880fa..e4604e3a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.2.0 +3.2.1 diff --git a/libloragw/Makefile b/libloragw/Makefile index 7cf666e6..e5419599 100644 --- a/libloragw/Makefile +++ b/libloragw/Makefile @@ -12,6 +12,9 @@ AR := $(CROSS_COMPILE)ar CFLAGS := -O2 -Wall -Wextra -std=c99 -Iinc -I. +OBJDIR = obj +INCLUDES = $(wildcard inc/*.h) + ### linking options LIBS := -lloragw -lrt -lm @@ -23,7 +26,7 @@ all: libloragw.a test_loragw_spi test_loragw_reg test_loragw_hal test_loragw_gps clean: rm -f libloragw.a rm -f test_loragw_* - rm -f obj/*.o + rm -f $(OBJDIR)/*.o rm -f inc/config.h ### transpose library.cfg into a C header file : config.h @@ -31,43 +34,40 @@ clean: inc/config.h: ../VERSION library.cfg @echo "*** Checking libloragw library configuration ***" @rm -f $@ - # File initialization + #File initialization @echo "#ifndef _LORAGW_CONFIGURATION_H" >> $@ @echo "#define _LORAGW_CONFIGURATION_H" >> $@ - # Release version + # Release version @echo "Release version : $(LIBLORAGW_VERSION)" @echo " #define LIBLORAGW_VERSION "\"$(LIBLORAGW_VERSION)\""" >> $@ - # Debug options + # Debug options @echo " #define DEBUG_AUX $(DEBUG_AUX)" >> $@ @echo " #define DEBUG_SPI $(DEBUG_SPI)" >> $@ @echo " #define DEBUG_REG $(DEBUG_REG)" >> $@ @echo " #define DEBUG_HAL $(DEBUG_HAL)" >> $@ @echo " #define DEBUG_GPS $(DEBUG_GPS)" >> $@ @echo " #define DEBUG_GPIO $(DEBUG_GPIO)" >> $@ - # end of file + # end of file @echo "#endif" >> $@ @echo "*** Configuration seems ok ***" ### library module target -obj/loragw_aux.o: src/loragw_aux.c inc/loragw_aux.h inc/config.h - $(CC) -c $(CFLAGS) $< -o $@ - -obj/loragw_spi.o: src/loragw_spi.native.c inc/loragw_spi.h inc/config.h - $(CC) -c $(CFLAGS) $< -o $@ +$(OBJDIR): + mkdir -p $(OBJDIR) -obj/loragw_reg.o: src/loragw_reg.c inc/loragw_reg.h inc/loragw_spi.h inc/config.h +$(OBJDIR)/%.o: src/%.c $(INCLUDES) inc/config.h | $(OBJDIR) $(CC) -c $(CFLAGS) $< -o $@ -obj/loragw_hal.o: src/loragw_hal.c inc/loragw_hal.h inc/loragw_reg.h inc/loragw_aux.h src/arb_fw.var src/agc_fw.var src/cal_fw.var inc/config.h +$(OBJDIR)/loragw_spi.o: src/loragw_spi.native.c $(INCLUDES) inc/config.h | $(OBJDIR) $(CC) -c $(CFLAGS) $< -o $@ -obj/loragw_gps.o: src/loragw_gps.c inc/loragw_gps.h inc/config.h +$(OBJDIR)/loragw_hal.o: src/loragw_hal.c $(INCLUDES) src/arb_fw.var src/agc_fw.var src/cal_fw.var inc/config.h | $(OBJDIR) $(CC) -c $(CFLAGS) $< -o $@ ### static library -libloragw.a: obj/loragw_hal.o obj/loragw_gps.o obj/loragw_reg.o obj/loragw_spi.o obj/loragw_aux.o +libloragw.a: $(OBJDIR)/loragw_hal.o $(OBJDIR)/loragw_gps.o $(OBJDIR)/loragw_reg.o $(OBJDIR)/loragw_spi.o $(OBJDIR)/loragw_aux.o $(AR) rcs $@ $^ ### test programs diff --git a/libloragw/obj/.gitkeep b/libloragw/obj/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/libloragw/readme.md b/libloragw/readme.md index cbca42d9..42fe399d 100644 --- a/libloragw/readme.md +++ b/libloragw/readme.md @@ -179,8 +179,12 @@ messages if the DEBUG_xxx is set to 1 in library.cfg ### 3.3. Building procedures ### -For cross-compilation set the CROSS_COMPILE variable in the Makefile with the -correct toolchain name. +For cross-compilation set the ARCH and CROSS_COMPILE variables in the Makefile, +or in your shell environment, with the correct toolchain name and path. +ex: +export PATH=/home/foo/rpi-toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH +export ARCH=arm +export CROSS_COMPILE=arm-linux-gnueabihf- The Makefile in the libloragw directory will parse the library.cfg file and generate a config.h C header file containing #define options. diff --git a/libloragw/src/loragw_hal.c b/libloragw/src/loragw_hal.c index d9733ace..433160f5 100644 --- a/libloragw/src/loragw_hal.c +++ b/libloragw/src/loragw_hal.c @@ -90,7 +90,7 @@ F_register(24bit) = F_rf (Hz) / F_step(Hz) #define SX125x_TX_DAC_CLK_SEL 1 /* 0:int, 1:ext */ #define SX125x_TX_DAC_GAIN 2 /* 3:0, 2:-3, 1:-6, 0:-9 dBFS (default 2) */ #define SX125x_TX_MIX_GAIN 14 /* -38 + 2*TxMixGain dB (default 14) */ -#define SX125x_TX_PLL_BW 3 /* 0:75, 1:150, 2:225, 3:300 kHz (default 3) */ +#define SX125x_TX_PLL_BW 1 /* 0:75, 1:150, 2:225, 3:300 kHz (default 3) */ #define SX125x_TX_ANA_BW 0 /* 17.5 / 2*(41-TxAnaBw) MHz (default 0) */ #define SX125x_TX_DAC_BW 5 /* 24 + 8*TxDacBw Nb FIR taps (default 2) */ #define SX125x_RX_LNA_GAIN 1 /* 1 to 6, 1 highest gain */ diff --git a/libloragw/src/loragw_reg.c b/libloragw/src/loragw_reg.c index 3e9c16dc..efc65ccf 100644 --- a/libloragw/src/loragw_reg.c +++ b/libloragw/src/loragw_reg.c @@ -60,7 +60,7 @@ struct lgw_reg_s { #define PAGE_ADDR 0x00 #define PAGE_MASK 0x03 -#define FPGA_VERSION 18 +const uint8_t FPGA_VERSION[] = { 18, 19 }; /* several versions supported */ /* auto generated register mapping for C code : 11-Jul-2013 13:20:40 @@ -413,6 +413,18 @@ int page_switch(uint8_t target) { return LGW_REG_SUCCESS; } +bool check_fpga_version(uint8_t version) { + int i; + + for (i = 0; i < (int)(sizeof FPGA_VERSION); i++) { + if (FPGA_VERSION[i] == version ) { + return true; + } + } + + return false; +} + /* -------------------------------------------------------------------------- */ /* --- PUBLIC FUNCTIONS DEFINITION ------------------------------------------ */ @@ -435,17 +447,20 @@ int lgw_connect(void) { /* Detect if the gateway has an FPGA with SPI mux header support */ /* First, we assume there is an FPGA, and try to read its version */ spi_stat = lgw_spi_r(lgw_spi_target, LGW_SPI_MUX_MODE1, LGW_SPI_MUX_TARGET_FPGA, loregs[LGW_VERSION].addr, &u); - if (spi_stat != LGW_SPI_SUCCESS) { + if (spi_stat != LGW_SPI_SUCCESS) { DEBUG_MSG("ERROR READING VERSION REGISTER\n"); return LGW_REG_ERROR; } - if (u != FPGA_VERSION) { + if (check_fpga_version(u) != true) { /* We failed to read expected FPGA version, so let's assume there is no FPGA */ DEBUG_MSG("INFO: no FPGA detected\n"); lgw_spi_mux_mode = LGW_SPI_MUX_MODE0; } else { DEBUG_MSG("INFO: detected FPGA with SPI mux header\n"); lgw_spi_mux_mode = LGW_SPI_MUX_MODE1; + /* FPGA Soft Reset */ + lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_FPGA, 0, 1); + lgw_spi_w(lgw_spi_target, lgw_spi_mux_mode, LGW_SPI_MUX_TARGET_FPGA, 0, 0); } /* check SX1301 version */ diff --git a/libloragw/src/loragw_spi.native.c b/libloragw/src/loragw_spi.native.c index e4fe9e53..c01ed1c1 100644 --- a/libloragw/src/loragw_spi.native.c +++ b/libloragw/src/loragw_spi.native.c @@ -51,9 +51,9 @@ Maintainer: Sylvain Miermont /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define READ_ACCESS 0x00 +#define READ_ACCESS 0x00 #define WRITE_ACCESS 0x80 -#define SPI_SPEED 8000000 +#define SPI_SPEED 8000000 #define SPI_DEV_PATH "/dev/spidev0.0" //#define SPI_DEV_PATH "/dev/spidev32766.0" @@ -193,7 +193,7 @@ int lgw_spi_w(void *spi_target, uint8_t spi_mux_mode, uint8_t spi_mux_target, ui k.tx_buf = (unsigned long) out_buf; k.len = command_size; k.speed_hz = SPI_SPEED; - k.cs_change = 1; + k.cs_change = 0; k.bits_per_word = 8; a = ioctl(spi_device, SPI_IOC_MESSAGE(1), &k); @@ -244,7 +244,7 @@ int lgw_spi_r(void *spi_target, uint8_t spi_mux_mode, uint8_t spi_mux_target, ui k.tx_buf = (unsigned long) out_buf; k.rx_buf = (unsigned long) in_buf; k.len = command_size; - k.cs_change = 1; + k.cs_change = 0; a = ioctl(spi_device, SPI_IOC_MESSAGE(1), &k); /* determine return code */ @@ -299,7 +299,7 @@ int lgw_spi_wb(void *spi_target, uint8_t spi_mux_mode, uint8_t spi_mux_target, u k[0].tx_buf = (unsigned long) &command[0]; k[0].len = command_size; k[0].cs_change = 0; - k[1].cs_change = 1; + k[1].cs_change = 0; for (i=0; size_to_do > 0; ++i) { chunk_size = (size_to_do < LGW_BURST_CHUNK) ? size_to_do : LGW_BURST_CHUNK; offset = i * LGW_BURST_CHUNK; @@ -361,7 +361,7 @@ int lgw_spi_rb(void *spi_target, uint8_t spi_mux_mode, uint8_t spi_mux_target, u k[0].tx_buf = (unsigned long) &command[0]; k[0].len = command_size; k[0].cs_change = 0; - k[1].cs_change = 1; + k[1].cs_change = 0; for (i=0; size_to_do > 0; ++i) { chunk_size = (size_to_do < LGW_BURST_CHUNK) ? size_to_do : LGW_BURST_CHUNK; offset = i * LGW_BURST_CHUNK; diff --git a/libloragw/tst/test_loragw_gps.c b/libloragw/tst/test_loragw_gps.c index 379bc678..54abcfcd 100644 --- a/libloragw/tst/test_loragw_gps.c +++ b/libloragw/tst/test_loragw_gps.c @@ -98,7 +98,7 @@ int main() printf("*** Library version information ***\n%s\n***\n", lgw_version_info()); /* Open and configure GPS */ - i = lgw_gps_enable("/dev/ttyACM0", NULL, 0, &gps_tty_dev); + i = lgw_gps_enable("/dev/ttyAMA0", NULL, 0, &gps_tty_dev); if (i != LGW_GPS_SUCCESS) { printf("ERROR: IMPOSSIBLE TO ENABLE GPS\n"); exit(EXIT_FAILURE); diff --git a/libloragw/tst/test_loragw_hal.c b/libloragw/tst/test_loragw_hal.c index 62dc1158..4857c956 100644 --- a/libloragw/tst/test_loragw_hal.c +++ b/libloragw/tst/test_loragw_hal.c @@ -208,52 +208,52 @@ int main(int argc, char **argv) memset(&ifconf, 0, sizeof(ifconf)); ifconf.enable = true; - ifconf.rf_chain = 0; - ifconf.freq_hz = -300000; + ifconf.rf_chain = 1; + ifconf.freq_hz = -400000; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(0, ifconf); /* chain 0: LoRa 125kHz, all SF, on f0 - 0.3 MHz */ + lgw_rxif_setconf(0, ifconf); /* chain 0: LoRa 125kHz, all SF, on f1 - 0.4 MHz */ ifconf.enable = true; - ifconf.rf_chain = 0; - ifconf.freq_hz = 300000; + ifconf.rf_chain = 1; + ifconf.freq_hz = -200000; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(1, ifconf); /* chain 1: LoRa 125kHz, all SF, on f0 + 0.3 MHz */ + lgw_rxif_setconf(1, ifconf); /* chain 1: LoRa 125kHz, all SF, on f1 - 0.2 MHz */ ifconf.enable = true; ifconf.rf_chain = 1; - ifconf.freq_hz = -300000; + ifconf.freq_hz = 0; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(2, ifconf); /* chain 2: LoRa 125kHz, all SF, on f1 - 0.3 MHz */ + lgw_rxif_setconf(2, ifconf); /* chain 2: LoRa 125kHz, all SF, on f1 - 0.0 MHz */ ifconf.enable = true; - ifconf.rf_chain = 1; - ifconf.freq_hz = 300000; + ifconf.rf_chain = 0; + ifconf.freq_hz = -400000; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(3, ifconf); /* chain 3: LoRa 125kHz, all SF, on f1 + 0.3 MHz */ + lgw_rxif_setconf(3, ifconf); /* chain 3: LoRa 125kHz, all SF, on f0 - 0.4 MHz */ ifconf.enable = true; ifconf.rf_chain = 0; - ifconf.freq_hz = -100000; + ifconf.freq_hz = -200000; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(4, ifconf); /* chain 4: LoRa 125kHz, all SF, on f0 - 0.1 MHz */ + lgw_rxif_setconf(4, ifconf); /* chain 4: LoRa 125kHz, all SF, on f0 - 0.2 MHz */ ifconf.enable = true; ifconf.rf_chain = 0; - ifconf.freq_hz = 100000; + ifconf.freq_hz = 0; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(5, ifconf); /* chain 5: LoRa 125kHz, all SF, on f0 + 0.1 MHz */ + lgw_rxif_setconf(5, ifconf); /* chain 5: LoRa 125kHz, all SF, on f0 + 0.0 MHz */ ifconf.enable = true; - ifconf.rf_chain = 1; - ifconf.freq_hz = -100000; + ifconf.rf_chain = 0; + ifconf.freq_hz = 200000; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(6, ifconf); /* chain 6: LoRa 125kHz, all SF, on f1 - 0.1 MHz */ + lgw_rxif_setconf(6, ifconf); /* chain 6: LoRa 125kHz, all SF, on f0 + 0.2 MHz */ ifconf.enable = true; - ifconf.rf_chain = 1; - ifconf.freq_hz = 100000; + ifconf.rf_chain = 0; + ifconf.freq_hz = 400000; ifconf.datarate = DR_LORA_MULTI; - lgw_rxif_setconf(7, ifconf); /* chain 7: LoRa 125kHz, all SF, on f1 + 0.1 MHz */ + lgw_rxif_setconf(7, ifconf); /* chain 7: LoRa 125kHz, all SF, on f0 + 0.4 MHz */ /* set configuration for LoRa 'stand alone' channel */ memset(&ifconf, 0, sizeof(ifconf)); @@ -279,8 +279,8 @@ int main(int argc, char **argv) txpkt.tx_mode = IMMEDIATE; txpkt.rf_power = 10; txpkt.modulation = MOD_LORA; - txpkt.bandwidth = BW_250KHZ; - txpkt.datarate = DR_LORA_SF10; + txpkt.bandwidth = BW_125KHZ; + txpkt.datarate = DR_LORA_SF9; txpkt.coderate = CR_LORA_4_5; strcpy((char *)txpkt.payload, "TX.TEST.LORA.GW.????" ); txpkt.size = 20; diff --git a/readme.md b/readme.md index 38588acd..f7b24d59 100644 --- a/readme.md +++ b/readme.md @@ -16,9 +16,6 @@ a Semtech LoRa multi-channel RF receiver (a.k.a. concentrator). Once compiled all the code is contained in the libloragw.a file that will be statically linked (ie. integrated in the final executable). -The library must be configured by editing the library.cfg file to set target -platform, SPI interface, etc. - The library also comes with a bunch of basic tests programs that are used to test the different sub-modules of the library. @@ -61,57 +58,101 @@ gateway operates. 3. Changelog ------------- +### v3.2.1 ### + +* HAL: Fixed downlink support for SX1301AP2 reference design: soft reset of the +FPGA was missing for proper IQ inversion configuration. +* HAL: Added support for several versions of FPGA (currently v18 and v19) +* HAL: Reduced radio TX PLL bandwidth to reduce the noise level. +* util_tx_test: Added FSK support and added minimal TX gain LUT. +* util_spectral_scan: Removed FPGA soft reset, now done by the HAL. +* util_tx_continous: reworked to use HAL functions instead of 'manual' config, +and use same SX1301 calibration firmware as the HAL. +* Updated all makefiles to handle the creation of obj directory when necessary. + ### v3.2.0 ### -* Added support for SX1301AP2 reference design (with FPGA and additional SX1272). When a FPGA is detected at startup, the HAL automatically adapt SPI communication requests (using SPI header or not). -* Added util_spectral_scan diagnostic tool to scan the spectral band in background, where the LoRa gateway operates. (can only be used with SX1301AP2 or similar design). By default it uses the same SPI device as the one used by the HAL, but it can be changed depending on the hardware architecture on which it is used. -* Removed SPI FTDI support due to lack of performances to properly handle heavy packet traffic. Only native SPI suage is recommended. +* Added support for SX1301AP2 reference design (with FPGA and additional +SX1272). When a FPGA is detected at startup, the HAL automatically adapts SPI +communication requests (using SPI header or not). +* Added util_spectral_scan diagnostic tool to scan the spectral band in +background, where the LoRa gateway operates. (can only be used with SX1301AP2 +or similar design). By default it uses the same SPI device as the one used by +the HAL, but it can be changed depending on the hardware architecture on which +it is used by updating the SPI_DEV_PATH constant defined in file +util_spectral_scan/src/loragw_fpga_spi.c. +Note: when using same SPI device from 2 applications, we rely on the host SPI +driver and OS to properly handle concurrent SPI requests. It has been tested on +Raspberry Pi / Raspbian with spi_bcm2708 driver.* Removed SPI FTDI support due +to lack of performances to properly handle heavy packet traffic. Only native +SPI usage is recommended. * HAL: added a check that SX1301 firmwares have been properly loaded at startup. ### v3.1.0 ### -* Removed GPIO module from HAL, that was specific to IoT Starter Kit platform. GPIO configuration will be done from application script instead. +* Removed GPIO module from HAL, that was specific to IoT Starter Kit platform. +GPIO configuration will be done from application script instead. * Removed CFG_BRD configuration from library.cfg, not needed anymore ### v3.0.2 ### -* Bugfix: Fixed frequency calculation on uplinks: lgw_receive() function was using a variable to calculate the frequency before it was initialized with correct value. -* Bugfix: util_pkt_logger crashed when no gateway_ID is not defined in global_conf.json +* Bugfix: Fixed frequency calculation on uplinks: lgw_receive() function was +using a variable to calculate the frequency before it was initialized with +correct value. +* Bugfix: util_pkt_logger crashed when no gateway_ID is not defined in +global_conf.json ### v3.0.1 ### -* Bufgix: Fixed util_tx_continuous compilation issue, by adding empty obj directory -* Bugfix: Fixed HAL compilation issue for CFG_SPI=ftdi, removed dependency on loragw_gpio in this case +* Bufgix: Fixed util_tx_continuous compilation issue, by adding empty obj +directory +* Bugfix: Fixed HAL compilation issue for CFG_SPI=ftdi, removed dependency on +loragw_gpio in this case ### v3.0.0 ### -* Added new HAL function lgw_board_setconf() to configure board/concentrator specific parameters: network type (LoRa public or private), concentrator clock source. Note: those parameters are not any more set from the library.cfg file configuration (CFG_NET, CFG_BRD), and should be passed at initialization by the application. -* Added new HAL function lgw_txgain_setconf() to configure concentrator TX gain table. It can now be dynamically set by the application at initialization time. -* Changed HAL function lgw_rxrf_setconf(), it will now also configure the radio type (CFG_RADIO has been removed from library.cfg), the RSSI offset to be used for this radio and if TX is enabled or not on this radio. +* Added new HAL function lgw_board_setconf() to configure board/concentrator +specific parameters: network type (LoRa public or private), concentrator clock +source. Note: those parameters are not any more set from the library.cfg file +configuration (CFG_NET, CFG_BRD), +and should be passed at initialization by the application. +* Added new HAL function lgw_txgain_setconf() to configure concentrator TX gain +table. It can now be dynamically set by the application at initialization time. +* Changed HAL function lgw_rxrf_setconf(), it will now also configure the radio +type (CFG_RADIO has been removed from library.cfg), the RSSI offset to be used +for this radio and if TX is enabled or not on this radio. * Added support of IoT Starter Kit platform, which is now the default board. -* Added util_tx_continuous utility for gateway TX power calibration and spectral emission measurements/qualification. -* Removed CFG_BAND configuration from library.cfg. Band configuration is done by application and passed dynamically at initialization time. -* Updated makefiles to allow cross compilation from environment variable (ARCH, CROSS_COMPILE). +* Added util_tx_continuous utility for gateway TX power calibration and +spectral emission measurements/qualification. +* Removed CFG_BAND configuration from library.cfg. Band configuration is done +by application and passed dynamically at initialization time. +* Updated makefiles to allow cross compilation from environment variable (ARCH, +CROSS_COMPILE). ** WARNING: ** -** Known issue: a problem with carrier leakage calibration has been seen on 433MHz boards. ** +** Known issue: a problem with carrier leakage calibration has been seen on +433MHz boards. ** ### v2.0.0 ### * Added support for Kerlink 868 27dBm gateway -* Updated global_conf.eu868.json (in packet logger) to new LoRaWAN frequency plan -* Added version numbers to AGC, arbiter and calibration firmware (those versions are checked at startup) +* Updated global_conf.eu868.json (in packet logger) to new LoRaWAN frequency +plan +* Added version numbers to AGC, arbiter and calibration firmware (those +versions are checked at startup) * Added test_loragw_cal to test radio calibrations * Fixed minor bug in error coverage in register read/write functions -/!\ warning: Kerlink 868 27dBm gateway includes a FPGA that MUST be programmed before running any application +/!\ warning: Kerlink 868 27dBm gateway includes a FPGA that MUST be programmed +before running any application ### v1.7.0 ### -* Added TX “start delay” compensation for timestamp mode (fix time window alignment issue at low SF and/or high BW) +* Added TX 'start delay' compensation for timestamp mode (fix time window +alignment issue at low SF and/or high BW) * Added adaptive narrowband/wideband TX filtering for LoRa * Added a command-line option to set CR in util_tx_test -* Added notes for TX “start delay” in immediate and triggered mode +* Added notes for TX 'start delay' in immediate and triggered mode /!\ warning: due to start delay compensation being implemented, TX that were previously 1.5ms late will be sent on time. At low datarate, this is not an @@ -161,50 +202,64 @@ issue. At high LoRa data rate (and FSK) you might have to adjust your timing. ### v1.2.1 ### -* Fixed 'floating point exception' crash when concentrator returned a packet with SF=0 (CRC error on LoRa header). +* Fixed 'floating point exception' crash when concentrator returned a packet +with SF=0 (CRC error on LoRa header). * Fixed buggy timezone handling. ### v1.2.0 ### * Added feature: new GPS module in the library for synchronization. -* Removed feature: no more missed deadline detection in TX because of incompatibility with GPS. +* Removed feature: no more missed deadline detection in TX because of +incompatibility with GPS. * Added documentation for GPS and legal notice. * Added flags in Makefiles for easier cross-compilation. ### v1.1.0 ### * Fixed bug 'no TX on radio B' (rfch 1). -* Added feature: concentrator processing delay compensation in the receive() function for accurate 'end of packet' even timestamping. -* Added feature: TX 'start delay' compensation in the send() function to emit packet exactly on target timestamp. -* Added feature: timestamp counter verification in send() function, return an error if scheduling was too late. +* Added feature: concentrator processing delay compensation in the receive() +function for accurate 'end of packet' even timestamping. +* Added feature: TX 'start delay' compensation in the send() function to emit +packet exactly on target timestamp. +* Added feature: timestamp counter verification in send() function, return an +error if scheduling was too late. * Switched license to 'Revised BSD'. ### v1.0.0 (from beta 8) ### * Switched FTDI as default SPI phy layer in library.cfg. -* Fixed a bug in TX power control; still only two TW power available, 14 and 24 dBm. -* Changed library directory name from loragw_hal to libloragw to follow usual conventions. +* Fixed a bug in TX power control; still only two TW power available, 14 and +24dBm. +* Changed library directory name from loragw_hal to libloragw to follow usual +conventions. ### Beta 8 (from beta 7) ### -* API: lgw_receive now return info on RX frequency and RF path for each packet (no need to keep track of RF/IF settings). -* Unified some portion of the code with the 470 MHz variant of the HAL (use SX1255 radios instead of SX1257). +* API: lgw_receive now return info on RX frequency and RF path for each packet +(no need to keep track of RF/IF settings). +* Unified some portion of the code with the 470 MHz variant of the HAL (use +SX1255 radios instead of SX1257). * Improved AGC and ARB firmwares. -* Adding -Wall -Wextra for compilation, fixing all the new warnings for cleaner code. +* Adding -Wall -Wextra for compilation, fixing all the new warnings for cleaner +code. * Fixed bugs in handling of FSK datarate. -* test_loragw_hal now dumps the content of all LoRa registers after configuration in reg_dump.log. +* test_loragw_hal now dumps the content of all LoRa registers after +configuration in reg_dump.log. ### Beta 7 (from beta 5) ### -* Reduced number of SPI transactions to fetch a packet (improved number a packets par second that can be downloaded from concentrator). +* Reduced number of SPI transactions to fetch a packet (improved number a +packets par second that can be downloaded from concentrator). * Streamlined build process, main target is now a static library: libloragw.a. -* Change memory allocation for payload: they are now part of the struct for TX/RX, no need to malloc/free. +* Change memory allocation for payload: they are now part of the struct for +TX/RX, no need to malloc/free. * All RX chains can use any of the two radios now. * FSK is available and working in TX and RX (variable length mode). * Calibrated RSSI for FSK. * lgw_connect now check the CHIP_ID. * Added a license file and a changelog. -* Added a function returning a version string to allow identification of the version/options once compiled. +* Added a function returning a version string to allow identification of the +version/options once compiled. ### Beta 6 ### @@ -212,14 +267,16 @@ Private release, not taken into account in that changelog. ### Beta 5 (from beta 4) ### -* Updated registers, firmware and configuration to align with r986 bitstream revision. +* Updated registers, firmware and configuration to align with r986 bitstream +revision. * Calibrated RSSI for LoRa "multi" and LoRa "stand alone" modems. * Renamed some confusing TX status code. * Added preliminary FSK support. ### Beta 4 (from beta 3) ### -* Unified build environment with selectable SPI layer (Linux native or FTDI SPI-over-USB bridge). +* Unified build environment with selectable SPI layer (Linux native or FTDI +SPI-over-USB bridge). * Remove the 500 kHz limit on radio bandwith, back to the nominal 800 kHz. * Renamed debug flags. @@ -240,7 +297,7 @@ maximum ratings or operation outside the specified range. SEMTECH PRODUCTS ARE NOT DESIGNED, INTENDED, AUTHORIZED OR WARRANTED TO BE SUITABLE FOR USE IN LIFE-SUPPORT APPLICATIONS, DEVICES OR SYSTEMS OR OTHER CRITICAL APPLICATIONS. INCLUSION OF SEMTECH PRODUCTS IN SUCH APPLICATIONS IS -UNDERSTOOD TO BE UNDERTAKEN SOLELY AT THE CUSTOMER’S OWN RISK. Should a +UNDERSTOOD TO BE UNDERTAKEN SOLELY AT THE CUSTOMER'S OWN RISK. Should a customer purchase or use Semtech products for any such unauthorized application, the customer shall indemnify and hold Semtech and its officers, employees, subsidiaries, affiliates, and distributors harmless against all diff --git a/util_pkt_logger/Makefile b/util_pkt_logger/Makefile index 5064c34b..cda773b2 100644 --- a/util_pkt_logger/Makefile +++ b/util_pkt_logger/Makefile @@ -20,6 +20,8 @@ AR := $(CROSS_COMPILE)ar CFLAGS=-O2 -Wall -Wextra -std=c99 -Iinc -I. +OBJDIR = obj + ### Constants for LoRa concentrator HAL library # List the library sub-modules that are used by the application @@ -35,7 +37,7 @@ LIBS := -lloragw -lrt all: $(APP_NAME) clean: - rm -f obj/*.o + rm -f $(OBJDIR)/*.o rm -f $(APP_NAME) ### HAL library (do no force multiple library rebuild even with 'make -B') @@ -52,15 +54,18 @@ $(LGW_PATH)/libloragw.a: $(LGW_INC) ### Sub-modules compilation -obj/parson.o: src/parson.c inc/parson.h +$(OBJDIR): + mkdir -p $(OBJDIR) + +$(OBJDIR)/parson.o: src/parson.c inc/parson.h | $(OBJDIR) $(CC) -c $(CFLAGS) $< -o $@ ### Main program compilation and assembly -obj/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) inc/parson.h +$(OBJDIR)/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) inc/parson.h | $(OBJDIR) $(CC) -c $(CFLAGS) -I$(LGW_PATH)/inc $< -o $@ -$(APP_NAME): obj/$(APP_NAME).o $(LGW_PATH)/libloragw.a obj/parson.o - $(CC) -L$(LGW_PATH) $< obj/parson.o -o $@ $(LIBS) +$(APP_NAME): $(OBJDIR)/$(APP_NAME).o $(LGW_PATH)/libloragw.a $(OBJDIR)/parson.o + $(CC) -L$(LGW_PATH) $< $(OBJDIR)/parson.o -o $@ $(LIBS) ### EOF diff --git a/util_pkt_logger/obj/.gitkeep b/util_pkt_logger/obj/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/util_spectral_scan/Makefile b/util_spectral_scan/Makefile index 42a70b84..8ce2058b 100644 --- a/util_spectral_scan/Makefile +++ b/util_spectral_scan/Makefile @@ -9,32 +9,29 @@ CC = $(CROSS_COMPILE)gcc AR = $(CROSS_COMPILE)ar CFLAGS = -O2 -Wall -Wextra -std=c99 -I inc -D DEBUG_SPI=0 -D DEBUG_REG=0 +OBJDIR = obj +INCLUDES = $(wildcard inc/*.h) + ### General build targets all: util_spectral_scan clean: - rm -f obj/*.o + rm -f $(OBJDIR)/*.o rm -f util_spectral_scan ### Sub-modules compilation -obj/loragw_fpga_aux.o: src/loragw_fpga_aux.c inc/loragw_fpga_aux.h - $(CC) -c $(CFLAGS) $< -o $@ - -obj/loragw_fpga_spi.o: src/loragw_fpga_spi.c inc/loragw_fpga_spi.h - $(CC) -c $(CFLAGS) $< -o $@ +$(OBJDIR): + mkdir -p $(OBJDIR) -obj/loragw_fpga_reg.o: src/loragw_fpga_reg.c inc/loragw_fpga_reg.h inc/loragw_fpga_spi.h +$(OBJDIR)/%.o: src/%.c $(INCLUDES) | $(OBJDIR) $(CC) -c $(CFLAGS) $< -o $@ -### Main program compilation and assembly - -obj/util_spectral_scan.o: src/util_spectral_scan.c inc/loragw_fpga_reg.h inc/loragw_fpga_spi.h inc/loragw_fpga_aux.h - $(CC) -c $(CFLAGS) $< -o $@ +### Main program assembly -util_spectral_scan: obj/util_spectral_scan.o obj/loragw_fpga_reg.o obj/loragw_fpga_spi.o obj/loragw_fpga_aux.o +util_spectral_scan: $(OBJDIR)/util_spectral_scan.o $(OBJDIR)/loragw_fpga_reg.o $(OBJDIR)/loragw_fpga_spi.o $(OBJDIR)/loragw_fpga_aux.o $(CC) $^ -lrt -o $@ ### EOF diff --git a/util_spectral_scan/readme.md b/util_spectral_scan/readme.md index 0849356d..68f4398a 100644 --- a/util_spectral_scan/readme.md +++ b/util_spectral_scan/readme.md @@ -14,18 +14,18 @@ Background Spectral Scan for LoRa gateway ---------------- This software is used to scan the spectral band where the LoRa gateway operates. -It simply computes a RSSI histogram on several frequencies, that will help to detect -occupied bands and get interferer profiles. +It simply computes a RSSI histogram on several frequencies, that will help to +detect occupied bands and get interferer profiles. It logs the histogram in a .csv file. -This utility program is meant to run on the LoRa gateway reference design SX1301AP2 -(with FPGA and additionnal SX1272). +This utility program is meant to run on the LoRa gateway reference design +SX1301AP2 (with FPGA and additionnal SX1272). The background RSSI scan is a diagnostic tool and must be run on top of the -gateway activity. Moreover the two SX1257 radios have to be configured in RX mode -to optimize the matching impedance with SX1272. The 32MHz clock provided to the -SX1272 is available once SX1301 has enabled the two SX1257 radios, so the -background RSSI scan must be launched after the packet forwarder. +gateway activity. Moreover the two SX1257 radios have to be configured in RX +mode to optimize the matching impedance with SX1272. The 32MHz clock provided +to the SX1272 is available once SX1301 has enabled the two SX1257 radios, so +the background RSSI scan must be launched after the packet forwarder. 2. Command line options ------------------------ diff --git a/util_spectral_scan/src/util_spectral_scan.c b/util_spectral_scan/src/util_spectral_scan.c index fab8803f..3da61ac1 100644 --- a/util_spectral_scan/src/util_spectral_scan.c +++ b/util_spectral_scan/src/util_spectral_scan.c @@ -70,12 +70,12 @@ int main( int argc, char ** argv ) int i, j, k; /* loop and temporary variables */ int x; /* return code for functions */ int32_t reg_val; - + /* Parameter parsing */ double arg_lf[3] = {0,0,0}; unsigned arg_u = 0; char arg_s[64]; - + /* Application parameters */ uint32_t start_freq = DEFAULT_START_FREQ; uint32_t stop_freq = DEFAULT_STOP_FREQ; @@ -84,7 +84,7 @@ int main( int argc, char ** argv ) uint16_t rssi_rate_div = DEFAULT_RSSI_RATE_DIV; char log_file_name[64] = DEFAULT_LOG_NAME; FILE * log_file = NULL; - + /* Local var */ int freq_nb; uint32_t freq; @@ -92,12 +92,12 @@ int main( int argc, char ** argv ) uint16_t rssi_histo; uint16_t rssi_cumu; float rssi_thresh[] = {0.1,0.3,0.5,0.8,1}; - + /* FPGA settings */ uint32_t input_sync_edge = 0; uint32_t output_sync_edge = 0; uint32_t filt_on = 1; - + /* Parse command line options */ while( (i = getopt( argc, argv, "hud::f:n:r:l:" )) != -1 ) { @@ -113,7 +113,7 @@ int main( int argc, char ** argv ) printf( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" ); return EXIT_SUCCESS; break; - + case 'f': /* -f :: Frequency vector to scan in MHz, start:step:stop */ j = sscanf( optarg, "%lf:%lf:%lf", &arg_lf[0], &arg_lf[1], &arg_lf[2] ); if( (j!=3) || (arg_lf[0] < MIN_FREQ/1e6) || (arg_lf[0] > MAX_FREQ/1e6) || (arg_lf[1] < MIN_STEP_FREQ/1e6) || (arg_lf[2] < MIN_FREQ/1e6) || (arg_lf[2] > MAX_FREQ/1e6) ) @@ -128,7 +128,7 @@ int main( int argc, char ** argv ) stop_freq = (uint32_t)((arg_lf[2] * 1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ } break; - + case 'n': /* -n Total number of RSSI points, [1,65535] */ j = sscanf( optarg, "%i", &arg_u ); if( (j != 1) || (arg_u < 1) || (arg_u > 65535) ) @@ -141,7 +141,7 @@ int main( int argc, char ** argv ) rssi_pts = (uint16_t)arg_u; } break; - + case 'r': /* -r Divide factor of RSSI sampling rate, 32MHz/(div+1030), [1,65535] */ j = sscanf( optarg, "%i", &arg_u ); if( (j != 1) || (arg_u < 1) || (arg_u > 65535) ) @@ -154,7 +154,7 @@ int main( int argc, char ** argv ) rssi_rate_div = (uint16_t)arg_u; } break; - + case 'l': /* -l Log file name */ j = sscanf( optarg, "%s", arg_s ); if( j != 1 ) @@ -167,27 +167,25 @@ int main( int argc, char ** argv ) sprintf(log_file_name, "%s", arg_s); } break; - + default: printf( "ERROR: argument parsing options. -h for help.\n" ); return EXIT_FAILURE; } } - + /* Start message */ printf( "+++ Start spectral scan of LoRa gateway channels +++\n" ); - + x = lgw_fpga_connect( ); if( x != 0 ) { printf( "ERROR: Failed to connect to FPGA\n" ); return EXIT_FAILURE; } - + /* Configure FPGA */ - x = lgw_fpga_reg_w(LGW_FPGA_SOFT_RESET, 1); - x |= lgw_fpga_reg_w(LGW_FPGA_SOFT_RESET, 0); - x |= lgw_fpga_reg_w(LGW_FPGA_FPGA_CTRL, (filt_on << 4) | (input_sync_edge << 2)| (output_sync_edge << 3) | (1 << 1)); /* Reset Radio */ + x = lgw_fpga_reg_w(LGW_FPGA_FPGA_CTRL, (filt_on << 4) | (input_sync_edge << 2)| (output_sync_edge << 3) | (1 << 1)); /* Reset Radio */ x |= lgw_fpga_reg_w(LGW_FPGA_FPGA_CTRL, (filt_on << 4) | (input_sync_edge << 2)| (output_sync_edge << 3)); x |= lgw_fpga_reg_w(LGW_FPGA_HISTO_TEMPO, rssi_rate_div); x |= lgw_fpga_reg_w(LGW_FPGA_HISTO_NB_READ, rssi_pts); @@ -196,7 +194,7 @@ int main( int argc, char ** argv ) printf( "ERROR: Failed to configure FPGA\n" ); return EXIT_FAILURE; } - + /* create log file */ strcat(log_file_name,".csv"); log_file = fopen(log_file_name, "w"); @@ -206,29 +204,29 @@ int main( int argc, char ** argv ) return EXIT_FAILURE; } printf( "Writing to file: %s\n", log_file_name ); - + /* Number of frequency steps */ freq_nb = (int)( (stop_freq - start_freq) / step_freq ) + 1; printf( "Scanning frequencies:\nstart: %d Hz\nstop : %d Hz\nstep : %d Hz\nnb : %d\n", start_freq, stop_freq, step_freq, freq_nb ); - + /* Main loop */ for( j = 0; j < freq_nb; j++ ) { /* Current frequency */ freq = start_freq + j * step_freq; printf( "%d", freq ); - + /* Set SX1272 */ - x |= setup_sx1272( freq ); + x = setup_sx1272( freq ); if( x != 0 ) { printf( "ERROR: SX1272 setup failed\n" ); return EXIT_FAILURE; } - + /* Start histogram */ lgw_fpga_reg_w(LGW_FPGA_FPGA_CTRL, 1); - + /* Wait until rssi_pts have been processed */ do { @@ -236,14 +234,14 @@ int main( int argc, char ** argv ) lgw_fpga_reg_r(LGW_FPGA_FPGA_STATUS, ®_val); } while( (reg_val & 0x0F) != 8 ); - + /* Stop histogram */ lgw_fpga_reg_w(LGW_FPGA_FPGA_CTRL, 0); - + /* Read histogram */ lgw_fpga_reg_w(LGW_FPGA_HISTO_RAM_ADDR, 0); lgw_fpga_reg_rb(LGW_FPGA_HISTO_RAM_DATA, read_burst, RSSI_RANGE*2); - + fprintf( log_file, "%d", freq ); rssi_cumu = 0; k = 0; @@ -262,24 +260,17 @@ int main( int argc, char ** argv ) printf( "\n" ); } fclose( log_file ); - - /* FGPA soft reset */ - x = lgw_fpga_reg_w(LGW_FPGA_SOFT_RESET, 1); - x |= lgw_fpga_reg_w(LGW_FPGA_SOFT_RESET, 0); - + /* Close SPI */ - x |= lgw_fpga_disconnect( ); - + x = lgw_fpga_disconnect( ); if( x != 0 ) { printf( "ERROR: Failed to disconnect FPGA\n" ); return EXIT_FAILURE; } - - printf( "INFO: Successfully disconnected FPGA\n" ); - + printf( "+++ Exiting Spectral scan program +++\n" ); - + return EXIT_SUCCESS; } @@ -303,7 +294,7 @@ int setup_sx1272( uint32_t freq ) uint8_t AdcTest = 0; uint8_t reg_val; int x; - + x = lgw_sx1272_reg_r(0x42, ®_val); if (x != LGW_REG_SUCCESS) { printf("ERROR: Failed to read SX1272 version register\n"); @@ -313,7 +304,7 @@ int setup_sx1272( uint32_t freq ) printf("ERROR: Unexpected SX1272 version\n"); return EXIT_FAILURE; } - + /* Set in LoRa mode */ x = lgw_sx1272_reg_w(0x01, 0); wait_ms(100); @@ -327,20 +318,20 @@ int setup_sx1272( uint32_t freq ) x |= lgw_sx1272_reg_w(6, (freq_reg >> 16) & 0xFF); x |= lgw_sx1272_reg_w(7, (freq_reg >> 8) & 0xFF); x |= lgw_sx1272_reg_w(8, freq_reg & 0xFF); - + /* Config */ - x |= lgw_sx1272_reg_w(0x1D, bw << 6); + x |= lgw_sx1272_reg_w(0x1D, bw << 6); x |= lgw_sx1272_reg_w(0x50, LowZin); x |= lgw_sx1272_reg_w(0x1E, (sf << 4) | (AgcAuto << 2)); x |= lgw_sx1272_reg_w(0x0C, LnaBoost | (TrimRxCrFo << 3) | (LnaGain << 5)); x |= lgw_sx1272_reg_w(0x68, AdcBw | (AdcBwAuto << 3)); x |= lgw_sx1272_reg_w(0x69, AdcTest | (AdcTrim << 4) | (AdcLowPwr << 7)); - + if (x != LGW_REG_SUCCESS) { printf("ERROR: Failed to configure SX1272\n"); return EXIT_FAILURE; } - + /* Set in Rx continuous mode */ x = lgw_sx1272_reg_w(0x01, 5 | (1<<7)); wait_ms(100); diff --git a/util_spi_stress/Makefile b/util_spi_stress/Makefile index 39b9776d..a512acd0 100644 --- a/util_spi_stress/Makefile +++ b/util_spi_stress/Makefile @@ -20,6 +20,8 @@ AR := $(CROSS_COMPILE)ar CFLAGS=-O2 -Wall -Wextra -std=c99 -Iinc -I. +OBJDIR = obj + ### Constants for LoRa concentrator HAL library # List the library sub-modules that are used by the application @@ -35,7 +37,7 @@ LIBS := -lloragw -lrt all: $(APP_NAME) clean: - rm -f obj/*.o + rm -f $(OBJDIR)/*.o rm -f $(APP_NAME) ### HAL library (do no force multiple library rebuild even with 'make -B') @@ -52,10 +54,13 @@ $(LGW_PATH)/libloragw.a: $(LGW_INC) ### Main program compilation and assembly -obj/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) +$(OBJDIR): + mkdir -p $(OBJDIR) + +$(OBJDIR)/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) | $(OBJDIR) $(CC) -c $(CFLAGS) -I$(LGW_PATH)/inc $< -o $@ -$(APP_NAME): obj/$(APP_NAME).o $(LGW_PATH)/libloragw.a +$(APP_NAME): $(OBJDIR)/$(APP_NAME).o $(LGW_PATH)/libloragw.a $(CC) -L$(LGW_PATH) $< -o $@ $(LIBS) ### EOF diff --git a/util_spi_stress/obj/.gitkeep b/util_spi_stress/obj/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/util_spi_stress/src/util_spi_stress.c b/util_spi_stress/src/util_spi_stress.c index f86fd327..57d9454b 100644 --- a/util_spi_stress/src/util_spi_stress.c +++ b/util_spi_stress/src/util_spi_stress.c @@ -43,9 +43,9 @@ Maintainer: Sylvain Miermont /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define VERS 103 -#define READS_WHEN_ERROR 16 /* number of times a read is repeated if there is a read error */ -#define BUFF_SIZE 1024 +#define VERS 103 +#define READS_WHEN_ERROR 16 /* number of times a read is repeated if there is a read error */ +#define BUFF_SIZE 1024 /* maximum number of bytes that we can write in sx1301 RX data buffer */ /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES (GLOBAL) ------------------------------------------- */ diff --git a/util_tx_continuous/Makefile b/util_tx_continuous/Makefile index 69ce3a47..5447fe0d 100644 --- a/util_tx_continuous/Makefile +++ b/util_tx_continuous/Makefile @@ -20,6 +20,8 @@ AR := $(CROSS_COMPILE)ar CFLAGS=-O2 -Wall -Wextra -std=c99 -Iinc -I. +OBJDIR = obj + ### Constants for LoRa concentrator HAL library # List the library sub-modules that are used by the application @@ -37,7 +39,7 @@ LIBS := -lloragw -lrt all: $(APP_NAME) clean: - rm -f obj/*.o + rm -f $(OBJDIR)/*.o rm -f $(APP_NAME) ### HAL library (do no force multiple library rebuild even with 'make -B') @@ -54,10 +56,13 @@ $(LGW_PATH)/libloragw.a: $(LGW_INC) ### Main program compilation and assembly -obj/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) src/cal_tx_fw.var src/util_fw.var +$(OBJDIR): + mkdir -p $(OBJDIR) + +$(OBJDIR)/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) | $(OBJDIR) $(CC) -c $(CFLAGS) -I$(LGW_PATH)/inc $< -o $@ -$(APP_NAME): obj/$(APP_NAME).o $(LGW_PATH)/libloragw.a +$(APP_NAME): $(OBJDIR)/$(APP_NAME).o $(LGW_PATH)/libloragw.a $(CC) -L$(LGW_PATH) $< -o $@ $(LIBS) ### EOF diff --git a/util_tx_continuous/obj/.gitkeep b/util_tx_continuous/obj/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/util_tx_continuous/readme.md b/util_tx_continuous/readme.md index d184d83f..70a75bab 100644 --- a/util_tx_continuous/readme.md +++ b/util_tx_continuous/readme.md @@ -1,62 +1,62 @@ - ______ _ - / _____) _ | | - ( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | - (______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2014 Semtech-Cycleo - -Tx continuous program for LoRa concentrator -=========================================== - - -1. Introduction ----------------- - -This software is used to set LoRa concentrator in Tx continuous mode, -for spectral measurement. -The user can set the modulation type, the modulation parameters, and the multiple gains of -the Tx chain. -The program runs indefinitely, until the user stops the application. - - -2. Usage --------- - -See command line help to get the list of all available options: -./util_tx_continuous -h - -Example: -./util_tx_continuous -f 868 -r 1 --dig 0 --mix 11 --pa 2 --mod "LORA" --sf 7 --bw 125 - - -4. License ------------ - -Copyright (c) 2013, SEMTECH S.A. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of the Semtech corporation nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL SEMTECH S.A. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*EOF* + ______ _ + / _____) _ | | + ( (____ _____ ____ _| |_ _____ ____| |__ + \____ \| ___ | (_ _) ___ |/ ___) _ \ + _____) ) ____| | | || |_| ____( (___| | | | + (______/|_____)_|_|_| \__)_____)\____)_| |_| + (C)2014 Semtech-Cycleo + +Tx continuous program for LoRa concentrator +=========================================== + + +1. Introduction +---------------- + +This software is used to set LoRa concentrator in Tx continuous mode, for +spectral measurement. +The user can set the modulation type, the modulation parameters, and the +multiple gains of the Tx chain. +The program runs indefinitely, until the user stops the application. + + +2. Usage +-------- + +See command line help to get the list of all available options: +./util_tx_continuous -h + +Example: +./util_tx_continuous -f 868 -r 1257 --dig 0 --mix 14 --pa 3 --mod "LORA" --sf 7 --bw 125 + + +4. License +----------- + +Copyright (c) 2013, SEMTECH S.A. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the Semtech corporation nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL SEMTECH S.A. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*EOF* diff --git a/util_tx_continuous/src/cal_tx_fw.var b/util_tx_continuous/src/cal_tx_fw.var deleted file mode 100644 index 4680219f..00000000 --- a/util_tx_continuous/src/cal_tx_fw.var +++ /dev/null @@ -1,530 +0,0 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2013 Semtech-Cycleo - -Description: - Tx DC offset calibration firmware - -License: Revised BSD License, see LICENSE.TXT file include in the project -Maintainer: Matthieu Leurent -*/ - -static uint8_t cal_tx_fw[8192] = { -0x8A, 0x51, 0x81, 0x69, 0x00, 0xB0, 0x8A, 0xC0, 0x04, 0x88, 0x84, 0x0A, 0x82, 0x47, 0x00, 0xF4, -0x18, 0x74, 0x1C, 0xB4, 0x1E, 0xF4, 0x20, 0x34, 0x22, 0x74, 0x23, 0xB4, 0x24, 0x74, 0x25, 0xB4, -0x26, 0xB4, 0x27, 0xF4, 0x28, 0x74, 0x28, 0x74, 0x29, 0xB4, 0x2A, 0xB4, 0x2A, 0xB4, 0x2B, 0xF4, -0x2B, 0xF4, 0x2C, 0xB4, 0x2C, 0xB4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2D, 0xF4, 0x2E, 0xF4, 0x2E, 0xF4, -0x2E, 0xF4, 0x2F, 0x34, 0x2F, 0x34, 0x2F, 0x34, 0x30, 0x74, 0x30, 0x74, 0x00, 0xF4, 0x00, 0xF4, -0x06, 0x74, 0x0A, 0x74, 0x0C, 0x74, 0x0E, 0xB4, 0x10, 0x34, 0x11, 0x74, 0x12, 0x74, 0x13, 0xB4, -0x14, 0x74, 0x15, 0xB4, 0x16, 0xB4, 0x16, 0xB4, 0x17, 0xF4, 0x18, 0x74, 0x0F, 0xF4, 0x0C, 0x74, -0x09, 0x74, 0x09, 0x74, 0x09, 0x74, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, 0x0F, 0xF4, 0x0C, 0x74, -0x01, 0x34, 0x01, 0x34, 0x01, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x05, 0x74, -0x06, 0x74, 0x06, 0x74, 0x02, 0x34, 0x02, 0x34, 0x03, 0x74, 0x04, 0x34, 0x05, 0x74, 0x06, 0x74, -0x07, 0xB4, 0x40, 0x34, 0x20, 0x34, 0x10, 0x34, 0x08, 0x34, 0x04, 0x34, 0x02, 0x34, 0x01, 0x34, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0x64, 0xC0, 0x80, 0x81, 0x84, 0x0A, 0x04, 0xC6, 0x03, 0x59, 0x00, 0xF4, 0x04, 0xC6, -0x62, 0xA9, 0xA2, 0xC0, 0x10, 0xF0, 0x22, 0xC2, 0x22, 0xC8, 0x03, 0x18, 0x74, 0xE9, 0x1F, 0xBE, -0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x08, 0x40, 0xA1, 0xC0, 0x03, 0xD0, 0xA1, 0x4C, 0x03, 0xD0, -0xA1, 0x4C, 0x03, 0xD0, 0xA1, 0x4C, 0x21, 0xC8, 0x01, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, -0x08, 0x40, 0xEF, 0x01, 0x83, 0x93, 0x4F, 0xF0, 0x84, 0x80, 0x68, 0x70, 0x8A, 0x51, 0x61, 0x61, -0x8A, 0x51, 0xD3, 0xF0, 0x84, 0x80, 0xD9, 0xF0, 0x8A, 0x51, 0x61, 0x61, 0x8A, 0x51, 0x83, 0xD7, -0xA0, 0x30, 0x84, 0x80, 0xB4, 0xB0, 0x8A, 0x51, 0x61, 0x61, 0x83, 0x96, 0x03, 0x97, 0x05, 0x30, -0xB4, 0x00, 0x03, 0x53, 0x02, 0xF0, 0xD9, 0x40, 0x83, 0x52, 0x01, 0xF0, 0xE8, 0x00, 0x01, 0xF0, -0xE9, 0x40, 0x07, 0x70, 0xEA, 0x40, 0x06, 0x30, 0xEB, 0x80, 0x0F, 0xB0, 0xEC, 0x40, 0x01, 0xF0, -0xED, 0x80, 0x0E, 0x70, 0xEE, 0x80, 0x83, 0x01, 0x8A, 0x51, 0x45, 0xAA, 0xA3, 0x41, 0x23, 0x08, -0xA4, 0x3E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x00, 0xB0, 0x36, 0xA2, 0x8A, 0x51, 0x83, 0xD7, -0x80, 0x40, 0x23, 0x08, 0x57, 0xBE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x01, 0xF0, 0x36, 0xA2, -0x8A, 0x51, 0x83, 0x93, 0x80, 0x40, 0x23, 0x08, 0x53, 0x7E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, -0x02, 0xF0, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0x4F, 0xBE, 0x84, 0x80, 0x23, 0x08, -0xA1, 0xC0, 0x03, 0x30, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0x5D, 0xBE, 0x84, 0x80, -0x23, 0x08, 0xA1, 0xC0, 0x04, 0xF0, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xD5, 0xBE, -0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x05, 0x30, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, -0xD3, 0xBE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x06, 0x30, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, -0x23, 0x08, 0xB0, 0x3E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x08, 0xF0, 0x36, 0xA2, 0x8A, 0x51, -0x83, 0xD7, 0x80, 0x40, 0x23, 0x08, 0xAC, 0x7E, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0A, 0x30, -0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xAE, 0xBE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, -0x0B, 0x70, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xA6, 0x7E, 0x84, 0x80, 0x23, 0x08, -0xA1, 0xC0, 0x0C, 0x30, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xA8, 0x3E, 0x84, 0x80, -0x23, 0x08, 0xA1, 0xC0, 0x0D, 0x70, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, 0xAA, 0x7E, -0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x0E, 0x70, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, 0x23, 0x08, -0xA0, 0xFE, 0x84, 0x80, 0x23, 0x08, 0xA1, 0xC0, 0x10, 0xF0, 0x36, 0xA2, 0x8A, 0x51, 0x80, 0x40, -0x02, 0xF0, 0xA3, 0x8A, 0x23, 0x02, 0x03, 0x18, 0x08, 0x40, 0xAF, 0x69, 0xA2, 0xC0, 0x21, 0xC8, -0x03, 0x59, 0x3F, 0x6A, 0x22, 0xC8, 0x86, 0xC0, 0x22, 0xC8, 0x86, 0xC0, 0x43, 0xAA, 0x22, 0xC8, -0x85, 0xC0, 0x22, 0xC8, 0x85, 0xC0, 0x08, 0x88, 0x08, 0x40, 0x01, 0xF0, 0xA0, 0x80, 0x95, 0x41, -0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x10, 0xF0, -0x9E, 0x40, 0x8B, 0x41, 0x83, 0x96, 0xA0, 0xC1, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x41, 0xC0, 0xC1, -0xC8, 0x01, 0xD2, 0x41, 0x83, 0x52, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x43, 0x8A, 0x51, 0xB2, 0xE5, -0x8A, 0x51, 0x03, 0xBA, 0x03, 0x9D, 0x5A, 0xEA, 0x03, 0x30, 0xE5, 0x40, 0xC8, 0x70, 0xA1, 0xC0, -0x02, 0xF0, 0xA2, 0xC0, 0x56, 0xB0, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x02, 0xF0, 0xA1, 0xC0, -0x56, 0xB0, 0x8A, 0x51, 0xB2, 0xE5, 0x8A, 0x51, 0xE7, 0x80, 0xC8, 0xFA, 0x03, 0x59, 0x1B, 0x94, -0xC9, 0xB0, 0xA1, 0xC0, 0x01, 0xF0, 0xA2, 0x01, 0x8A, 0x51, 0xF0, 0x27, 0x8A, 0x51, 0x01, 0xF0, -0xA1, 0x01, 0x8A, 0x51, 0x36, 0xA2, 0x8A, 0x51, 0xE7, 0x80, 0xC9, 0x3A, 0x03, 0x59, 0x9B, 0xD4, -0xCA, 0xB0, 0xA1, 0xC0, 0x01, 0xF0, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0xF0, 0x27, 0x8A, 0x51, -0x01, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0x36, 0xA2, 0x8A, 0x51, 0xE7, 0x80, 0xCA, 0x3A, -0x03, 0x59, 0x1B, 0xD5, 0x14, 0x9D, 0xA0, 0x6A, 0x83, 0x52, 0x03, 0x53, 0xEF, 0x54, 0xA3, 0xEA, -0x83, 0x52, 0x03, 0x53, 0xEF, 0x10, 0x94, 0xDD, 0xA9, 0xEA, 0x83, 0x52, 0x03, 0x53, 0x6F, 0x55, -0xAC, 0xEA, 0x83, 0x52, 0x03, 0x53, 0x6F, 0x11, 0x94, 0xDE, 0xB2, 0xEA, 0x83, 0x52, 0x03, 0x53, -0x6F, 0x14, 0xB5, 0x2A, 0x83, 0x52, 0x03, 0x53, 0x6F, 0xD0, 0x8A, 0x51, 0xAE, 0xE1, 0x8A, 0x51, -0xCE, 0x81, 0x4E, 0x48, 0x57, 0xBE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xCB, 0x40, 0x4E, 0x48, -0x59, 0x7E, 0x84, 0x80, 0x4B, 0x48, 0x80, 0x40, 0x4E, 0x48, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x48, -0xCB, 0x40, 0x4E, 0x48, 0x55, 0x7E, 0x84, 0x80, 0x4B, 0x48, 0x80, 0x40, 0x4E, 0x48, 0x4F, 0xBE, -0x84, 0x80, 0x00, 0x48, 0xCB, 0x40, 0x4E, 0x48, 0x51, 0x3E, 0x84, 0x80, 0x4B, 0x48, 0x80, 0x40, -0x4E, 0x48, 0x5D, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCB, 0x40, 0x4E, 0x48, 0xD7, 0xFE, 0x84, 0x80, -0x4B, 0x48, 0x80, 0x40, 0x4E, 0x48, 0xD5, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xCB, 0x40, 0x4E, 0x48, -0x5B, 0xBE, 0x84, 0x80, 0x4B, 0x48, 0x80, 0x40, 0x4E, 0x48, 0xD3, 0xBE, 0x84, 0x80, 0x00, 0x48, -0xCB, 0x40, 0x4E, 0x48, 0xA2, 0x3E, 0x84, 0x80, 0x4B, 0x48, 0x83, 0xD7, 0x80, 0x40, 0x02, 0xF0, -0xCE, 0xCA, 0x4E, 0x42, 0x03, 0x5C, 0xB9, 0x2A, 0x69, 0xB0, 0xA1, 0x01, 0xA2, 0x01, 0x8A, 0x51, -0x40, 0x25, 0x8A, 0x51, 0x19, 0x10, 0x19, 0x51, 0x99, 0x50, 0x99, 0x91, 0x21, 0x30, 0xA1, 0x01, -0xA1, 0x4A, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x21, 0x30, 0xA1, 0x01, -0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x02, 0xF0, 0xA1, 0x01, 0xA2, 0xC0, -0x55, 0xB0, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x14, 0x30, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, -0x56, 0xB0, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0xEF, 0x9C, 0x80, 0x6B, 0x18, 0xD0, 0x02, 0xF0, -0xA1, 0x01, 0xA2, 0xC0, 0x53, 0xB0, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x27, 0xB0, 0xA1, 0x01, -0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x28, 0x30, 0xA1, 0x01, 0xA2, 0x01, -0xA2, 0x4A, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x01, 0xF0, 0xAA, 0x41, 0x8A, 0x51, 0x40, 0x26, -0x8A, 0x51, 0x6C, 0xCE, 0xF0, 0x39, 0x66, 0x44, 0x83, 0x96, 0xD2, 0x00, 0x03, 0x30, 0x8A, 0x51, -0xF7, 0xA3, 0x8A, 0x51, 0xCC, 0x00, 0x00, 0xB0, 0x8A, 0x51, 0x57, 0xE4, 0x8A, 0x51, 0x07, 0x70, -0x8A, 0x51, 0xF7, 0xA3, 0x8A, 0x51, 0xCD, 0x40, 0x4C, 0x08, 0x8A, 0x51, 0x69, 0xA1, 0x8A, 0x51, -0xCB, 0x40, 0x4D, 0x48, 0x8A, 0x51, 0x69, 0xA1, 0x8A, 0x51, 0x4B, 0x42, 0x18, 0xFE, 0x83, 0x96, -0xC0, 0x80, 0x83, 0x52, 0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xB2, 0xE5, 0x8A, 0x51, -0x83, 0x96, 0xA0, 0x80, 0x83, 0x52, 0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xB2, 0xE5, -0x8A, 0x51, 0x83, 0x96, 0xA8, 0xC0, 0x14, 0x30, 0x40, 0x82, 0x83, 0x52, 0x03, 0x18, 0x9B, 0x16, -0x83, 0x52, 0x00, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0xA2, 0x01, 0x8A, 0x51, 0xF0, 0x27, 0x8A, 0x51, -0x6F, 0x9D, 0xDF, 0xEB, 0x18, 0x14, 0x02, 0xF0, 0xA1, 0x01, 0xA1, 0x4A, 0xA2, 0xC0, 0x53, 0xB0, -0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x27, 0xB0, 0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, -0x40, 0x25, 0x8A, 0x51, 0x28, 0x30, 0xA1, 0x01, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0x40, 0x25, -0x8A, 0x51, 0x01, 0xF0, 0xAA, 0x41, 0xAA, 0x8A, 0x8A, 0x51, 0x40, 0x26, 0x8A, 0x51, 0x6C, 0xCE, -0xF0, 0x39, 0x66, 0x44, 0x83, 0x96, 0xD2, 0x00, 0x03, 0x30, 0x8A, 0x51, 0xF7, 0xA3, 0x8A, 0x51, -0xCC, 0x00, 0x01, 0xF0, 0x8A, 0x51, 0x57, 0xE4, 0x8A, 0x51, 0x07, 0x70, 0x8A, 0x51, 0xF7, 0xA3, -0x8A, 0x51, 0xCD, 0x40, 0x4C, 0x08, 0x8A, 0x51, 0x69, 0xA1, 0x8A, 0x51, 0xCB, 0x40, 0x4D, 0x48, -0x8A, 0x51, 0x69, 0xA1, 0x8A, 0x51, 0x4B, 0x42, 0x18, 0xFE, 0x83, 0x96, 0xC8, 0xC0, 0x83, 0x52, -0x27, 0xB0, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xB2, 0xE5, 0x8A, 0x51, 0x83, 0x96, 0xB0, 0xC0, -0x83, 0x52, 0x28, 0x30, 0xA1, 0x01, 0xA1, 0x4A, 0x8A, 0x51, 0xB2, 0xE5, 0x8A, 0x51, 0x83, 0x96, -0xB8, 0x00, 0x14, 0x30, 0x48, 0xC2, 0x83, 0x52, 0x03, 0x18, 0x1B, 0x17, 0x83, 0x52, 0x00, 0xB0, -0xA1, 0x01, 0xA1, 0x4A, 0xA2, 0x01, 0xA2, 0x4A, 0x8A, 0x51, 0xF0, 0x27, 0x8A, 0x51, 0x18, 0x56, -0x18, 0x12, 0x8A, 0x51, 0x5A, 0x27, 0x8A, 0x51, 0xE4, 0xB0, 0xCB, 0x40, 0xE7, 0xAB, 0xE8, 0x2B, -0xCB, 0x0B, 0xE6, 0x6B, 0xEB, 0xAB, 0x00, 0x00, 0x0E, 0x70, 0x83, 0x52, 0x03, 0x53, 0xA1, 0xC0, -0x69, 0xB0, 0xA2, 0x01, 0x8A, 0x51, 0x40, 0x25, 0x8A, 0x51, 0x9B, 0x57, 0xF6, 0xAB, 0x83, 0x52, -0xB4, 0x00, 0x34, 0x8E, 0xF0, 0x39, 0x0C, 0x78, 0xB8, 0x00, 0xBB, 0xC1, 0x38, 0x08, 0xA1, 0xC0, -0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0x40, 0x25, 0x8A, 0x51, 0x38, 0x08, 0x02, 0xBE, 0xA1, 0xC0, -0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0x40, 0x25, 0x8A, 0x51, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70, -0xB2, 0xE5, 0x8A, 0x51, 0xE7, 0x80, 0xE7, 0xDF, 0x0D, 0xAC, 0x02, 0xF0, 0xA1, 0xC0, 0x57, 0xF0, -0xB2, 0xE5, 0x8A, 0x51, 0xB5, 0x40, 0x02, 0xF0, 0xA1, 0xC0, 0x58, 0x70, 0xB2, 0xE5, 0x8A, 0x51, -0xB6, 0x40, 0x3B, 0x88, 0x25, 0x3E, 0x84, 0x80, 0x35, 0x48, 0xC6, 0xE5, 0x8A, 0x51, 0xA4, 0xC0, -0x36, 0x48, 0xC6, 0xE5, 0x8A, 0x51, 0x24, 0x47, 0x83, 0x93, 0x80, 0x40, 0x0F, 0xB0, 0xBB, 0x0A, -0x3B, 0x82, 0x03, 0x5C, 0xFE, 0xEB, 0xBA, 0x81, 0x25, 0x08, 0xB9, 0x40, 0xB7, 0xC1, 0xBB, 0xC1, -0x3B, 0x88, 0x25, 0x3E, 0x84, 0x80, 0x39, 0x48, 0x00, 0x42, 0x03, 0x18, 0x46, 0xAC, 0x3B, 0x88, -0x25, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xB9, 0x40, 0x3B, 0x88, 0xB7, 0x80, 0x0F, 0xB0, 0xBB, 0x0A, -0x3B, 0x82, 0x03, 0x5C, 0x38, 0xAC, 0x37, 0x88, 0x25, 0x3E, 0x84, 0x80, 0xFF, 0xB0, 0x80, 0x40, -0x08, 0xF0, 0xBA, 0xCA, 0x3A, 0x42, 0x03, 0x5C, 0x34, 0xAC, 0x39, 0x48, 0x08, 0x40, 0xB2, 0x00, -0xC9, 0x41, 0xCA, 0x41, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x53, 0xB0, 0x40, 0x25, 0xC7, 0x81, -0x49, 0x08, 0xB3, 0x40, 0x4A, 0x08, 0xBC, 0x40, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x49, 0x87, 0xB4, 0x00, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x87, 0xBD, 0x80, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x49, 0x87, 0xB5, 0x40, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x02, 0xBE, 0x80, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x49, 0x02, 0xB6, 0x40, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x87, 0xBF, 0xC0, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x49, 0x02, 0xB7, 0x80, 0x47, 0x48, 0x4A, 0x3E, 0x84, 0x80, 0x8A, 0x51, -0x02, 0xA0, 0x8A, 0x51, 0x4A, 0x02, 0xC0, 0x80, 0xC8, 0x01, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xA1, 0xC0, 0x27, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0x40, 0x25, 0x8A, 0x51, 0x48, 0xC8, -0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x28, 0x30, 0xA2, 0x01, 0xA2, 0x4A, 0x40, 0x25, -0x47, 0x48, 0x43, 0x3E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0x54, 0xA5, 0x8A, 0x51, -0xC6, 0x00, 0x48, 0xC8, 0x03, 0x59, 0xC8, 0xAC, 0x45, 0x08, 0x46, 0x02, 0x03, 0x18, 0xD4, 0xEC, -0x46, 0x08, 0xC5, 0x00, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xC9, 0x00, 0x48, 0xC8, -0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x05, 0x30, 0xC8, 0x4A, 0x48, 0xC2, 0x03, 0x5C, -0xA5, 0xEC, 0x07, 0x70, 0xC7, 0xCA, 0x47, 0x42, 0x49, 0x08, 0xB3, 0x40, 0x4A, 0x08, 0xBC, 0x40, -0x03, 0x5C, 0x64, 0xAC, 0x49, 0x4A, 0xB4, 0x00, 0x4A, 0x4A, 0xBD, 0x80, 0x49, 0x4A, 0xB5, 0x40, -0x4A, 0x43, 0xBE, 0x80, 0x49, 0x43, 0xB6, 0x40, 0x4A, 0x4A, 0xBF, 0xC0, 0x49, 0x43, 0xB7, 0x80, -0x4A, 0x43, 0xC0, 0x80, 0x49, 0x08, 0xB8, 0x00, 0x4A, 0x4A, 0xC1, 0xC0, 0x49, 0x08, 0xB9, 0x40, -0x4A, 0x43, 0xC2, 0xC0, 0x49, 0x4A, 0xBA, 0x40, 0x4A, 0x08, 0xC3, 0x00, 0x49, 0x43, 0xBB, 0x80, -0x4A, 0x08, 0xC4, 0xC0, 0xC8, 0x01, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, -0x27, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, 0x40, 0x25, 0x8A, 0x51, 0x48, 0xC8, 0x3C, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xA1, 0xC0, 0x28, 0x30, 0xA2, 0x01, 0xA2, 0x4A, 0x40, 0x25, 0x8A, 0x51, 0x07, 0x70, -0x54, 0xA5, 0x8A, 0x51, 0xC6, 0x00, 0x48, 0xC8, 0x03, 0x59, 0x22, 0xAD, 0x45, 0x08, 0x46, 0x02, -0x03, 0x18, 0x2E, 0x2D, 0x46, 0x08, 0xC5, 0x00, 0x48, 0xC8, 0x33, 0x7E, 0x84, 0x80, 0x00, 0x48, -0xC9, 0x00, 0x48, 0xC8, 0x3C, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xCA, 0x00, 0x09, 0x30, 0xC8, 0x4A, -0x48, 0xC2, 0x03, 0x5C, 0x03, 0xAD, 0x49, 0x08, 0xA1, 0xC0, 0x27, 0xB0, 0xA2, 0x01, 0xA2, 0x4A, -0x40, 0x25, 0x8A, 0x51, 0x4A, 0x08, 0xA1, 0xC0, 0x28, 0x30, 0xA2, 0x01, 0xA2, 0x4A, 0x40, 0x6D, -0xA3, 0x00, 0x22, 0x0A, 0x03, 0x59, 0x4E, 0x2D, 0x22, 0xC8, 0x65, 0x86, 0x03, 0x59, 0x4E, 0x2D, -0x22, 0xC8, 0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x22, 0xC8, 0xE5, 0x40, 0x21, 0xC8, 0x88, 0x80, -0x23, 0x08, 0x80, 0x38, 0x8C, 0xC0, 0x08, 0x40, 0xAA, 0x00, 0x2A, 0x8E, 0xF0, 0x39, 0x0C, 0x78, -0xAE, 0x40, 0xB1, 0x41, 0x2E, 0x48, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0x40, 0x25, -0x8A, 0x51, 0x2E, 0x48, 0x02, 0xBE, 0xA1, 0xC0, 0x02, 0xF0, 0xA2, 0xC0, 0x54, 0x70, 0x40, 0x25, -0x8A, 0x51, 0x02, 0xF0, 0xA1, 0xC0, 0x54, 0x70, 0xB2, 0xE5, 0x8A, 0x51, 0xE7, 0x80, 0xE7, 0xDF, -0x69, 0x2D, 0x02, 0xF0, 0xA1, 0xC0, 0x57, 0xF0, 0xB2, 0xE5, 0x8A, 0x51, 0xAB, 0x40, 0x02, 0xF0, -0xA1, 0xC0, 0x58, 0x70, 0xB2, 0xE5, 0x8A, 0x51, 0xAC, 0x00, 0x31, 0x08, 0x25, 0x3E, 0x84, 0x80, -0x2B, 0x48, 0xC6, 0xE5, 0x8A, 0x51, 0xA4, 0xC0, 0x2C, 0x08, 0xC6, 0xE5, 0x8A, 0x51, 0x24, 0x47, -0x80, 0x40, 0x05, 0x30, 0xB1, 0x8A, 0x31, 0x02, 0x03, 0x5C, 0x5A, 0x2D, 0xB0, 0x01, 0x25, 0x08, -0xAF, 0x80, 0xAD, 0x81, 0xB1, 0x41, 0x31, 0x08, 0x25, 0x3E, 0x84, 0x80, 0x2F, 0x88, 0x00, 0x42, -0x03, 0x18, 0xA1, 0xED, 0x31, 0x08, 0x25, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xAF, 0x80, 0x31, 0x08, -0xAD, 0x40, 0x05, 0x30, 0xB1, 0x8A, 0x31, 0x02, 0x03, 0x5C, 0x93, 0x2D, 0x2D, 0x48, 0x25, 0x3E, -0x84, 0x80, 0xFF, 0xB0, 0x80, 0x40, 0x03, 0x30, 0xB0, 0x4A, 0x30, 0xC2, 0x03, 0x5C, 0x8F, 0x6D, -0x2F, 0x88, 0x08, 0x40, 0xA2, 0xC0, 0x21, 0x0A, 0x03, 0x59, 0xC0, 0xAD, 0x21, 0xC8, 0x65, 0x86, -0x03, 0x59, 0xC0, 0xAD, 0x21, 0xC8, 0x88, 0x80, 0x80, 0xF0, 0x8C, 0xC0, 0x21, 0xC8, 0xE5, 0x40, -0x22, 0xC8, 0x8C, 0xC0, 0x22, 0xC8, 0x8C, 0xC0, 0x08, 0x88, 0x08, 0x40, 0xA1, 0xC0, 0xA1, 0x1F, -0xCC, 0x2D, 0x21, 0x03, 0xFF, 0x3A, 0x08, 0x40, 0x21, 0xC8, 0x08, 0x40, 0xA8, 0xC0, 0x28, 0x5C, -0xD5, 0x6D, 0x83, 0x52, 0x03, 0x53, 0x18, 0x14, 0xD8, 0x2D, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, -0x07, 0x70, 0xE6, 0x40, 0x66, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, 0x18, 0x11, 0xA9, 0x41, -0x28, 0xC8, 0xA4, 0xC0, 0x00, 0xB0, 0x21, 0x66, 0x8A, 0x51, 0x98, 0x95, 0x98, 0x51, 0xA7, 0x81, -0x74, 0xB0, 0x0E, 0x02, 0x03, 0x5C, 0xF2, 0x6D, 0x0B, 0x70, 0x66, 0x42, 0x03, 0x18, 0xF2, 0x6D, -0xE6, 0xCA, 0xFC, 0xAD, 0x2D, 0xB0, 0x0E, 0x02, 0x03, 0x18, 0x01, 0x6E, 0x08, 0xF0, 0x66, 0x42, -0x03, 0x5C, 0x01, 0x6E, 0xFF, 0xB0, 0xE6, 0x07, 0x66, 0xCE, 0xF0, 0x39, 0x96, 0x00, 0x18, 0x55, -0x18, 0x11, 0x24, 0x30, 0x0F, 0x42, 0x03, 0x5C, 0x0B, 0xEE, 0x09, 0x30, 0x29, 0x02, 0x03, 0x18, -0x0B, 0xEE, 0xA9, 0x8A, 0x14, 0xAE, 0x10, 0xF0, 0x0F, 0x42, 0x03, 0x18, 0x1B, 0x2E, 0x29, 0x08, -0x03, 0x59, 0x1B, 0x2E, 0xFF, 0xB0, 0xA9, 0xC7, 0x28, 0xC8, 0xA4, 0xC0, 0x29, 0x08, 0x21, 0x66, -0x8A, 0x51, 0x98, 0x95, 0x98, 0x51, 0x14, 0x30, 0xA7, 0xCA, 0x27, 0x42, 0x03, 0x18, 0x08, 0x40, -0xE8, 0x2D, 0xA6, 0x00, 0x39, 0x7E, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xED, 0x80, -0x26, 0x08, 0x2F, 0xBE, 0x84, 0x80, 0x8A, 0x51, 0x02, 0xA0, 0x8A, 0x51, 0xEC, 0x40, 0x6D, 0x88, -0xA5, 0x00, 0x05, 0x30, 0x03, 0xD0, 0xA5, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x33, 0x2E, -0x6C, 0xCD, 0x25, 0x04, 0x69, 0x44, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0C, 0x30, 0xF0, 0x6F, -0xAD, 0x40, 0x01, 0xF0, 0xE0, 0xC0, 0x2A, 0x08, 0xCF, 0x66, 0x8A, 0x51, 0x2D, 0x48, 0x03, 0x59, -0xCB, 0x6E, 0x2A, 0x08, 0xD7, 0xFE, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, -0x59, 0x7E, 0x84, 0x80, 0x2B, 0x48, 0x80, 0x40, 0x6F, 0x5C, 0x5C, 0x2E, 0x2A, 0x08, 0x5B, 0xBE, -0x84, 0x80, 0x00, 0x48, 0xD8, 0x7E, 0x61, 0xEE, 0x2A, 0x08, 0x5B, 0xBE, 0x84, 0x80, 0x00, 0x48, -0xEC, 0xBE, 0xAB, 0x40, 0x2A, 0x08, 0x55, 0x7E, 0x84, 0x80, 0x2B, 0x48, 0x80, 0x40, 0x2A, 0x08, -0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, 0x5B, 0xBE, 0x84, 0x80, 0x00, 0x48, -0xAC, 0x00, 0x2B, 0x48, 0x2C, 0x02, 0x2A, 0x08, 0x03, 0x18, 0x81, 0xAE, 0x59, 0x7E, 0x84, 0x80, -0x00, 0x48, 0xFF, 0x7E, 0xAB, 0x40, 0x2A, 0x08, 0x59, 0x7E, 0x84, 0x80, 0x2B, 0x48, 0x80, 0x40, -0x2A, 0x08, 0xA2, 0x3E, 0x84, 0x80, 0x83, 0xD7, 0x00, 0x48, 0xAB, 0x40, 0x2A, 0x08, 0x51, 0x3E, -0x84, 0x80, 0x2B, 0x48, 0x83, 0x93, 0x80, 0x40, 0x2A, 0x08, 0x59, 0x7E, 0x84, 0x80, 0x00, 0x48, -0xA1, 0xC0, 0x2A, 0x08, 0xA2, 0xC0, 0x01, 0xF0, 0xF0, 0x27, 0x8A, 0x51, 0x2A, 0x08, 0x55, 0x7E, -0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x2A, 0x08, 0xA2, 0xC0, 0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x51, -0x2A, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x2A, 0x08, 0xA2, 0xC0, 0x03, 0x30, -0xF0, 0x27, 0x8A, 0x51, 0xA1, 0x01, 0xA1, 0x4A, 0x2A, 0x08, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, -0x8A, 0x51, 0xE4, 0xB0, 0xAB, 0x40, 0xB4, 0x2E, 0xB5, 0x6E, 0xAB, 0x0B, 0xB3, 0x6E, 0xB8, 0x2E, -0x00, 0x00, 0x0F, 0xB0, 0x83, 0x52, 0x03, 0x53, 0xA1, 0xC0, 0x2A, 0x08, 0xA2, 0xC0, 0x00, 0xB0, -0xF0, 0x27, 0x8A, 0x51, 0xD0, 0x70, 0xAC, 0x00, 0xC9, 0xB0, 0xAB, 0x40, 0xAB, 0x0B, 0xC6, 0x2E, -0xAC, 0xCB, 0xC6, 0x2E, 0xCB, 0x6E, 0x83, 0x52, 0x03, 0x53, 0x2A, 0x08, 0xCE, 0x6D, 0xA6, 0x00, -0x59, 0x7E, 0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x01, 0xF0, -0xF0, 0x27, 0x8A, 0x51, 0x26, 0x08, 0x55, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, -0xA2, 0xC0, 0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x51, 0x26, 0x08, 0x51, 0x3E, 0x84, 0x80, 0x00, 0x48, -0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x03, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x26, 0x08, 0xD7, 0xFE, -0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x51, -0x26, 0x08, 0x5B, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x05, 0x30, -0xF0, 0x27, 0x8A, 0x51, 0x26, 0x08, 0xA2, 0x3E, 0x84, 0x80, 0x83, 0xD7, 0x00, 0x48, 0xA1, 0xC0, -0x26, 0x08, 0xA2, 0xC0, 0x06, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x6D, 0x88, 0xA4, 0xC0, 0x05, 0x30, -0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x11, 0xEF, 0x6C, 0xCD, 0x24, 0xC4, -0x69, 0x44, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x6A, 0x48, -0xA4, 0xC0, 0x05, 0x30, 0x03, 0xD0, 0xA4, 0x8D, 0xFF, 0x7E, 0x03, 0x9D, 0x22, 0xEF, 0x6B, 0x88, -0xA5, 0x00, 0x01, 0xF0, 0x03, 0xD0, 0xA5, 0xCD, 0xFF, 0x7E, 0x03, 0xD0, 0x03, 0x9D, 0x2B, 0x6F, -0x25, 0x8D, 0x24, 0xC4, 0x62, 0x04, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x0D, 0x70, 0xF0, 0x27, -0x8A, 0x51, 0x03, 0xD0, 0x63, 0xCD, 0x61, 0x04, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, 0x0E, 0x70, -0xF0, 0x27, 0x8A, 0x51, 0x5F, 0xC8, 0xA4, 0xC0, 0x03, 0xD0, 0xA4, 0x8D, 0x03, 0xD0, 0xA4, 0x8D, -0x03, 0xD0, 0xA4, 0x8D, 0x60, 0xC8, 0xA5, 0x00, 0x03, 0xD0, 0xA5, 0xCD, 0x03, 0xD0, 0xA5, 0xCD, -0x03, 0xD0, 0x68, 0x8D, 0x25, 0x04, 0x24, 0xC4, 0x64, 0x04, 0xA1, 0xC0, 0x26, 0x08, 0xA2, 0xC0, -0x10, 0xF0, 0xF0, 0x6F, 0xA4, 0x01, 0x24, 0xC8, 0xA4, 0x3E, 0x84, 0x80, 0x83, 0xD7, 0x00, 0x48, -0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x00, 0xB0, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0x57, 0xBE, -0x84, 0x80, 0x83, 0x93, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x01, 0xF0, 0xF0, 0x27, -0x8A, 0x51, 0x24, 0xC8, 0x53, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, -0x02, 0xF0, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0x4F, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, -0x24, 0xC8, 0xA2, 0xC0, 0x03, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0x5D, 0xBE, 0x84, 0x80, -0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x04, 0xF0, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, -0xD5, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x05, 0x30, 0xF0, 0x27, -0x8A, 0x51, 0x24, 0xC8, 0xD3, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, -0x06, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0xB0, 0x3E, 0x84, 0x80, 0x83, 0xD7, 0x00, 0x48, -0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x08, 0xF0, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0xAC, 0x7E, -0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0A, 0x30, 0xF0, 0x27, 0x8A, 0x51, -0x24, 0xC8, 0xAE, 0xBE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0B, 0x70, -0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0xA6, 0x7E, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, -0xA2, 0xC0, 0x0C, 0x30, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0xA8, 0x3E, 0x84, 0x80, 0x00, 0x48, -0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0D, 0x70, 0xF0, 0x27, 0x8A, 0x51, 0x24, 0xC8, 0xAA, 0x7E, -0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x0E, 0x70, 0xF0, 0x27, 0x8A, 0x51, -0x24, 0xC8, 0xA0, 0xFE, 0x84, 0x80, 0x00, 0x48, 0xA1, 0xC0, 0x24, 0xC8, 0xA2, 0xC0, 0x10, 0xF0, -0xF0, 0x27, 0x8A, 0x51, 0x02, 0xF0, 0xA4, 0x4A, 0x24, 0xC2, 0x03, 0x18, 0x08, 0x40, 0x5B, 0xAF, -0xA3, 0x00, 0x22, 0xC8, 0x03, 0x59, 0xFA, 0xEF, 0x21, 0xC8, 0x88, 0x80, 0x23, 0x08, 0x80, 0x38, -0x86, 0xC0, 0x08, 0x40, 0x21, 0xC8, 0x88, 0x80, 0x23, 0x08, 0x80, 0x38, 0x85, 0xC0, 0x08, 0x40, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF -}; diff --git a/util_tx_continuous/src/util_fw.var b/util_tx_continuous/src/util_fw.var deleted file mode 100644 index 5c8e7d2f..00000000 --- a/util_tx_continuous/src/util_fw.var +++ /dev/null @@ -1,530 +0,0 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2014 Semtech-Cycleo - -Description: - Util firmware - -License: Revised BSD License, see LICENSE.TXT file include in the project -Maintainer: Matthieu Leurent -*/ - -static uint8_t util_fw[8192] = { -0x8A, 0x51, 0xC9, 0x6F, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0x00, 0xB0, 0xA4, 0xC0, 0x01, 0xF0, 0xA5, 0x00, 0x83, 0x01, 0x8A, 0x51, 0xDF, 0x2F, -0x25, 0x08, 0xA2, 0xC0, 0x24, 0xC8, 0xA1, 0xC0, 0x22, 0xC8, 0x21, 0x06, 0x03, 0x59, 0xDD, 0xEF, -0x14, 0xC8, 0xA1, 0xC0, 0x14, 0xC8, 0xA2, 0xC0, 0xD4, 0x6F, 0x22, 0xC8, 0x08, 0x40, 0x95, 0x41, -0x96, 0x41, 0x97, 0x81, 0x98, 0x01, 0x99, 0x41, 0x9A, 0x41, 0x9B, 0x81, 0x9C, 0x41, 0x9E, 0x81, -0x8B, 0x41, 0x8A, 0x51, 0xD0, 0xE7, 0x8A, 0x51, 0xA3, 0x00, 0x23, 0x9C, 0xF3, 0xEF, 0x83, 0x52, -0x03, 0x53, 0x18, 0x14, 0xF6, 0xEF, 0x83, 0x52, 0x03, 0x53, 0x18, 0xD0, 0xA3, 0xDC, 0xFC, 0xEF, -0x83, 0x52, 0x03, 0x53, 0x18, 0x56, 0xE9, 0xAF, 0x83, 0x52, 0x03, 0x53, 0x18, 0x12, 0xE9, 0xAF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, -0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF, 0xFF, 0xBF -}; \ No newline at end of file diff --git a/util_tx_continuous/src/util_tx_continuous.c b/util_tx_continuous/src/util_tx_continuous.c index 6f69b4c4..d817f814 100644 --- a/util_tx_continuous/src/util_tx_continuous.c +++ b/util_tx_continuous/src/util_tx_continuous.c @@ -1,585 +1,445 @@ -/* - ______ _ - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - (C)2014 Semtech-Cycleo - -Description: - SX1301 tx continuous utility - -License: Revised BSD License, see LICENSE.TXT file include in the project -Maintainer: Matthieu Leurent -*/ - - -/* -------------------------------------------------------------------------- */ -/* --- DEPENDENCIES --------------------------------------------------------- */ - -/* Fix an issue between POSIX and C99 */ -#if __STDC_VERSION__ >= 199901L - #define _XOPEN_SOURCE 600 -#else - #define _XOPEN_SOURCE 500 -#endif - -#include /* C99 types */ -#include /* bool type */ -#include /* printf fprintf sprintf fopen fputs */ -#include /* memset */ -#include /* sigaction */ -#include /* getopt access */ -#include /* exit codes */ -#include /* getopt_long */ - -#include "loragw_hal.h" -#include "loragw_reg.h" -#include "loragw_aux.h" - -/* -------------------------------------------------------------------------- */ -/* --- MACROS & CONSTANTS --------------------------------------------------- */ - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -#define SX125x_VERSION 0x21 -#define SX125x_32MHz_FRAC 15625 /* irreductible fraction for PLL register caculation */ -#define SX125x_TX_DAC_CLK_SEL 1 /* 0:int, 1:ext */ -#define SX125x_TX_DAC_GAIN 2 /* 3:0, 2:-3, 1:-6, 0:-9 dBFS (default 2) */ -#define SX125x_TX_MIX_GAIN 14 /* -38 + 2*TxMixGain dB (default 14) */ -#define SX125x_TX_PLL_BW 3 /* 0:75, 1:150, 2:225, 3:300 kHz (default 3) */ -#define SX125x_TX_ANA_BW 0 /* 17.5 / 2*(41-TxAnaBw) MHz (default 0) */ -#define SX125x_TX_DAC_BW 5 /* 24 + 8*TxDacBw Nb FIR taps (default 2) */ -#define SX125x_XOSC_GM_STARTUP 13 /* (default 13) */ -#define SX125x_XOSC_DISABLE 2 /* Disable of Xtal Oscillator blocks bit0:regulator, bit1:core(gm), bit2:amplifier */ - -#define DEFAULT_FREQ_HZ 868e6 -#define DEFAULT_RADIO 0 -#define DEFAULT_DIGITAL_GAIN 0 -#define DEFAULT_DAC_GAIN 3 -#define DEFAULT_MIXER_GAIN 14 -#define DEFAULT_PA_VOLTAGE 1.5 -#define DEFAULT_MODULATION "LORA" -#define DEFAULT_SF 7 -#define DEFAULT_BW_KHZ 125 -#define DEFAULT_BR_KBPS 50 -#define DEFAULT_FDEV_KHZ 25 -#define DEFAULT_BT 2 - -/* -------------------------------------------------------------------------- */ -/* --- GLOBAL VARIABLES ----------------------------------------------------- */ - -/* Signal handling variables */ -static int exit_sig = 0; /* 1 -> application terminates cleanly (shut down hardware, close open files, etc) */ -static int quit_sig = 0; /* 1 -> application terminates without shutting down the hardware */ - -#include "cal_tx_fw.var" -#include "util_fw.var" - -/* -------------------------------------------------------------------------- */ -/* --- SUBFUNCTIONS DECLARATION --------------------------------------------- */ - -static void sig_handler(int sigio); - -void sx125x_write(uint8_t channel, uint8_t addr, uint8_t data); /* defined in loragw_hal.c */ - -uint8_t sx125x_read(uint8_t channel, uint8_t addr); /* defined in loragw_hal.c */ - -int load_firmware(uint8_t target, uint8_t *firmware, uint16_t size); /* defined in loragw_hal.c */ - -/* -------------------------------------------------------------------------- */ -/* --- MAIN FUNCTION -------------------------------------------------------- */ - -int main(int argc, char **argv) -{ - static struct sigaction sigact; /* SIGQUIT&SIGINT&SIGTERM signal handling */ - - int i; /* loop and temporary variables */ - int x; /* return code for HAL functions */ - - /* Parameter parsing */ - int option_index = 0; - static struct option long_options[] = { - {"dig", 1, 0, 0}, - {"dac", 1, 0, 0}, - {"mix", 1, 0, 0}, - {"pa", 1, 0, 0}, - {"mod", 1, 0, 0}, - {"sf", 1, 0, 0}, - {"bw", 1, 0, 0}, - {"br", 1, 0, 0}, - {"fdev", 1, 0, 0}, - {"bt", 1, 0, 0}, - {0, 0, 0, 0} - }; - unsigned int arg_u; - float arg_f; - char arg_s[64]; - - /* Application parameters */ - uint32_t freq_hz = DEFAULT_FREQ_HZ; - bool radio_select = DEFAULT_RADIO; - uint8_t g_dig = DEFAULT_DIGITAL_GAIN; - uint8_t g_dac = DEFAULT_DAC_GAIN; - uint8_t g_mix = DEFAULT_MIXER_GAIN; - uint8_t g_pa = DEFAULT_PA_VOLTAGE; - char mod[64] = DEFAULT_MODULATION; - uint8_t sf = DEFAULT_SF; - unsigned int bw_khz = DEFAULT_BW_KHZ; - float br_kbps = DEFAULT_BR_KBPS; - uint8_t fdev_khz = DEFAULT_FDEV_KHZ; - uint8_t bt = DEFAULT_BT; - - uint8_t buff[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - uint32_t part_int; /* integer part for PLL register value calculation */ - uint32_t part_frac; /* fractional part for PLL register value calculation */ - uint16_t br; - int32_t offset_i, offset_q; - bool is_sx1255; - int32_t cal_status, cal_status_expected; - int32_t tx_status; - - /* Parse command line options */ - while( (i = getopt_long (argc, argv, "hud::f:r:", long_options, &option_index)) != -1 ) - { - switch( i ) - { - case 'h': - printf( "~~~ Library version string~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" ); - printf( " %s\n", lgw_version_info( ) ); - printf( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" ); - printf( " -f Tx RF frequency in MHz [800:1000]\n"); - printf( " -r Radio select, 0:A 1:B\n"); - printf( " --dig Digital gain trim, [0:3]\n" ); - printf( " 0:1, 1:7/8, 2:3/4, 3:1/2\n" ); - printf( " --mix SX1257 Tx mixer gain trim, [0:15]\n" ); - printf( " 15 corresponds to maximum gain, 1 LSB corresponds to 2dB step\n" ); - printf( " --pa PA gain trim, [0:3]\n" ); - printf( " --mod Modulation type ['LORA','FSK','CW']\n" ); - printf( " --sf LoRa Spreading Factor, [7:12]\n" ); - printf( " --bw LoRa bandwidth in kHz, [125,250,500]\n" ); - printf( " --br FSK bitrate in kbps, [0.5:250]\n" ); - printf( " --fdev FSK frequency deviation in kHz, [1:250]\n" ); - printf( " --bt FSK gaussian filter BT trim, [0:3]\n" ); - printf( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" ); - return EXIT_SUCCESS; - break; - - case 0: - if( strcmp(long_options[option_index].name,"dig") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u > 3) ) - { - printf( "ERROR: argument parsing of --dig argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - g_dig = (uint8_t)arg_u; - } - } - else if( strcmp(long_options[option_index].name,"dac") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u > 3) ) - { - printf( "ERROR: argument parsing of --dac argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - g_dac = (uint8_t)arg_u; - } - } - else if( strcmp(long_options[option_index].name,"mix") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u > 15) ) - { - printf( "ERROR: argument parsing of --mix argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - g_mix = (uint8_t)arg_u; - } - } - else if( strcmp(long_options[option_index].name,"pa") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u > 3) ) - { - printf( "ERROR: argument parsing of --pa argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - g_pa = arg_u; - } - } - else if( strcmp(long_options[option_index].name,"mod") == 0 ) - { - i = sscanf(optarg, "%s", arg_s); - if( (i != 1) || ((strcmp(arg_s,"LORA") != 0) && (strcmp(arg_s,"FSK") != 0) && (strcmp(arg_s,"CW") != 0)) ) - { - printf( "ERROR: argument parsing of --mod argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - sprintf(mod, "%s", arg_s); - } - } - else if( strcmp(long_options[option_index].name,"sf") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u < 7) || (arg_u > 12) ) - { - printf( "ERROR: argument parsing of --sf argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - sf = (uint8_t)arg_u; - } - } - else if( strcmp(long_options[option_index].name,"bw") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || ((arg_u != 125) && (arg_u != 250) && (arg_u != 500)) ) - { - printf( "ERROR: argument parsing of --bw argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - bw_khz = arg_u; - } - } - else if( strcmp(long_options[option_index].name,"br") == 0 ) - { - i = sscanf(optarg, "%f", &arg_f); - if( (i != 1) || (arg_f < 0.5) || (arg_f > 250) ) - { - printf( "ERROR: argument parsing of --br argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - br_kbps = arg_f; - } - } - else if( strcmp(long_options[option_index].name,"fdev") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u < 1) || (arg_u > 250) ) - { - printf( "ERROR: argument parsing of --fdev argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - fdev_khz = (uint8_t)arg_u; - } - } - else if( strcmp(long_options[option_index].name,"bt") == 0 ) - { - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u > 3) ) - { - printf( "ERROR: argument parsing of --bt argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - bt = (uint8_t)arg_u; - } - } - else { - printf( "ERROR: argument parsing options. Use -h to print help\n" ); - return EXIT_FAILURE; - } - break; - - case 'f': - i = sscanf(optarg, "%f", &arg_f); - if( (i != 1) || (arg_f < 1) ) - { - printf( "ERROR: argument parsing of -f argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - freq_hz = (uint32_t)((arg_f * 1e6) + 0.5); - } - break; - - case 'r': - i = sscanf(optarg, "%u", &arg_u); - if( (i != 1) || (arg_u > 1) ) - { - printf( "ERROR: argument parsing of -r argument. Use -h to print help\n" ); - return EXIT_FAILURE; - } - else - { - radio_select = (bool)arg_u; - } - break; - - default: - printf( "ERROR: argument parsing options. Use -h to print help\n" ); - return EXIT_FAILURE; - } - } - - /* Configure signal handling */ - sigemptyset( &sigact.sa_mask ); - sigact.sa_flags = 0; - sigact.sa_handler = sig_handler; - sigaction( SIGQUIT, &sigact, NULL ); - sigaction( SIGINT, &sigact, NULL ); - sigaction( SIGTERM, &sigact, NULL ); - - /* Decide if it is SX1257 or 55 depending on required freq*/ - if (freq_hz > 700e6) { - is_sx1255 = false; - } else { - is_sx1255 = true; - } - - /* Connect to concentrator */ - x = lgw_connect(); - if (x == LGW_REG_ERROR) { - printf("ERROR: FAIL TO CONNECT BOARD\n"); - return LGW_HAL_ERROR; - } - - /* reset the registers (also shuts the radios down) */ - lgw_soft_reset(); - wait_ms(100); - - /* switch on and reset the radios (also starts the 32 MHz XTAL) */ - lgw_reg_w(LGW_RADIO_A_EN,1); - lgw_reg_w(LGW_RADIO_B_EN,1); - wait_ms(500); - lgw_reg_w(LGW_RADIO_RST,1); - wait_ms(1); - lgw_reg_w(LGW_RADIO_RST,0); - - /* ~~~~~~ Setup SX1257 ~~~~~~ */ - - /* Check version */ - if( sx125x_read(radio_select, 0x07) != SX125x_VERSION ) - { - printf( "ERROR: Bad SX1257 version\n" ); - return EXIT_FAILURE; - } - - sx125x_write(0, 0x10, SX125x_TX_DAC_CLK_SEL + 2); - sx125x_write(1, 0x10, SX125x_TX_DAC_CLK_SEL + 2); - if (is_sx1255) { - sx125x_write(0, 0x28, SX125x_XOSC_GM_STARTUP + SX125x_XOSC_DISABLE*16); - sx125x_write(1, 0x28, SX125x_XOSC_GM_STARTUP + SX125x_XOSC_DISABLE*16); - } - else { - sx125x_write(0, 0x26, SX125x_XOSC_GM_STARTUP + SX125x_XOSC_DISABLE*16); - sx125x_write(1, 0x26, SX125x_XOSC_GM_STARTUP + SX125x_XOSC_DISABLE*16); - } - - /* Tx gain and BW */ - sx125x_write( radio_select, 0x08, g_mix + g_dac*16); - if( bw_khz > 250 ) - { - sx125x_write( radio_select, 0x0A, 12 + SX125x_TX_PLL_BW*32 ); /* ANA FILT BW */ - sx125x_write( radio_select, 0x0B, 4 ); /* DIG FILT BW */ - } - else - { - sx125x_write( radio_select, 0x0A, 0 + SX125x_TX_PLL_BW*32 ); /* ANA FILT BW */ - sx125x_write( radio_select, 0x0B, 5 ); /* DIG FILT BW */ - } - - /* set TX PLL frequency */ - if (is_sx1255) { - part_int = freq_hz / (SX125x_32MHz_FRAC << 7); /* integer part, gives the MSB */ - part_frac = ((freq_hz % (SX125x_32MHz_FRAC << 7)) << 9) / SX125x_32MHz_FRAC; /* fractional part, gives middle part and LSB */ - } else { - part_int = freq_hz / (SX125x_32MHz_FRAC << 8); /* integer part, gives the MSB */ - part_frac = ((freq_hz % (SX125x_32MHz_FRAC << 8)) << 8) / SX125x_32MHz_FRAC; /* fractional part, gives middle part and LSB */ - } - sx125x_write(radio_select, 0x04,0xFF & part_int); /* Most Significant Byte */ - sx125x_write(radio_select, 0x05,0xFF & (part_frac >> 8)); /* middle byte */ - sx125x_write(radio_select, 0x06,0xFF & part_frac); /* Least Significant Byte */ - - /* Lock PLL and enable Tx */ - sx125x_write(radio_select, 0x00, 1); - wait_ms(1); - sx125x_write(radio_select, 0x00, 13); - wait_ms(10); - if ((sx125x_read(radio_select, 0x11) & 0x01) == 0) { - printf("ERROR: SX125x Tx PLL did not lock\n"); - return -1; - } - - /* ~~~~~~~~~~~~~~~~~~ */ - - /* Minimum SX1301 setup */ - lgw_reg_w(LGW_GLOBAL_EN, 1); - lgw_reg_w(LGW_TX_GAIN, g_dig); - lgw_reg_w(LGW_PA_GAIN, g_pa); - lgw_reg_w(LGW_TX_MODE, 1); // Tx continuous - lgw_reg_w(LGW_FSK_TX_GAUSSIAN_SELECT_BT, bt); - lgw_reg_w(LGW_GPIO_MODE,24); /* Set GPIO 3 and 4 in output to control potential Tx filter FPGA */ - lgw_reg_w(LGW_GPIO_SELECT_OUTPUT,8); /* Control GPIO with register */ - lgw_reg_w(LGW_GPIO_PIN_REG_OUT,16); /* Enable Tx */ - - if( strcmp( mod, "CW" ) == 0 ) - { - /* Enable signal generator with DC */ - lgw_reg_w( LGW_SIG_GEN_FREQ, 0 ); - lgw_reg_w( LGW_SIG_GEN_EN, 1 ); - } - else - { - /* Tx DC offset calibration */ - x = load_firmware( 1, cal_tx_fw, 8192 ); /* Load firmware */ - lgw_reg_w(LGW_RADIO_SELECT, (is_sx1255 << 5) | ((radio_select+1) << 2) ); /* Configure calibration */ - lgw_reg_w(LGW_FORCE_HOST_RADIO_CTRL, 0); /* Give to MCU control of radio */ - lgw_reg_w(LGW_MCU_RST_1, 0); - lgw_reg_w(LGW_PAGE_REG, 3); /* Calibration start condition */ - lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL, 0); /* Give to MCU control of registers */ - wait_ms(300); /* Wait enough until cal is done */ - lgw_reg_w(LGW_EMERGENCY_FORCE_HOST_CTRL, 1); /* Get back control of registers */ - - /* Get calibration results */ - lgw_reg_r( LGW_MCU_AGC_STATUS, &cal_status ); - cal_status_expected = (1<<7) | ((radio_select+1)<<5) | (1<<2) | (1<<1) | 1; - if (cal_status != cal_status_expected) - { - lgw_reg_w( LGW_TX_OFFSET_I, 0 ); - lgw_reg_w( LGW_TX_OFFSET_Q, 0 ); - printf("WARNING: Tx DC Calibration failed\n"); - } - - /* TX metadata buffer */ - if( strcmp( mod, "LORA" ) == 0 ) - { - buff[9] = sf; - switch( bw_khz ) - { - case 125: buff[11] = 0; break; - case 250: buff[11] = 1; break; - case 500: buff[11] = 2; break; - } - buff[11] |= 0x04; /* set 'implicit header' bit */ - } - else if( strcmp( mod, "FSK" ) == 0 ) - { - br = (uint16_t)(32e3 / br_kbps); - buff[7] = 1 << 4; - buff[9] = fdev_khz; /* FSK frequency deviation */ - buff[14] = 0xFF & (br >> 8); /* FSK bitrate */ - buff[15] = 0xFF & br; - } - buff[10] = 1; /* payload size */ - buff[12] = 0xFF & (65535 >> 8); /* preamble length */ - buff[13] = 0xFF & 65535; - - /* Write metadata into buffer */ - lgw_reg_w( LGW_TX_DATA_BUF_ADDR, 0 ); - lgw_reg_wb( LGW_TX_DATA_BUF_DATA, buff, 16 ); - - /* Trig Tx and check modulation is running */ - lgw_reg_w( LGW_TX_TRIG_IMMEDIATE, 1 ); - wait_ms(5); - lgw_reg_r( LGW_TX_STATUS, &tx_status ); - if( tx_status != 80 ) - { - printf( "ERROR: modulation not running\n" ); - return EXIT_FAILURE; - } - } - - /* Load firmware to select radio */ - x = load_firmware( 1, util_fw, 8192 ); - lgw_reg_w(LGW_MCU_RST_1, 0); - lgw_reg_w(LGW_RADIO_SELECT, radio_select); - - /* Set RF switch in Tx */ - if( radio_select ) - { - lgw_reg_w(LGW_PA_B_EN,1); - } else - { - lgw_reg_w(LGW_PA_A_EN,1); - } - - /* Enable Tx and Tx narrowband filter for LORA 125kHz BW */ - if( ( strcmp( mod, "LORA" ) == 0 ) && ( bw_khz == 125 ) ) - { - lgw_reg_w(LGW_GPIO_PIN_REG_OUT,24); - } - - /* Recap all settings */ - printf( "SX1301 library version: %s\n", lgw_version_info( ) ); - if( strcmp( mod, "LORA" ) == 0 ) - { - printf( "Modulation: LORA SF:%d BW:%d kHz\n", sf, bw_khz ); - } - else if( strcmp( mod, "FSK" ) == 0 ) - { - printf( "Modulation: FSK BR:%3.3f kbps FDEV:%d kHz BT:%d\n", br_kbps, fdev_khz, bt ); - } - else if( strcmp( mod, "CW" ) == 0 ) - { - printf( "Modulation: CW\n" ); - } - if( radio_select ) - { - printf("Radio: B\n"); - } - else - { - printf("Radio: A\n"); - } - printf( "Frequency: %4.3f MHz\n", freq_hz/1e6 ); - printf( "Expected chip: SX125%d\n", 7-is_sx1255*2 ); - printf( "Gains: Digital:%d DAC:%d Mixer:%d PA:%d\n", g_dig, g_dac, g_mix, g_pa ); - if( strcmp( mod, "CW" ) != 0 ) - { - lgw_reg_r( LGW_TX_OFFSET_I, &offset_i ); - lgw_reg_r( LGW_TX_OFFSET_Q, &offset_q ); - printf( "Calibrated DC offsets: I:%d Q:%d\n", offset_i, offset_q ); - } - - /* waiting for user input */ - while ((quit_sig != 1) && (exit_sig != 1)) - { - wait_ms(100); - } - - /* clean up before leaving */ - lgw_stop(); - - return 0; -} - -/* -------------------------------------------------------------------------- */ -/* --- SUBFUNCTIONS DEFINITION ---------------------------------------------- */ - -static void sig_handler( int sigio ) -{ - if( sigio == SIGQUIT ) - { - quit_sig = 1; - } - else if( (sigio == SIGINT) || (sigio == SIGTERM) ) - { - exit_sig = 1; - } -} - -/* --- EOF ------------------------------------------------------------------ */ +/* + ______ _ + / _____) _ | | +( (____ _____ ____ _| |_ _____ ____| |__ + \____ \| ___ | (_ _) ___ |/ ___) _ \ + _____) ) ____| | | || |_| ____( (___| | | | +(______/|_____)_|_|_| \__)_____)\____)_| |_| + (C)2014 Semtech-Cycleo + +Description: + SX1301 tx continuous utility + +License: Revised BSD License, see LICENSE.TXT file include in the project +Maintainer: Matthieu Leurent +*/ + + +/* -------------------------------------------------------------------------- */ +/* --- DEPENDENCIES --------------------------------------------------------- */ + +/* Fix an issue between POSIX and C99 */ +#if __STDC_VERSION__ >= 199901L + #define _XOPEN_SOURCE 600 +#else + #define _XOPEN_SOURCE 500 +#endif + +#include /* C99 types */ +#include /* bool type */ +#include /* printf fprintf sprintf fopen fputs */ +#include /* memset */ +#include /* sigaction */ +#include /* getopt access */ +#include /* exit codes */ +#include /* getopt_long */ + +#include "loragw_hal.h" +#include "loragw_reg.h" +#include "loragw_aux.h" + +/* -------------------------------------------------------------------------- */ +/* --- MACROS & CONSTANTS --------------------------------------------------- */ + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#define MSG(args...) fprintf(stderr, args) /* message that is destined to the user */ + +#define TX_RF_CHAIN 0 /* TX only supported on radio A */ +#define DEFAULT_RSSI_OFFSET 0.0 + +#define DEFAULT_FREQ_HZ 868e6 +#define DEFAULT_DIGITAL_GAIN 0 +#define DEFAULT_DAC_GAIN 3 +#define DEFAULT_MIXER_GAIN 14 +#define DEFAULT_PA_GAIN 3 +#define DEFAULT_MODULATION "LORA" +#define DEFAULT_SF 7 +#define DEFAULT_BW_KHZ 125 +#define DEFAULT_BR_KBPS 50 +#define DEFAULT_FDEV_KHZ 25 +#define DEFAULT_BT 2 + +/* -------------------------------------------------------------------------- */ +/* --- GLOBAL VARIABLES ----------------------------------------------------- */ + +/* Signal handling variables */ +static int exit_sig = 0; /* 1 -> application terminates cleanly (shut down hardware, close open files, etc) */ +static int quit_sig = 0; /* 1 -> application terminates without shutting down the hardware */ + +/* -------------------------------------------------------------------------- */ +/* --- SUBFUNCTIONS DECLARATION --------------------------------------------- */ + +static void sig_handler(int sigio); + +void sx125x_write(uint8_t channel, uint8_t addr, uint8_t data); /* defined in loragw_hal.c */ + +uint8_t sx125x_read(uint8_t channel, uint8_t addr); /* defined in loragw_hal.c */ + +int load_firmware(uint8_t target, uint8_t *firmware, uint16_t size); /* defined in loragw_hal.c */ + +/* -------------------------------------------------------------------------- */ +/* --- MAIN FUNCTION -------------------------------------------------------- */ + +int main(int argc, char **argv) +{ + static struct sigaction sigact; /* SIGQUIT&SIGINT&SIGTERM signal handling */ + + int i; /* loop and temporary variables */ + + /* Parameter parsing */ + int option_index = 0; + static struct option long_options[] = { + {"dig", 1, 0, 0}, + {"dac", 1, 0, 0}, + {"mix", 1, 0, 0}, + {"pa", 1, 0, 0}, + {"mod", 1, 0, 0}, + {"sf", 1, 0, 0}, + {"bw", 1, 0, 0}, + {"br", 1, 0, 0}, + {"fdev", 1, 0, 0}, + {"bt", 1, 0, 0}, + {0, 0, 0, 0} + }; + unsigned int arg_u; + float arg_f; + char arg_s[64]; + + /* Application parameters */ + uint32_t freq_hz = DEFAULT_FREQ_HZ; + uint8_t g_dig = DEFAULT_DIGITAL_GAIN; + uint8_t g_dac = DEFAULT_DAC_GAIN; + uint8_t g_mix = DEFAULT_MIXER_GAIN; + uint8_t g_pa = DEFAULT_PA_GAIN; + char mod[64] = DEFAULT_MODULATION; + uint8_t sf = DEFAULT_SF; + unsigned int bw_khz = DEFAULT_BW_KHZ; + float br_kbps = DEFAULT_BR_KBPS; + uint8_t fdev_khz = DEFAULT_FDEV_KHZ; + uint8_t bt = DEFAULT_BT; + + int32_t offset_i, offset_q; + + /* RF configuration (TX fail if RF chain is not enabled) */ + enum lgw_radio_type_e radio_type = LGW_RADIO_TYPE_SX1257; + struct lgw_conf_board_s boardconf; + struct lgw_conf_rxrf_s rfconf; + struct lgw_tx_gain_lut_s txlut; + struct lgw_pkt_tx_s txpkt; + + + /* Parse command line options */ + while ((i = getopt_long (argc, argv, "hud::f:r:", long_options, &option_index)) != -1) { + switch (i) { + case 'h': + printf("~~~ Library version string~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); + printf(" %s\n", lgw_version_info()); + printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); + printf(" -f Tx RF frequency in MHz [800:1000]\n"); + printf(" -r Radio type (SX1255:1255, SX1257:1257)\n"); + printf(" --dig Digital gain trim, [0:3]\n"); + printf(" 0:1, 1:7/8, 2:3/4, 3:1/2\n"); + printf(" --mix Radio Tx mixer gain trim, [0:15]\n"); + printf(" 15 corresponds to maximum gain, 1 LSB corresponds to 2dB step\n"); + printf(" --pa PA gain trim, [0:3]\n"); + printf(" --mod Modulation type ['LORA','FSK','CW']\n"); + printf(" --sf LoRa Spreading Factor, [7:12]\n"); + printf(" --bw LoRa bandwidth in kHz, [125,250,500]\n"); + printf(" --br FSK bitrate in kbps, [0.5:250]\n"); + printf(" --fdev FSK frequency deviation in kHz, [1:250]\n"); + printf(" --bt FSK gaussian filter BT trim, [0:3]\n"); + printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); + return EXIT_SUCCESS; + break; + + case 0: + if (strcmp(long_options[option_index].name,"dig") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u > 3)) { + printf("ERROR: argument parsing of --dig argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else + { + g_dig = (uint8_t)arg_u; + } + } + else if (strcmp(long_options[option_index].name,"dac") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u > 3)) { + printf("ERROR: argument parsing of --dac argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + g_dac = (uint8_t)arg_u; + } + } + else if (strcmp(long_options[option_index].name,"mix") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u > 15)) { + printf("ERROR: argument parsing of --mix argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + g_mix = (uint8_t)arg_u; + } + } + else if (strcmp(long_options[option_index].name,"pa") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u > 3)) { + printf("ERROR: argument parsing of --pa argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + g_pa = arg_u; + } + } + else if (strcmp(long_options[option_index].name,"mod") == 0) { + i = sscanf(optarg, "%s", arg_s); + if ((i != 1) || ((strcmp(arg_s,"LORA") != 0) && (strcmp(arg_s,"FSK") != 0) && (strcmp(arg_s,"CW") != 0))) { + printf("ERROR: argument parsing of --mod argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + sprintf(mod, "%s", arg_s); + } + } + else if (strcmp(long_options[option_index].name,"sf") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u < 7) || (arg_u > 12)) { + printf("ERROR: argument parsing of --sf argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + sf = (uint8_t)arg_u; + } + } + else if (strcmp(long_options[option_index].name,"bw") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || ((arg_u != 125) && (arg_u != 250) && (arg_u != 500))) { + printf("ERROR: argument parsing of --bw argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + bw_khz = arg_u; + } + } + else if (strcmp(long_options[option_index].name,"br") == 0) { + i = sscanf(optarg, "%f", &arg_f); + if ((i != 1) || (arg_f < 0.5) || (arg_f > 250)) { + printf("ERROR: argument parsing of --br argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + br_kbps = arg_f; + } + } + else if (strcmp(long_options[option_index].name,"fdev") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u < 1) || (arg_u > 250)) { + printf("ERROR: argument parsing of --fdev argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + fdev_khz = (uint8_t)arg_u; + } + } + else if (strcmp(long_options[option_index].name,"bt") == 0) { + i = sscanf(optarg, "%u", &arg_u); + if ((i != 1) || (arg_u > 3)) { + printf("ERROR: argument parsing of --bt argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + bt = (uint8_t)arg_u; + } + } + else { + printf("ERROR: argument parsing options. Use -h to print help\n"); + return EXIT_FAILURE; + } + break; + + case 'f': + i = sscanf(optarg, "%f", &arg_f); + if ((i != 1) || (arg_f < 1)) { + printf("ERROR: argument parsing of -f argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + else { + freq_hz = (uint32_t)((arg_f * 1e6) + 0.5); + } + break; + + case 'r': + i = sscanf(optarg, "%u", &arg_u); + switch (arg_u) { + case 1255: + radio_type = LGW_RADIO_TYPE_SX1255; + break; + case 1257: + radio_type = LGW_RADIO_TYPE_SX1257; + break; + default: + printf("ERROR: argument parsing of -r argument. Use -h to print help\n"); + return EXIT_FAILURE; + } + break; + + default: + printf("ERROR: argument parsing options. Use -h to print help\n"); + return EXIT_FAILURE; + } + } + + /* Configure signal handling */ + sigemptyset( &sigact.sa_mask ); + sigact.sa_flags = 0; + sigact.sa_handler = sig_handler; + sigaction( SIGQUIT, &sigact, NULL ); + sigaction( SIGINT, &sigact, NULL ); + sigaction( SIGTERM, &sigact, NULL ); + + /* Board config */ + memset(&boardconf, 0, sizeof(boardconf)); + boardconf.lorawan_public = true; + boardconf.clksrc = 1; /* Radio B is source by default */ + lgw_board_setconf(boardconf); + + /* RF config */ + memset(&rfconf, 0, sizeof(rfconf)); + rfconf.enable = true; + rfconf.freq_hz = freq_hz; + rfconf.rssi_offset = DEFAULT_RSSI_OFFSET; + rfconf.type = radio_type; + rfconf.tx_enable = true; + lgw_rxrf_setconf(TX_RF_CHAIN, rfconf); + + /* Tx gain LUT */ + memset(&txlut, 0, sizeof txlut); + txlut.size = 1; + txlut.lut[0].dig_gain = g_dig; + txlut.lut[0].pa_gain = g_pa; + txlut.lut[0].dac_gain = g_dac; + txlut.lut[0].mix_gain = g_mix; + txlut.lut[0].rf_power = 0; + lgw_txgain_setconf(&txlut); + + /* Start the concentrator */ + i = lgw_start(); + if (i == LGW_HAL_SUCCESS) { + MSG("INFO: concentrator started, packet can be sent\n"); + } else { + MSG("ERROR: failed to start the concentrator\n"); + return EXIT_FAILURE; + } + + /* fill-up payload and parameters */ + memset(&txpkt, 0, sizeof(txpkt)); + txpkt.freq_hz = freq_hz; + txpkt.tx_mode = IMMEDIATE; + txpkt.rf_chain = TX_RF_CHAIN; + txpkt.rf_power = 0; + if (strcmp(mod, "FSK") == 0) { + txpkt.modulation = MOD_FSK; + txpkt.datarate = br_kbps * 1e3; + } else { + txpkt.modulation = MOD_LORA; + switch (bw_khz) { + case 125: txpkt.bandwidth = BW_125KHZ; break; + case 250: txpkt.bandwidth = BW_250KHZ; break; + case 500: txpkt.bandwidth = BW_500KHZ; break; + default: + MSG("ERROR: invalid 'bw' variable\n"); + return EXIT_FAILURE; + } + switch (sf) { + case 7: txpkt.datarate = DR_LORA_SF7; break; + case 8: txpkt.datarate = DR_LORA_SF8; break; + case 9: txpkt.datarate = DR_LORA_SF9; break; + case 10: txpkt.datarate = DR_LORA_SF10; break; + case 11: txpkt.datarate = DR_LORA_SF11; break; + case 12: txpkt.datarate = DR_LORA_SF12; break; + default: + MSG("ERROR: invalid 'sf' variable\n"); + return EXIT_FAILURE; + } + } + txpkt.coderate = CR_LORA_4_5; + txpkt.f_dev = fdev_khz; + txpkt.preamble = 65535; + txpkt.invert_pol = false; + txpkt.no_crc = true; + txpkt.no_header = true; + txpkt.size = 1; + txpkt.payload[0] = 0; + + /* Overwrite settings */ + lgw_reg_w(LGW_TX_MODE, 1); /* Tx continuous */ + lgw_reg_w(LGW_FSK_TX_GAUSSIAN_SELECT_BT, bt); + if (strcmp(mod, "CW") == 0) { + /* Enable signal generator with DC */ + lgw_reg_w(LGW_SIG_GEN_FREQ, 0); + lgw_reg_w(LGW_SIG_GEN_EN, 1); + lgw_reg_w(LGW_TX_OFFSET_I, 0); + lgw_reg_w(LGW_TX_OFFSET_Q, 0); + } + + /* Send packet */ + i = lgw_send(txpkt); + + /* Recap all settings */ + printf("SX1301 library version: %s\n", lgw_version_info()); + if (strcmp(mod, "LORA") == 0) { + printf("Modulation: LORA SF:%d BW:%d kHz\n", sf, bw_khz); + } + else if (strcmp(mod, "FSK") == 0) { + printf("Modulation: FSK BR:%3.3f kbps FDEV:%d kHz BT:%d\n", br_kbps, fdev_khz, bt); + } + else if (strcmp(mod, "CW") == 0) { + printf("Modulation: CW\n"); + } + switch(rfconf.type) { + case LGW_RADIO_TYPE_SX1255: + printf("Radio Type: SX1255\n"); + break; + case LGW_RADIO_TYPE_SX1257: + printf("Radio Type: SX1257\n"); + break; + default: + printf("ERROR: undefined radio type\n"); + break; + } + printf("Frequency: %4.3f MHz\n", freq_hz/1e6); + printf("TX Gains: Digital:%d DAC:%d Mixer:%d PA:%d\n", g_dig, g_dac, g_mix, g_pa); + if (strcmp(mod, "CW") != 0) { + lgw_reg_r(LGW_TX_OFFSET_I, &offset_i); + lgw_reg_r(LGW_TX_OFFSET_Q, &offset_q); + printf("Calibrated DC offsets: I:%d Q:%d\n", offset_i, offset_q); + } + + /* waiting for user input */ + while ((quit_sig != 1) && (exit_sig != 1)) { + wait_ms(100); + } + + /* clean up before leaving */ + lgw_stop(); + + return 0; +} + +/* -------------------------------------------------------------------------- */ +/* --- SUBFUNCTIONS DEFINITION ---------------------------------------------- */ + +static void sig_handler(int sigio) +{ + if (sigio == SIGQUIT) { + quit_sig = 1; + } + else if((sigio == SIGINT) || (sigio == SIGTERM)) { + exit_sig = 1; + } +} + +/* --- EOF ------------------------------------------------------------------ */ diff --git a/util_tx_test/Makefile b/util_tx_test/Makefile index d609dbe8..7c374f06 100644 --- a/util_tx_test/Makefile +++ b/util_tx_test/Makefile @@ -20,6 +20,8 @@ AR := $(CROSS_COMPILE)ar CFLAGS=-O2 -Wall -Wextra -std=c99 -Iinc -I. +OBJDIR = obj + ### Constants for LoRa concentrator HAL library # List the library sub-modules that are used by the application @@ -36,7 +38,7 @@ LIBS := -lloragw -lrt all: $(APP_NAME) clean: - rm -f obj/*.o + rm -f $(OBJDIR)/*.o rm -f $(APP_NAME) ### HAL library (do no force multiple library rebuild even with 'make -B') @@ -53,10 +55,13 @@ $(LGW_PATH)/libloragw.a: $(LGW_INC) ### Main program compilation and assembly -obj/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) +$(OBJDIR): + mkdir -p $(OBJDIR) + +$(OBJDIR)/$(APP_NAME).o: src/$(APP_NAME).c $(LGW_INC) | $(OBJDIR) $(CC) -c $(CFLAGS) -I$(LGW_PATH)/inc $< -o $@ -$(APP_NAME): obj/$(APP_NAME).o $(LGW_PATH)/libloragw.a +$(APP_NAME): $(OBJDIR)/$(APP_NAME).o $(LGW_PATH)/libloragw.a $(CC) -L$(LGW_PATH) $< -o $@ $(LIBS) ### EOF diff --git a/util_tx_test/obj/.gitkeep b/util_tx_test/obj/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/util_tx_test/readme.md b/util_tx_test/readme.md index 9fb7b220..c46badf8 100644 --- a/util_tx_test/readme.md +++ b/util_tx_test/readme.md @@ -29,44 +29,13 @@ Data structures of the sent packets are accessed by name (ie. not at a binary level) so new functionalities can be added to the API without affecting that program at all. -It was tested with v1.3.0 of the libloragw library, and should be compatible -with any later version of the library assuming the API is downward-compatible. - 3. Usage --------- The application runs until the specified number of packets have been sent. Press Ctrl+C to stop the application before that. -Use the -f option followed by a real number (decimal point and scientific -'E notation' are OK) to specify the modulation central frequency. - -Use the -b option to set LoRa modulation bandwidth in kHz (accepted values: 125, -250 or 500). - -Use the -s option to specify the Spreading Factor of LoRa modulation (values 7 -to 12 are valid). - -Use the -c option to specify the Coding Rate of LoRa modulation ( 1 = 4/5, 2 = -4/6, 3 = 4/7, 4 = 4/8 ). - -Use the -p option to set the concentrator TX power in dBm. Not all values are -supported by hardware (typically 14 et 20 dBm are supported, other values might -not give expected power). Check with a RF power meter before connecting any -sensitive equipment. - -Use the -r option to set LoRa preamble size. A minimum preamble length of 6 -symbols is enforced. - -Use the -z option to set the payload size in bytes. - -Use the -t option to specify the number of milliseconds of pause between -packets. Using zero will result in a quasi-continuous emission. - -Use the -x option to specify how many packets should be sent. The value -1 cause -the program to send packet indefinitely, until stopped (using Ctrl-C). - -Use the -i option to invert the LoRa modulation polarity. +Use the -h to get help and details about available options. The payload content is: [T][E][S][T][packet counter MSB][packet counter LSB] followed by ASCII padding. @@ -103,4 +72,4 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*EOF* \ No newline at end of file +*EOF* diff --git a/util_tx_test/src/util_tx_test.c b/util_tx_test/src/util_tx_test.c index f4166aa1..9dc5f1ca 100644 --- a/util_tx_test/src/util_tx_test.c +++ b/util_tx_test/src/util_tx_test.c @@ -7,7 +7,7 @@ (C)2013 Semtech-Cycleo Description: - Send a bunch of packets on a settable frequency + Send a bunch of packets on a settable frequency License: Revised BSD License, see LICENSE.TXT file include in the project Maintainer: Sylvain Miermont @@ -19,19 +19,19 @@ Maintainer: Sylvain Miermont /* fix an issue between POSIX and C99 */ #if __STDC_VERSION__ >= 199901L - #define _XOPEN_SOURCE 600 + #define _XOPEN_SOURCE 600 #else - #define _XOPEN_SOURCE 500 + #define _XOPEN_SOURCE 500 #endif -#include /* C99 types */ -#include /* bool type */ -#include /* printf fprintf sprintf fopen fputs */ +#include /* C99 types */ +#include /* bool type */ +#include /* printf fprintf sprintf fopen fputs */ -#include /* memset */ -#include /* sigaction */ -#include /* getopt access */ -#include /* exit codes */ +#include /* memset */ +#include /* sigaction */ +#include /* getopt access */ +#include /* exit codes */ #include "loragw_hal.h" #include "loragw_aux.h" @@ -39,14 +39,17 @@ Maintainer: Sylvain Miermont /* -------------------------------------------------------------------------- */ /* --- PRIVATE MACROS ------------------------------------------------------- */ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -#define MSG(args...) fprintf(stderr, args) /* message that is destined to the user */ +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#define MSG(args...) fprintf(stderr, args) /* message that is destined to the user */ /* -------------------------------------------------------------------------- */ /* --- PRIVATE CONSTANTS ---------------------------------------------------- */ -#define RF_CHAIN 0 /* we'll use radio A only */ -#define DEFAULT_RSSI_OFFSET 0.0 +#define TX_RF_CHAIN 0 /* TX only supported on radio A */ +#define DEFAULT_RSSI_OFFSET 0.0 +#define DEFAULT_MODULATION "LORA" +#define DEFAULT_BR_KBPS 50 +#define DEFAULT_FDEV_KHZ 25 /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES (GLOBAL) ------------------------------------------- */ @@ -56,6 +59,45 @@ struct sigaction sigact; /* SIGQUIT&SIGINT&SIGTERM signal handling */ static int exit_sig = 0; /* 1 -> application terminates cleanly (shut down hardware, close open files, etc) */ static int quit_sig = 0; /* 1 -> application terminates without shutting down the hardware */ +/* TX gain LUT table */ +static struct lgw_tx_gain_lut_s txgain_lut = { + .size = 5, + .lut[0] = { + .dig_gain = 0, + .pa_gain = 0, + .dac_gain = 3, + .mix_gain = 12, + .rf_power = 0 + }, + .lut[1] = { + .dig_gain = 0, + .pa_gain = 1, + .dac_gain = 3, + .mix_gain = 12, + .rf_power = 10 + }, + .lut[2] = { + .dig_gain = 0, + .pa_gain = 2, + .dac_gain = 3, + .mix_gain = 10, + .rf_power = 14 + }, + .lut[3] = { + .dig_gain = 0, + .pa_gain = 3, + .dac_gain = 3, + .mix_gain = 9, + .rf_power = 20 + }, + .lut[4] = { + .dig_gain = 0, + .pa_gain = 3, + .dac_gain = 3, + .mix_gain = 14, + .rf_power = 27 + }}; + /* -------------------------------------------------------------------------- */ /* --- PRIVATE FUNCTIONS DECLARATION ---------------------------------------- */ @@ -67,29 +109,39 @@ void usage (void); /* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */ static void sig_handler(int sigio) { - if (sigio == SIGQUIT) { - quit_sig = 1;; - } else if ((sigio == SIGINT) || (sigio == SIGTERM)) { - exit_sig = 1; - } + if (sigio == SIGQUIT) { + quit_sig = 1;; + } else if ((sigio == SIGINT) || (sigio == SIGTERM)) { + exit_sig = 1; + } } /* describe command line options */ void usage(void) { - printf("*** Library version information ***\n%s\n\n", lgw_version_info()); - printf("Available options:\n"); - printf(" -h print this help\n"); - printf(" -r radio type (SX1255:1255, SX1257:1257)\n"); - printf(" -f target frequency in MHz\n"); - printf(" -b LoRa bandwidth in kHz [125, 250, 500]\n"); - printf(" -s LoRa Spreading Factor [7-12]\n"); - printf(" -c LoRa Coding Rate [1-4]\n"); - printf(" -p RF power (dBm)\n"); - printf(" -l LoRa preamble length (symbols)\n"); - printf(" -z payload size (bytes, <256)\n"); - printf(" -t pause between packets (ms)\n"); - printf(" -x nb of times the sequence is repeated (-1 loop until stopped)\n"); - printf(" -i send packet using inverted modulation polarity\n"); + int i; + + printf("*** Library version information ***\n%s\n\n", lgw_version_info()); + printf("Available options:\n"); + printf(" -h print this help\n"); + printf(" -r radio type (SX1255:1255, SX1257:1257)\n"); + printf(" -f target frequency in MHz\n"); + printf(" -k concentrator clock source (0:Radio A, 1:Radio B)\n"); + printf(" -m modulation type ['LORA', 'FSK']\n"); + printf(" -b LoRa bandwidth in kHz [125, 250, 500]\n"); + printf(" -s LoRa Spreading Factor [7-12]\n"); + printf(" -c LoRa Coding Rate [1-4]\n"); + printf(" -d FSK frequency deviation in kHz [1:250]\n"); + printf(" -q FSK bitrate in kbps [0.5:250]\n"); + printf(" -p RF power (dBm) [ "); + for (i = 0; i < txgain_lut.size; i++) { + printf("%ddBm ", txgain_lut.lut[i].rf_power); + } + printf("]\n"); + printf(" -l LoRa preamble length (symbols)\n"); + printf(" -z payload size (bytes, <256)\n"); + printf(" -t pause between packets (ms)\n"); + printf(" -x nb of times the sequence is repeated (-1 loop until stopped)\n"); + printf(" -i send packet using inverted modulation polarity\n"); } /* -------------------------------------------------------------------------- */ @@ -97,299 +149,358 @@ void usage(void) { int main(int argc, char **argv) { - int i; - uint8_t status_var; - - /* user entry parameters */ - int xi = 0; - double xd = 0.0; - - /* application parameters */ - uint32_t f_target = 0; /* target frequency - invalid default value, has to be specified by user */ - int sf = 10; /* SF10 by default */ - int cr = 1; /* CR1 aka 4/5 by default */ - int bw = 125; /* 125kHz bandwidth by default */ - int pow = 14; /* 14 dBm by default */ - int preamb = 8; /* 8 symbol preamble by default */ - int pl_size = 16; /* 16 bytes payload by default */ - int delay = 1000; /* 1 second between packets by default */ - int repeat = -1; /* by default, repeat until stopped */ - bool invert = false; - - /* RF configuration (TX fail if RF chain is not enabled) */ - enum lgw_radio_type_e radio_type = LGW_RADIO_TYPE_NONE; - uint8_t clocksource = 1; /* Radio B is source by default */ - struct lgw_conf_board_s boardconf; - struct lgw_conf_rxrf_s rfconf; - - /* allocate memory for packet sending */ - struct lgw_pkt_tx_s txpkt; /* array containing 1 outbound packet + metadata */ - - /* loop variables (also use as counters in the packet payload) */ - uint16_t cycle_count = 0; - - /* parse command line options */ - while ((i = getopt (argc, argv, "hif:b:s:c:p:l:z:t:x:r:k")) != -1) { - switch (i) { - case 'h': - usage(); - return EXIT_FAILURE; - break; - - case 'f': /* -f target frequency in MHz */ - i = sscanf(optarg, "%lf", &xd); - if ((i != 1) || (xd < 30.0) || (xd > 3000.0)) { - MSG("ERROR: invalid TX frequency\n"); - usage(); - return EXIT_FAILURE; - } else { - f_target = (uint32_t)((xd*1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ - } - break; - - case 'b': /* -b Modulation bandwidth in kHz */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || ((xi != 125)&&(xi != 250)&&(xi != 500))) { - MSG("ERROR: invalid LoRa bandwidth\n"); - usage(); - return EXIT_FAILURE; - } else { - bw = xi; - } - break; - - case 's': /* -s Spreading Factor */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 7) || (xi > 12)) { - MSG("ERROR: invalid spreading factor\n"); - usage(); - return EXIT_FAILURE; - } else { - sf = xi; - } - break; - - case 'c': /* -c Coding Rate */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 1) || (xi > 4)) { - MSG("ERROR: invalid coding rate\n"); - usage(); - return EXIT_FAILURE; - } else { - cr = xi; - } - break; - - case 'p': /* -p RF power */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < -60) || (xi > 60)) { - MSG("ERROR: invalid RF power\n"); - usage(); - return EXIT_FAILURE; - } else { - pow = xi; - } - break; - - case 'l': /* -r preamble length (symbols) */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 6)) { - MSG("ERROR: preamble length must be >6 symbols \n"); - usage(); - return EXIT_FAILURE; - } else { - preamb = xi; - } - break; - - case 'z': /* -z payload length (bytes) */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi <= 0)) { - MSG("ERROR: invalid payload size\n"); - usage(); - return EXIT_FAILURE; - } else { - pl_size = xi; - } - break; - - case 't': /* -t pause between packets (ms) */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < 0)) { - MSG("ERROR: invalid time between packets\n"); - usage(); - return EXIT_FAILURE; - } else { - delay = xi; - } - break; - - case 'x': /* -x numbers of times the sequence is repeated */ - i = sscanf(optarg, "%i", &xi); - if ((i != 1) || (xi < -1)) { - MSG("ERROR: invalid number of repeats\n"); - usage(); - return EXIT_FAILURE; - } else { - repeat = xi; - } - break; - - case 'r': /* Radio type (1255, 1257) */ - sscanf(optarg, "%i", &xi); - switch (xi) { - case 1255: - radio_type = LGW_RADIO_TYPE_SX1255; - break; - case 1257: - radio_type = LGW_RADIO_TYPE_SX1257; - break; - default: - printf("ERROR: invalid radio type\n"); - usage(); - return EXIT_FAILURE; - } - break; - - case 'i': /* -i send packet using inverted modulation polarity */ - invert = true; - break; - - case 'k': /* Concentrator clock source (Radio A or Radio B) */ - sscanf(optarg, "%i", &xi); - clocksource = (uint8_t)xi; - break; - - default: - MSG("ERROR: argument parsing\n"); - usage(); - return EXIT_FAILURE; - } - } - - /* check parameter sanity */ - if (f_target == 0) { - MSG("ERROR: frequency parameter not set, please use -f option to specify it.\n"); - return EXIT_FAILURE; - } - if (radio_type == LGW_RADIO_TYPE_NONE) { - MSG("ERROR: radio type parameter not properly set, please use -r option to specify it.\n"); - return EXIT_FAILURE; - } - printf("Sending %i packets on %u Hz (BW %i kHz, SF %i, CR %i, %i bytes payload, %i symbols preamble) at %i dBm, with %i ms between each\n", repeat, f_target, bw, sf, cr, pl_size, preamb, pow, delay); - - /* configure signal handling */ - sigemptyset(&sigact.sa_mask); - sigact.sa_flags = 0; - sigact.sa_handler = sig_handler; - sigaction(SIGQUIT, &sigact, NULL); - sigaction(SIGINT, &sigact, NULL); - sigaction(SIGTERM, &sigact, NULL); - - /* starting the concentrator */ - /* board config */ - memset(&boardconf, 0, sizeof(boardconf)); - - boardconf.lorawan_public = true; - boardconf.clksrc = clocksource; - lgw_board_setconf(boardconf); - - /* RF config */ - memset(&rfconf, 0, sizeof(rfconf)); - - rfconf.enable = true; - rfconf.freq_hz = f_target; - rfconf.rssi_offset = DEFAULT_RSSI_OFFSET; - rfconf.type = radio_type; - rfconf.tx_enable = true; - lgw_rxrf_setconf(RF_CHAIN, rfconf); - - i = lgw_start(); - if (i == LGW_HAL_SUCCESS) { - MSG("INFO: concentrator started, packet can be sent\n"); - } else { - MSG("ERROR: failed to start the concentrator\n"); - return EXIT_FAILURE; - } - - /* fill-up payload and parameters */ - memset(&txpkt, 0, sizeof(txpkt)); - txpkt.freq_hz = f_target; - txpkt.tx_mode = IMMEDIATE; - txpkt.rf_chain = RF_CHAIN; - txpkt.rf_power = pow; - txpkt.modulation = MOD_LORA; - switch (bw) { - case 125: txpkt.bandwidth = BW_125KHZ; break; - case 250: txpkt.bandwidth = BW_250KHZ; break; - case 500: txpkt.bandwidth = BW_500KHZ; break; - default: - MSG("ERROR: invalid 'bw' variable\n"); - return EXIT_FAILURE; - } - switch (sf) { - case 7: txpkt.datarate = DR_LORA_SF7; break; - case 8: txpkt.datarate = DR_LORA_SF8; break; - case 9: txpkt.datarate = DR_LORA_SF9; break; - case 10: txpkt.datarate = DR_LORA_SF10; break; - case 11: txpkt.datarate = DR_LORA_SF11; break; - case 12: txpkt.datarate = DR_LORA_SF12; break; - default: - MSG("ERROR: invalid 'sf' variable\n"); - return EXIT_FAILURE; - } - switch (cr) { - case 1: txpkt.coderate = CR_LORA_4_5; break; - case 2: txpkt.coderate = CR_LORA_4_6; break; - case 3: txpkt.coderate = CR_LORA_4_7; break; - case 4: txpkt.coderate = CR_LORA_4_8; break; - default: - MSG("ERROR: invalid 'cr' variable\n"); - return EXIT_FAILURE; - } - txpkt.invert_pol = invert; - txpkt.preamble = preamb; - txpkt.size = pl_size; - strcpy((char *)txpkt.payload, "TEST**abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#" ); /* abc.. is for padding */ - - /* main loop */ - cycle_count = 0; - while ((repeat == -1) || (cycle_count < repeat)) { - ++cycle_count; - - /* refresh counters in payload (big endian, for readability) */ - txpkt.payload[4] = (uint8_t)(cycle_count >> 8); /* MSB */ - txpkt.payload[5] = (uint8_t)(cycle_count & 0x00FF); /* LSB */ - - /* send packet */ - printf("Sending packet number %u ...", cycle_count); - i = lgw_send(txpkt); /* non-blocking scheduling of TX packet */ - if (i != LGW_HAL_SUCCESS) { - printf("ERROR\n"); - return EXIT_FAILURE; - } - - /* wait for packet to finish sending */ - do { - wait_ms(5); - lgw_status(TX_STATUS, &status_var); /* get TX status */ - } while (status_var != TX_FREE); - printf("OK\n"); - - /* wait inter-packet delay */ - wait_ms(delay); - - /* exit loop on user signals */ - if ((quit_sig == 1) || (exit_sig == 1)) { - break; - } - } - - /* clean up before leaving */ - lgw_stop(); - - printf("Exiting LoRa concentrator TX test program\n"); - return EXIT_SUCCESS; + int i; + uint8_t status_var; + + /* user entry parameters */ + int xi = 0; + unsigned int xu = 0; + double xd = 0.0; + float xf = 0.0; + char arg_s[64]; + + /* application parameters */ + char mod[64] = DEFAULT_MODULATION; + uint32_t f_target = 0; /* target frequency - invalid default value, has to be specified by user */ + int sf = 10; /* SF10 by default */ + int cr = 1; /* CR1 aka 4/5 by default */ + int bw = 125; /* 125kHz bandwidth by default */ + int pow = 14; /* 14 dBm by default */ + int preamb = 8; /* 8 symbol preamble by default */ + int pl_size = 16; /* 16 bytes payload by default */ + int delay = 1000; /* 1 second between packets by default */ + int repeat = -1; /* by default, repeat until stopped */ + bool invert = false; + float br_kbps = DEFAULT_BR_KBPS; + uint8_t fdev_khz = DEFAULT_FDEV_KHZ; + + /* RF configuration (TX fail if RF chain is not enabled) */ + enum lgw_radio_type_e radio_type = LGW_RADIO_TYPE_NONE; + uint8_t clocksource = 1; /* Radio B is source by default */ + struct lgw_conf_board_s boardconf; + struct lgw_conf_rxrf_s rfconf; + + /* allocate memory for packet sending */ + struct lgw_pkt_tx_s txpkt; /* array containing 1 outbound packet + metadata */ + + /* loop variables (also use as counters in the packet payload) */ + uint16_t cycle_count = 0; + + /* parse command line options */ + while ((i = getopt (argc, argv, "hif:m:b:s:c:p:l:z:t:x:r:k:d:q:")) != -1) { + switch (i) { + case 'h': + usage(); + return EXIT_FAILURE; + break; + + case 'f': /* -f Target frequency in MHz */ + i = sscanf(optarg, "%lf", &xd); + if ((i != 1) || (xd < 30.0) || (xd > 3000.0)) { + MSG("ERROR: invalid TX frequency\n"); + usage(); + return EXIT_FAILURE; + } else { + f_target = (uint32_t)((xd*1e6) + 0.5); /* .5 Hz offset to get rounding instead of truncating */ + } + break; + + case 'm': /* -m Modulation type */ + i = sscanf(optarg, "%s", arg_s); + if ((i != 1) || ((strcmp(arg_s,"LORA") != 0) && (strcmp(arg_s,"FSK")))) { + MSG("ERROR: invalid modulation type\n"); + usage(); + return EXIT_FAILURE; + } else { + sprintf(mod, "%s", arg_s); + } + break; + + case 'b': /* -b Modulation bandwidth in kHz */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || ((xi != 125) && (xi != 250) && (xi != 500))) { + MSG("ERROR: invalid LoRa bandwidth\n"); + usage(); + return EXIT_FAILURE; + } else { + bw = xi; + } + break; + + case 's': /* -s Spreading Factor */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi < 7) || (xi > 12)) { + MSG("ERROR: invalid spreading factor\n"); + usage(); + return EXIT_FAILURE; + } else { + sf = xi; + } + break; + + case 'c': /* -c Coding Rate */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi < 1) || (xi > 4)) { + MSG("ERROR: invalid coding rate\n"); + usage(); + return EXIT_FAILURE; + } else { + cr = xi; + } + break; + + case 'p': /* -p RF power */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi < -60) || (xi > 60)) { + MSG("ERROR: invalid RF power\n"); + usage(); + return EXIT_FAILURE; + } else { + pow = xi; + } + break; + + case 'd': /* -d FSK frequency deviation */ + i = sscanf(optarg, "%u", &xu); + if ((i != 1) || (xu < 1) || (xu > 250)) { + MSG("ERROR: invalid FSK frequency deviation\n"); + usage(); + return EXIT_FAILURE; + } else { + fdev_khz = (uint8_t)xu; + } + break; + + case 'q': /* -q FSK bitrate */ + i = sscanf(optarg, "%f", &xf); + if ((i != 1) || (xf < 0.5) || (xf > 250)) { + MSG("ERROR: invalid FSK bitrate\n"); + usage(); + return EXIT_FAILURE; + } else { + br_kbps = xf; + } + break; + + case 'l': /* -r preamble length (symbols) */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi < 6)) { + MSG("ERROR: preamble length must be >6 symbols \n"); + usage(); + return EXIT_FAILURE; + } else { + preamb = xi; + } + break; + + case 'z': /* -z payload length (bytes) */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi <= 0)) { + MSG("ERROR: invalid payload size\n"); + usage(); + return EXIT_FAILURE; + } else { + pl_size = xi; + } + break; + + case 't': /* -t pause between packets (ms) */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi < 0)) { + MSG("ERROR: invalid time between packets\n"); + usage(); + return EXIT_FAILURE; + } else { + delay = xi; + } + break; + + case 'x': /* -x numbers of times the sequence is repeated */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || (xi < -1)) { + MSG("ERROR: invalid number of repeats\n"); + usage(); + return EXIT_FAILURE; + } else { + repeat = xi; + } + break; + + case 'r': /* Radio type (1255, 1257) */ + sscanf(optarg, "%i", &xi); + switch (xi) { + case 1255: + radio_type = LGW_RADIO_TYPE_SX1255; + break; + case 1257: + radio_type = LGW_RADIO_TYPE_SX1257; + break; + default: + printf("ERROR: invalid radio type\n"); + usage(); + return EXIT_FAILURE; + } + break; + + case 'i': /* -i send packet using inverted modulation polarity */ + invert = true; + break; + + case 'k': /* Concentrator clock source (Radio A or Radio B) */ + i = sscanf(optarg, "%i", &xi); + if ((i != 1) || ((xi != 0) && (xi != 1))) { + MSG("ERROR: invalid clock source\n"); + usage(); + return EXIT_FAILURE; + } else { + clocksource = (uint8_t)xi; + } + break; + + default: + MSG("ERROR: argument parsing\n"); + usage(); + return EXIT_FAILURE; + } + } + + /* check parameter sanity */ + if (f_target == 0) { + MSG("ERROR: frequency parameter not set, please use -f option to specify it.\n"); + return EXIT_FAILURE; + } + if (radio_type == LGW_RADIO_TYPE_NONE) { + MSG("ERROR: radio type parameter not properly set, please use -r option to specify it.\n"); + return EXIT_FAILURE; + } + + if (strcmp(mod, "FSK") == 0) { + printf("Sending %i FSK packets on %u Hz (FDev %u kHz, Bitrate %.2f, %i bytes payload, %i symbols preamble) at %i dBm, with %i ms between each\n", repeat, f_target, fdev_khz, br_kbps, pl_size, preamb, pow, delay); + } else { + printf("Sending %i LoRa packets on %u Hz (BW %i kHz, SF %i, CR %i, %i bytes payload, %i symbols preamble) at %i dBm, with %i ms between each\n", repeat, f_target, bw, sf, cr, pl_size, preamb, pow, delay); + } + + /* configure signal handling */ + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigact.sa_handler = sig_handler; + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + + /* starting the concentrator */ + /* board config */ + memset(&boardconf, 0, sizeof(boardconf)); + + boardconf.lorawan_public = true; + boardconf.clksrc = clocksource; + lgw_board_setconf(boardconf); + + /* RF config */ + memset(&rfconf, 0, sizeof(rfconf)); + + rfconf.enable = true; + rfconf.freq_hz = f_target; + rfconf.rssi_offset = DEFAULT_RSSI_OFFSET; + rfconf.type = radio_type; + rfconf.tx_enable = true; + lgw_rxrf_setconf(TX_RF_CHAIN, rfconf); + + /* TX gain config */ + lgw_txgain_setconf(&txgain_lut); + + i = lgw_start(); + if (i == LGW_HAL_SUCCESS) { + MSG("INFO: concentrator started, packet can be sent\n"); + } else { + MSG("ERROR: failed to start the concentrator\n"); + return EXIT_FAILURE; + } + + /* fill-up payload and parameters */ + memset(&txpkt, 0, sizeof(txpkt)); + txpkt.freq_hz = f_target; + txpkt.tx_mode = IMMEDIATE; + txpkt.rf_chain = TX_RF_CHAIN; + txpkt.rf_power = pow; + if( strcmp( mod, "FSK" ) == 0 ) { + txpkt.modulation = MOD_FSK; + txpkt.datarate = br_kbps * 1e3; + txpkt.f_dev = fdev_khz; + } else { + txpkt.modulation = MOD_LORA; + switch (bw) { + case 125: txpkt.bandwidth = BW_125KHZ; break; + case 250: txpkt.bandwidth = BW_250KHZ; break; + case 500: txpkt.bandwidth = BW_500KHZ; break; + default: + MSG("ERROR: invalid 'bw' variable\n"); + return EXIT_FAILURE; + } + switch (sf) { + case 7: txpkt.datarate = DR_LORA_SF7; break; + case 8: txpkt.datarate = DR_LORA_SF8; break; + case 9: txpkt.datarate = DR_LORA_SF9; break; + case 10: txpkt.datarate = DR_LORA_SF10; break; + case 11: txpkt.datarate = DR_LORA_SF11; break; + case 12: txpkt.datarate = DR_LORA_SF12; break; + default: + MSG("ERROR: invalid 'sf' variable\n"); + return EXIT_FAILURE; + } + switch (cr) { + case 1: txpkt.coderate = CR_LORA_4_5; break; + case 2: txpkt.coderate = CR_LORA_4_6; break; + case 3: txpkt.coderate = CR_LORA_4_7; break; + case 4: txpkt.coderate = CR_LORA_4_8; break; + default: + MSG("ERROR: invalid 'cr' variable\n"); + return EXIT_FAILURE; + } + } + txpkt.invert_pol = invert; + txpkt.preamble = preamb; + txpkt.size = pl_size; + strcpy((char *)txpkt.payload, "TEST**abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#" ); /* abc.. is for padding */ + + /* main loop */ + cycle_count = 0; + while ((repeat == -1) || (cycle_count < repeat)) { + ++cycle_count; + + /* refresh counters in payload (big endian, for readability) */ + txpkt.payload[4] = (uint8_t)(cycle_count >> 8); /* MSB */ + txpkt.payload[5] = (uint8_t)(cycle_count & 0x00FF); /* LSB */ + + /* send packet */ + printf("Sending packet number %u ...", cycle_count); + i = lgw_send(txpkt); /* non-blocking scheduling of TX packet */ + if (i != LGW_HAL_SUCCESS) { + printf("ERROR\n"); + return EXIT_FAILURE; + } + + /* wait for packet to finish sending */ + do { + wait_ms(5); + lgw_status(TX_STATUS, &status_var); /* get TX status */ + } while (status_var != TX_FREE); + printf("OK\n"); + + /* wait inter-packet delay */ + wait_ms(delay); + + /* exit loop on user signals */ + if ((quit_sig == 1) || (exit_sig == 1)) { + break; + } + } + + /* clean up before leaving */ + lgw_stop(); + + printf("Exiting LoRa concentrator TX test program\n"); + return EXIT_SUCCESS; } /* --- EOF ------------------------------------------------------------------ */