From b0e5b298fe38735f8fbc0652224f0bc7cec22c18 Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Wed, 15 Apr 2026 16:28:02 +0545 Subject: [PATCH 1/4] feat(gps): add UM982 GPS driver replacing broken TinyGPS++ Implement a complete UM982 GNSS driver (um982_gps.h/.c) with: - NMEA parser for GGA, RMC, THS, VTG with multi-talker support (GP/GN/GL/GA/GB) - Correct coordinate parsing using decimal-point-based degree detection (fixes PR #68 bug: 3-digit longitude degrees) - Checksum verification on all incoming sentences - Non-blocking line assembler with ring buffer - Init sequence: UNLOG, HEADING FIXLENGTH, baseline config, NMEA enables, VERSIONA handshake (no SAVECONFIG to avoid NVM wear) - Validity/age checks with configurable timeouts Integration into main.cpp: - Replace TinyGPSPlus with UM982_GPS_t, UART5 baud 9600->115200 - Non-blocking um982_process() in main loop (single-byte UART reads) - GPS heading override with magnetometer fallback - Health check using um982_position_age() Test infrastructure: - 49 unit tests covering checksums, coordinate parsing, all sentence types, talker IDs, feed/assembly, validity, init sequence, edge cases - Mock HAL_UART_Receive with per-UART ring buffer for integration tests - All 72 MCU tests passing (23 existing + 49 new) Fixes all 12 bugs identified in PR #68 analysis (5 compile errors + 7 functional). --- .../9_1_3_C_Cpp_Code/main.cpp | 96 +- .../9_1_3_C_Cpp_Code/um982_gps.c | 586 ++++++++++++ .../9_1_3_C_Cpp_Code/um982_gps.h | 213 +++++ 9_Firmware/9_1_Microcontroller/tests/Makefile | 23 +- .../tests/stm32_hal_mock.c | 101 +++ .../tests/stm32_hal_mock.h | 19 + .../tests/test_agc_outer_loop | Bin 0 -> 156528 bytes .../tests/test_gap3_emergency_state_ordering | Bin 0 -> 34288 bytes .../tests/test_gap3_emergency_stop_rails | Bin 0 -> 58096 bytes .../tests/test_gap3_idq_periodic_reread | Bin 0 -> 34080 bytes .../tests/test_gap3_iwdg_config | Bin 0 -> 33944 bytes .../tests/test_gap3_overtemp_emergency_stop | Bin 0 -> 33984 bytes .../tests/test_gap3_temperature_max | Bin 0 -> 34088 bytes .../9_1_Microcontroller/tests/test_um982_gps | Bin 0 -> 99728 bytes .../tests/test_um982_gps.c | 853 ++++++++++++++++++ 15 files changed, 1856 insertions(+), 35 deletions(-) create mode 100644 9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.c create mode 100644 9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.h create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_agc_outer_loop create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_emergency_state_ordering create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_emergency_stop_rails create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_idq_periodic_reread create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_iwdg_config create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_overtemp_emergency_stop create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_temperature_max create mode 100755 9_Firmware/9_1_Microcontroller/tests/test_um982_gps create mode 100644 9_Firmware/9_1_Microcontroller/tests/test_um982_gps.c diff --git a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp index b8c9392..31057c5 100644 --- a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp +++ b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp @@ -46,7 +46,9 @@ extern "C" { #include #include "stm32_spi.h" #include "stm32_delay.h" -#include "TinyGPSPlus.h" +extern "C" { +#include "um982_gps.h" +} extern "C" { #include "GY_85_HAL.h" } @@ -121,8 +123,8 @@ UART_HandleTypeDef huart5; UART_HandleTypeDef huart3; /* USER CODE BEGIN PV */ -// The TinyGPSPlus object -TinyGPSPlus gps; +// UM982 dual-antenna GPS receiver +UM982_GPS_t um982; // Global data structures GPS_Data_t current_gps_data = {0}; @@ -700,16 +702,13 @@ SystemError_t checkSystemHealth(void) { last_bmp_check = HAL_GetTick(); } - // 6. Check GPS Communication - static uint32_t last_gps_fix = 0; - if (gps.location.isUpdated()) { - last_gps_fix = HAL_GetTick(); - } - if (HAL_GetTick() - last_gps_fix > 30000) { - current_error = ERROR_GPS_COMM; - DIAG_WARN("SYS", "Health check: GPS no fix for >30s"); - return current_error; - } + // 6. Check GPS Communication (30s grace period from boot / last valid fix) + uint32_t gps_fix_age = um982_position_age(&um982); + if (gps_fix_age > 30000) { + current_error = ERROR_GPS_COMM; + DIAG_WARN("SYS", "Health check: GPS no fix for >30s (age=%lu ms)", (unsigned long)gps_fix_age); + return current_error; + } // 7. Check RF Power Amplifier Current if (PowerAmplifier) { @@ -1034,20 +1033,7 @@ static inline void delay_ms(uint32_t ms) { HAL_Delay(ms); } -// This custom version of delay() ensures that the gps object -// is being "fed". -static void smartDelay(unsigned long ms) -{ - uint32_t start = HAL_GetTick(); - uint8_t ch; - - do { - // While there is new data available in UART (non-blocking) - if (HAL_UART_Receive(&huart5, &ch, 1, 0) == HAL_OK) { - gps.encode(ch); // Pass received byte to TinyGPS++ equivalent parser - } - } while (HAL_GetTick() - start < ms); -} +// smartDelay removed -- replaced by non-blocking um982_process() in main loop // Small helper to enable DWT cycle counter for microdelay static void DWT_Init(void) @@ -1580,6 +1566,12 @@ int main(void) Yaw_Sensor = (180*atan2(magRawY,magRawX)/PI) - Mag_Declination; if(Yaw_Sensor<0)Yaw_Sensor+=360; + + // Override magnetometer heading with UM982 dual-antenna heading when available + if (um982_is_heading_valid(&um982)) { + Yaw_Sensor = um982_get_heading(&um982); + } + RxEst_0 = RxEst_1; RyEst_0 = RyEst_1; RzEst_0 = RzEst_1; @@ -1755,14 +1747,38 @@ int main(void) ////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////GPS///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// - for(int i=0; i<10;i++){ - smartDelay(1000); - RADAR_Longitude = gps.location.lng(); - RADAR_Latitude = gps.location.lat(); + DIAG_SECTION("GPS INIT (UM982)"); + DIAG("GPS", "Initializing UM982 on UART5 @ 115200 (baseline=50cm, tol=3cm)"); + if (!um982_init(&um982, &huart5, 50.0f, 3.0f)) { + DIAG_WARN("GPS", "UM982 init: no VERSIONA response -- module may need more time"); + // Not fatal: module may still start sending NMEA data after boot + } else { + DIAG("GPS", "UM982 init OK -- VERSIONA received"); } - //move Stepper to position 1 = 0° - HAL_GPIO_WritePin(STEPPER_CW_P_GPIO_Port, STEPPER_CW_P_Pin, GPIO_PIN_RESET);//Set stepper motor spinning direction to CCW + // Collect GPS data for a few seconds (non-blocking pump) + DIAG("GPS", "Pumping GPS for 5 seconds to acquire initial fix..."); + { + uint32_t gps_start = HAL_GetTick(); + while (HAL_GetTick() - gps_start < 5000) { + um982_process(&um982); + HAL_Delay(10); + } + } + RADAR_Longitude = um982_get_longitude(&um982); + RADAR_Latitude = um982_get_latitude(&um982); + DIAG("GPS", "Initial position: lat=%.6f lon=%.6f fix=%d sats=%d", + RADAR_Latitude, RADAR_Longitude, + um982_get_fix_quality(&um982), um982_get_num_sats(&um982)); + + // Re-apply heading after GPS init so the north-alignment stepper move uses + // UM982 dual-antenna heading when available. + if (um982_is_heading_valid(&um982)) { + Yaw_Sensor = um982_get_heading(&um982); + } + + //move Stepper to position 1 = 0° + HAL_GPIO_WritePin(STEPPER_CW_P_GPIO_Port, STEPPER_CW_P_Pin, GPIO_PIN_RESET);//Set stepper motor spinning direction to CCW //Point Stepper to North for(int i= 0;i<(int)(Yaw_Sensor*Stepper_steps/360);i++){ HAL_GPIO_WritePin(STEPPER_CLK_P_GPIO_Port, STEPPER_CLK_P_Pin, GPIO_PIN_SET); @@ -2031,6 +2047,18 @@ int main(void) } DIAG("SYS", "Exited safe mode blink loop -- system_emergency_state cleared"); } + + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////// GPS: Non-blocking NMEA processing //////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + um982_process(&um982); + + // Update position globals continuously + if (um982_is_position_valid(&um982)) { + RADAR_Latitude = um982_get_latitude(&um982); + RADAR_Longitude = um982_get_longitude(&um982); + } + ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////// Monitor ADF4382A lock status periodically////////////////// ////////////////////////////////////////////////////////////////////////////////////// @@ -2581,7 +2609,7 @@ static void MX_UART5_Init(void) /* USER CODE END UART5_Init 1 */ huart5.Instance = UART5; - huart5.Init.BaudRate = 9600; + huart5.Init.BaudRate = 115200; huart5.Init.WordLength = UART_WORDLENGTH_8B; huart5.Init.StopBits = UART_STOPBITS_1; huart5.Init.Parity = UART_PARITY_NONE; diff --git a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.c b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.c new file mode 100644 index 0000000..fd93027 --- /dev/null +++ b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.c @@ -0,0 +1,586 @@ +/******************************************************************************* + * um982_gps.c -- UM982 dual-antenna GNSS receiver driver implementation + * + * See um982_gps.h for API documentation. + * Command syntax per Unicore N4 Command Reference EN R1.14. + ******************************************************************************/ +#include "um982_gps.h" +#include +#include +#include + +/* ========================= Internal helpers ========================== */ + +/** + * Advance to the next comma-delimited field in an NMEA sentence. + * Returns pointer to the start of the next field (after the comma), + * or NULL if no more commas found before end-of-string or '*'. + * + * Handles empty fields (consecutive commas) correctly by returning + * a pointer to the character after the comma (which may be another comma). + */ +static const char *next_field(const char *p) +{ + if (p == NULL) return NULL; + while (*p != '\0' && *p != ',' && *p != '*') { + p++; + } + if (*p == ',') return p + 1; + return NULL; /* End of sentence or checksum marker */ +} + +/** + * Get the length of the current field (up to next comma, '*', or '\0'). + */ +static int field_len(const char *p) +{ + int len = 0; + if (p == NULL) return 0; + while (p[len] != '\0' && p[len] != ',' && p[len] != '*') { + len++; + } + return len; +} + +/** + * Check if a field is non-empty (has at least one character before delimiter). + */ +static bool field_valid(const char *p) +{ + return p != NULL && field_len(p) > 0; +} + +/** + * Parse a floating-point value from a field, returning 0.0 if empty. + */ +static double field_to_double(const char *p) +{ + if (!field_valid(p)) return 0.0; + return strtod(p, NULL); +} + +static float field_to_float(const char *p) +{ + return (float)field_to_double(p); +} + +static int field_to_int(const char *p) +{ + if (!field_valid(p)) return 0; + return (int)strtol(p, NULL, 10); +} + +/* ========================= Checksum ================================== */ + +bool um982_verify_checksum(const char *sentence) +{ + if (sentence == NULL || sentence[0] != '$') return false; + + const char *p = sentence + 1; /* Skip '$' */ + uint8_t computed = 0; + + while (*p != '\0' && *p != '*') { + computed ^= (uint8_t)*p; + p++; + } + + if (*p != '*') return false; /* No checksum marker found */ + p++; /* Skip '*' */ + + /* Parse 2-char hex checksum */ + if (p[0] == '\0' || p[1] == '\0') return false; + + char hex_str[3] = { p[0], p[1], '\0' }; + unsigned long expected = strtoul(hex_str, NULL, 16); + + return computed == (uint8_t)expected; +} + +/* ========================= Coordinate parsing ======================== */ + +double um982_parse_coord(const char *field, char hemisphere) +{ + if (field == NULL || field[0] == '\0') return NAN; + + /* Find the decimal point to determine degree digit count. + * Latitude: ddmm.mmmm (dot at index 4, degrees = 2) + * Longitude: dddmm.mmmm (dot at index 5, degrees = 3) + * General: degree_digits = dot_position - 2 + */ + const char *dot = strchr(field, '.'); + if (dot == NULL) return NAN; + + int dot_pos = (int)(dot - field); + int deg_digits = dot_pos - 2; + + if (deg_digits < 1 || deg_digits > 3) return NAN; + + /* Extract degree portion */ + double degrees = 0.0; + for (int i = 0; i < deg_digits; i++) { + if (field[i] < '0' || field[i] > '9') return NAN; + degrees = degrees * 10.0 + (field[i] - '0'); + } + + /* Extract minutes portion (everything from deg_digits onward) */ + double minutes = strtod(field + deg_digits, NULL); + if (minutes < 0.0 || minutes >= 60.0) return NAN; + + double result = degrees + minutes / 60.0; + + /* Apply hemisphere sign */ + if (hemisphere == 'S' || hemisphere == 'W') { + result = -result; + } + + return result; +} + +/* ========================= Sentence parsers ========================== */ + +/** + * Identify the NMEA sentence type by skipping the 2-char talker ID + * and comparing the 3-letter formatter. + * + * "$GNGGA,..." -> talker="GN", formatter="GGA" + * "$GPTHS,..." -> talker="GP", formatter="THS" + * + * Returns pointer to the formatter (3 chars at sentence+3), or NULL + * if sentence is too short. + */ +static const char *get_formatter(const char *sentence) +{ + /* sentence starts with '$', followed by 2-char talker + 3-char formatter */ + if (sentence == NULL || strlen(sentence) < 6) return NULL; + return sentence + 3; /* Skip "$XX" -> points to formatter */ +} + +/** + * Parse GGA sentence — position and fix quality. + * + * Format: $--GGA,time,lat,N/S,lon,E/W,quality,numSat,hdop,alt,M,geoidSep,M,dgpsAge,refID*XX + * field: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + */ +static void parse_gga(UM982_GPS_t *gps, const char *sentence) +{ + /* Skip to first field (after "$XXGGA,") */ + const char *f = strchr(sentence, ','); + if (f == NULL) return; + f++; /* f -> field 1 (time) */ + + /* Field 1: UTC time — skip for now */ + const char *f2 = next_field(f); /* lat */ + const char *f3 = next_field(f2); /* N/S */ + const char *f4 = next_field(f3); /* lon */ + const char *f5 = next_field(f4); /* E/W */ + const char *f6 = next_field(f5); /* quality */ + const char *f7 = next_field(f6); /* numSat */ + const char *f8 = next_field(f7); /* hdop */ + const char *f9 = next_field(f8); /* altitude */ + const char *f10 = next_field(f9); /* M */ + const char *f11 = next_field(f10); /* geoid sep */ + + uint32_t now = HAL_GetTick(); + + /* Parse fix quality first — if 0, position is meaningless */ + gps->fix_quality = (uint8_t)field_to_int(f6); + + /* Parse coordinates */ + if (field_valid(f2) && field_valid(f3)) { + char hem = field_valid(f3) ? *f3 : 'N'; + double lat = um982_parse_coord(f2, hem); + if (!isnan(lat)) gps->latitude = lat; + } + + if (field_valid(f4) && field_valid(f5)) { + char hem = field_valid(f5) ? *f5 : 'E'; + double lon = um982_parse_coord(f4, hem); + if (!isnan(lon)) gps->longitude = lon; + } + + /* Number of satellites */ + gps->num_satellites = (uint8_t)field_to_int(f7); + + /* HDOP */ + if (field_valid(f8)) { + gps->hdop = field_to_float(f8); + } + + /* Altitude */ + if (field_valid(f9)) { + gps->altitude = field_to_float(f9); + } + + /* Geoid separation */ + if (field_valid(f11)) { + gps->geoid_sep = field_to_float(f11); + } + + gps->last_gga_tick = now; + if (gps->fix_quality != UM982_FIX_NONE) { + gps->last_fix_tick = now; + } +} + +/** + * Parse RMC sentence — recommended minimum (position, speed, date). + * + * Format: $--RMC,time,status,lat,N/S,lon,E/W,speed,course,date,magVar,E/W,mode*XX + * field: 1 2 3 4 5 6 7 8 9 10 11 12 + */ +static void parse_rmc(UM982_GPS_t *gps, const char *sentence) +{ + const char *f = strchr(sentence, ','); + if (f == NULL) return; + f++; /* f -> field 1 (time) */ + + const char *f2 = next_field(f); /* status */ + const char *f3 = next_field(f2); /* lat */ + const char *f4 = next_field(f3); /* N/S */ + const char *f5 = next_field(f4); /* lon */ + const char *f6 = next_field(f5); /* E/W */ + const char *f7 = next_field(f6); /* speed knots */ + const char *f8 = next_field(f7); /* course true */ + + /* Status */ + if (field_valid(f2)) { + gps->rmc_status = *f2; + } + + /* Position (only if status = A for valid) */ + if (field_valid(f2) && *f2 == 'A') { + if (field_valid(f3) && field_valid(f4)) { + double lat = um982_parse_coord(f3, *f4); + if (!isnan(lat)) gps->latitude = lat; + } + if (field_valid(f5) && field_valid(f6)) { + double lon = um982_parse_coord(f5, *f6); + if (!isnan(lon)) gps->longitude = lon; + } + } + + /* Speed (knots) */ + if (field_valid(f7)) { + gps->speed_knots = field_to_float(f7); + } + + /* Course */ + if (field_valid(f8)) { + gps->course_true = field_to_float(f8); + } + + gps->last_rmc_tick = HAL_GetTick(); +} + +/** + * Parse THS sentence — true heading and status (UM982-specific). + * + * Format: $--THS,heading,mode*XX + * field: 1 2 + */ +static void parse_ths(UM982_GPS_t *gps, const char *sentence) +{ + const char *f = strchr(sentence, ','); + if (f == NULL) return; + f++; /* f -> field 1 (heading) */ + + const char *f2 = next_field(f); /* mode */ + + /* Heading */ + if (field_valid(f)) { + gps->heading = field_to_float(f); + } else { + gps->heading = NAN; + } + + /* Mode */ + if (field_valid(f2)) { + gps->heading_mode = *f2; + } else { + gps->heading_mode = 'V'; /* Not valid if missing */ + } + + gps->last_ths_tick = HAL_GetTick(); +} + +/** + * Parse VTG sentence — course and speed over ground. + * + * Format: $--VTG,courseTrue,T,courseMag,M,speedKnots,N,speedKmh,K,mode*XX + * field: 1 2 3 4 5 6 7 8 9 + */ +static void parse_vtg(UM982_GPS_t *gps, const char *sentence) +{ + const char *f = strchr(sentence, ','); + if (f == NULL) return; + f++; /* f -> field 1 (course true) */ + + const char *f2 = next_field(f); /* T */ + const char *f3 = next_field(f2); /* course mag */ + const char *f4 = next_field(f3); /* M */ + const char *f5 = next_field(f4); /* speed knots */ + const char *f6 = next_field(f5); /* N */ + const char *f7 = next_field(f6); /* speed km/h */ + + /* Course true */ + if (field_valid(f)) { + gps->course_true = field_to_float(f); + } + + /* Speed knots */ + if (field_valid(f5)) { + gps->speed_knots = field_to_float(f5); + } + + /* Speed km/h */ + if (field_valid(f7)) { + gps->speed_kmh = field_to_float(f7); + } + + gps->last_vtg_tick = HAL_GetTick(); +} + +/* ========================= Sentence dispatch ========================= */ + +void um982_parse_sentence(UM982_GPS_t *gps, const char *sentence) +{ + if (sentence == NULL || sentence[0] != '$') return; + + /* Verify checksum before parsing */ + if (!um982_verify_checksum(sentence)) return; + + /* Check for VERSIONA response (starts with '#', not '$') -- handled separately */ + /* Actually VERSIONA starts with '#', so it won't enter here. We check in feed(). */ + + /* Identify sentence type */ + const char *fmt = get_formatter(sentence); + if (fmt == NULL) return; + + if (strncmp(fmt, "GGA", 3) == 0) { + gps->initialized = true; + parse_gga(gps, sentence); + } else if (strncmp(fmt, "RMC", 3) == 0) { + gps->initialized = true; + parse_rmc(gps, sentence); + } else if (strncmp(fmt, "THS", 3) == 0) { + gps->initialized = true; + parse_ths(gps, sentence); + } else if (strncmp(fmt, "VTG", 3) == 0) { + gps->initialized = true; + parse_vtg(gps, sentence); + } + /* Other sentences silently ignored */ +} + +/* ========================= Command interface ========================= */ + +bool um982_send_command(UM982_GPS_t *gps, const char *cmd) +{ + if (gps == NULL || gps->huart == NULL || cmd == NULL) return false; + + /* Build command with \r\n termination */ + char buf[UM982_CMD_BUF_SIZE]; + int len = snprintf(buf, sizeof(buf), "%s\r\n", cmd); + if (len <= 0 || (size_t)len >= sizeof(buf)) return false; + + HAL_StatusTypeDef status = HAL_UART_Transmit( + gps->huart, (const uint8_t *)buf, (uint16_t)len, 100); + + return status == HAL_OK; +} + +/* ========================= Line assembly + feed ====================== */ + +/** + * Process a completed line from the line buffer. + */ +static void process_line(UM982_GPS_t *gps, const char *line) +{ + if (line == NULL || line[0] == '\0') return; + + /* NMEA sentence starts with '$' */ + if (line[0] == '$') { + um982_parse_sentence(gps, line); + return; + } + + /* Unicore proprietary response starts with '#' (e.g. #VERSIONA) */ + if (line[0] == '#') { + if (strncmp(line + 1, "VERSIONA", 8) == 0) { + gps->version_received = true; + gps->initialized = true; + } + return; + } +} + +void um982_feed(UM982_GPS_t *gps, const uint8_t *data, uint16_t len) +{ + if (gps == NULL || data == NULL || len == 0) return; + + for (uint16_t i = 0; i < len; i++) { + uint8_t ch = data[i]; + + /* End of line: process if we have content */ + if (ch == '\n' || ch == '\r') { + if (gps->line_len > 0 && !gps->line_overflow) { + gps->line_buf[gps->line_len] = '\0'; + process_line(gps, gps->line_buf); + } + gps->line_len = 0; + gps->line_overflow = false; + continue; + } + + /* Accumulate into line buffer */ + if (gps->line_len < UM982_LINE_BUF_SIZE - 1) { + gps->line_buf[gps->line_len++] = (char)ch; + } else { + gps->line_overflow = true; + } + } +} + +/* ========================= UART process (production) ================= */ + +void um982_process(UM982_GPS_t *gps) +{ + if (gps == NULL || gps->huart == NULL) return; + + /* Read all available bytes from the UART one at a time. + * At 115200 baud (~11.5 KB/s) and a typical main-loop period of ~10 ms, + * we expect ~115 bytes per call — negligible overhead on a 168 MHz STM32. + * + * Note: batch reads (HAL_UART_Receive with Size > 1 and Timeout = 0) are + * NOT safe here because the HAL consumes bytes from the data register as + * it reads them. If fewer than Size bytes are available, the consumed + * bytes are lost (HAL_TIMEOUT is returned and the caller has no way to + * know how many bytes were actually placed into the buffer). */ + uint8_t ch; + while (HAL_UART_Receive(gps->huart, &ch, 1, 0) == HAL_OK) { + um982_feed(gps, &ch, 1); + } +} + +/* ========================= Validity checks =========================== */ + +bool um982_is_heading_valid(const UM982_GPS_t *gps) +{ + if (gps == NULL) return false; + if (isnan(gps->heading)) return false; + + /* Mode must be Autonomous or Differential */ + if (gps->heading_mode != 'A' && gps->heading_mode != 'D') return false; + + /* Check age */ + uint32_t age = HAL_GetTick() - gps->last_ths_tick; + return age < UM982_HEADING_TIMEOUT_MS; +} + +bool um982_is_position_valid(const UM982_GPS_t *gps) +{ + if (gps == NULL) return false; + if (gps->fix_quality == UM982_FIX_NONE) return false; + + /* Check age of the last valid fix */ + uint32_t age = HAL_GetTick() - gps->last_fix_tick; + return age < UM982_POSITION_TIMEOUT_MS; +} + +uint32_t um982_heading_age(const UM982_GPS_t *gps) +{ + if (gps == NULL) return UINT32_MAX; + return HAL_GetTick() - gps->last_ths_tick; +} + +uint32_t um982_position_age(const UM982_GPS_t *gps) +{ + if (gps == NULL) return UINT32_MAX; + return HAL_GetTick() - gps->last_fix_tick; +} + +/* ========================= Initialization ============================ */ + +bool um982_init(UM982_GPS_t *gps, UART_HandleTypeDef *huart, + float baseline_cm, float tolerance_cm) +{ + if (gps == NULL || huart == NULL) return false; + + /* Zero-init entire structure */ + memset(gps, 0, sizeof(UM982_GPS_t)); + + gps->huart = huart; + gps->heading = NAN; + gps->heading_mode = 'V'; + gps->rmc_status = 'V'; + gps->speed_knots = 0.0f; + + /* Seed fix timestamp so position_age() returns ~0 instead of uptime. + * Gives the module a full 30s grace window from init to acquire a fix + * before the health check fires ERROR_GPS_COMM. */ + gps->last_fix_tick = HAL_GetTick(); + gps->speed_kmh = 0.0f; + gps->course_true = 0.0f; + + /* Step 1: Stop all current output to get a clean slate */ + um982_send_command(gps, "UNLOG"); + HAL_Delay(100); + + /* Step 2: Configure heading mode + * Per N4 Reference 4.18: CONFIG HEADING FIXLENGTH (default mode) + * "The distance between ANT1 and ANT2 is fixed. They move synchronously." */ + um982_send_command(gps, "CONFIG HEADING FIXLENGTH"); + HAL_Delay(50); + + /* Step 3: Set baseline length if specified + * Per N4 Reference: CONFIG HEADING LENGTH + * "parameter1: Fixed baseline length (cm), valid range >= 0" + * "parameter2: Tolerable error margin (cm), valid range > 0" */ + if (baseline_cm > 0.0f) { + char cmd[64]; + if (tolerance_cm > 0.0f) { + snprintf(cmd, sizeof(cmd), "CONFIG HEADING LENGTH %.0f %.0f", + baseline_cm, tolerance_cm); + } else { + snprintf(cmd, sizeof(cmd), "CONFIG HEADING LENGTH %.0f", + baseline_cm); + } + um982_send_command(gps, cmd); + HAL_Delay(50); + } + + /* Step 4: Enable NMEA output sentences on COM2. + * Per N4 Reference: "When requesting NMEA messages, users should add GP + * before each command name" + * + * We target COM2 because the ELT0213 board (GNSS.STORE) exposes COM2 + * (RXD2/TXD2) on its 12-pin JST connector (pins 5 & 6). The STM32 + * UART5 (PC12-TX, PD2-RX) connects to these pins via JP8. + * COM2 defaults to 115200 baud — matching our UART5 config. */ + um982_send_command(gps, "GPGGA COM2 1"); /* GGA at 1 Hz */ + HAL_Delay(50); + um982_send_command(gps, "GPRMC COM2 1"); /* RMC at 1 Hz */ + HAL_Delay(50); + um982_send_command(gps, "GPTHS COM2 0.2"); /* THS at 5 Hz (heading primary) */ + HAL_Delay(50); + + /* Step 5: Skip SAVECONFIG -- NMEA config is re-sent every boot anyway. + * Saving to NVM on every power cycle would wear flash. If persistent + * config is needed, call um982_send_command(gps, "SAVECONFIG") once + * during commissioning. */ + + /* Step 6: Query version to verify communication */ + gps->version_received = false; + um982_send_command(gps, "VERSIONA"); + + /* Wait for VERSIONA response (non-blocking poll) */ + uint32_t start = HAL_GetTick(); + while (!gps->version_received && + (HAL_GetTick() - start) < UM982_INIT_TIMEOUT_MS) { + um982_process(gps); + HAL_Delay(10); + } + + gps->initialized = gps->version_received; + return gps->initialized; +} diff --git a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.h b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.h new file mode 100644 index 0000000..ad94ac0 --- /dev/null +++ b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/um982_gps.h @@ -0,0 +1,213 @@ +/******************************************************************************* + * um982_gps.h -- UM982 dual-antenna GNSS receiver driver + * + * Parses NMEA sentences (GGA, RMC, THS, VTG) from the Unicore UM982 module + * and provides position, heading, and velocity data. + * + * Design principles: + * - Non-blocking: process() reads available UART bytes without waiting + * - Correct NMEA parsing: proper tokenizer handles empty fields + * - Longitude handles 3-digit degrees (dddmm.mmmm) via decimal-point detection + * - Checksum verified on every sentence + * - Command syntax verified against Unicore N4 Command Reference EN R1.14 + * + * Hardware: UM982 on UART5 @ 115200 baud, dual-antenna heading mode + ******************************************************************************/ +#ifndef UM982_GPS_H +#define UM982_GPS_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward-declare the HAL UART handle type. The real definition comes from + * stm32f7xx_hal.h (production) or stm32_hal_mock.h (tests). */ +#ifndef STM32_HAL_MOCK_H +#include "stm32f7xx_hal.h" +#else +/* Already included via mock -- nothing to do */ +#endif + +/* ========================= Constants ================================= */ + +#define UM982_RX_BUF_SIZE 512 /* Ring buffer for incoming UART bytes */ +#define UM982_LINE_BUF_SIZE 96 /* Max NMEA sentence (82 chars + margin) */ +#define UM982_CMD_BUF_SIZE 128 /* Outgoing command buffer */ +#define UM982_INIT_TIMEOUT_MS 3000 /* Timeout waiting for VERSIONA response */ + +/* Fix quality values (from GGA field 6) */ +#define UM982_FIX_NONE 0 +#define UM982_FIX_GPS 1 +#define UM982_FIX_DGPS 2 +#define UM982_FIX_RTK_FIXED 4 +#define UM982_FIX_RTK_FLOAT 5 + +/* Validity timeout defaults (ms) */ +#define UM982_HEADING_TIMEOUT_MS 2000 +#define UM982_POSITION_TIMEOUT_MS 5000 + +/* ========================= Data Types ================================ */ + +typedef struct { + /* Position */ + double latitude; /* Decimal degrees, positive = North */ + double longitude; /* Decimal degrees, positive = East */ + float altitude; /* Meters above MSL */ + float geoid_sep; /* Geoid separation (meters) */ + + /* Heading (from dual-antenna THS) */ + float heading; /* True heading 0-360 degrees, NAN if invalid */ + char heading_mode; /* A=autonomous, D=diff, E=est, M=manual, S=sim, V=invalid */ + + /* Velocity */ + float speed_knots; /* Speed over ground (knots) */ + float speed_kmh; /* Speed over ground (km/h) */ + float course_true; /* Course over ground (degrees true) */ + + /* Quality */ + uint8_t fix_quality; /* 0=none, 1=GPS, 2=DGPS, 4=RTK fixed, 5=RTK float */ + uint8_t num_satellites; /* Satellites used in fix */ + float hdop; /* Horizontal dilution of precision */ + + /* RMC status */ + char rmc_status; /* A=valid, V=warning */ + + /* Timestamps (HAL_GetTick() at last update) */ + uint32_t last_fix_tick; /* Last valid GGA fix (fix_quality > 0) */ + uint32_t last_gga_tick; + uint32_t last_rmc_tick; + uint32_t last_ths_tick; + uint32_t last_vtg_tick; + + /* Communication state */ + bool initialized; /* VERSIONA or supported NMEA traffic seen */ + bool version_received; /* VERSIONA response seen */ + + /* ---- Internal parser state (not for external use) ---- */ + + /* Ring buffer */ + uint8_t rx_buf[UM982_RX_BUF_SIZE]; + uint16_t rx_head; /* Write index */ + uint16_t rx_tail; /* Read index */ + + /* Line assembler */ + char line_buf[UM982_LINE_BUF_SIZE]; + uint8_t line_len; + bool line_overflow; /* Current line exceeded buffer */ + + /* UART handle */ + UART_HandleTypeDef *huart; + +} UM982_GPS_t; + +/* ========================= Public API ================================ */ + +/** + * Initialize the UM982_GPS_t structure and configure the module. + * + * Sends: UNLOG, CONFIG HEADING, optional CONFIG HEADING LENGTH, + * GPGGA, GPRMC, GPTHS + * Queries VERSIONA to verify communication. + * + * @param gps Pointer to UM982_GPS_t instance + * @param huart UART handle (e.g. &huart5) + * @param baseline_cm Distance between antennas in cm (0 = use module default) + * @param tolerance_cm Baseline tolerance in cm (0 = use module default) + * @return true if VERSIONA response received within timeout + */ +bool um982_init(UM982_GPS_t *gps, UART_HandleTypeDef *huart, + float baseline_cm, float tolerance_cm); + +/** + * Process available UART data. Call from main loop — non-blocking. + * + * Reads all available bytes from UART, assembles lines, and dispatches + * complete NMEA sentences to the appropriate parser. + * + * @param gps Pointer to UM982_GPS_t instance + */ +void um982_process(UM982_GPS_t *gps); + +/** + * Feed raw bytes directly into the parser (useful for testing). + * In production, um982_process() calls this internally after UART read. + * + * @param gps Pointer to UM982_GPS_t instance + * @param data Pointer to byte array + * @param len Number of bytes + */ +void um982_feed(UM982_GPS_t *gps, const uint8_t *data, uint16_t len); + +/* ---- Getters ---- */ + +static inline float um982_get_heading(const UM982_GPS_t *gps) { return gps->heading; } +static inline double um982_get_latitude(const UM982_GPS_t *gps) { return gps->latitude; } +static inline double um982_get_longitude(const UM982_GPS_t *gps) { return gps->longitude; } +static inline float um982_get_altitude(const UM982_GPS_t *gps) { return gps->altitude; } +static inline uint8_t um982_get_fix_quality(const UM982_GPS_t *gps) { return gps->fix_quality; } +static inline uint8_t um982_get_num_sats(const UM982_GPS_t *gps) { return gps->num_satellites; } +static inline float um982_get_hdop(const UM982_GPS_t *gps) { return gps->hdop; } +static inline float um982_get_speed_knots(const UM982_GPS_t *gps) { return gps->speed_knots; } +static inline float um982_get_speed_kmh(const UM982_GPS_t *gps) { return gps->speed_kmh; } +static inline float um982_get_course(const UM982_GPS_t *gps) { return gps->course_true; } + +/** + * Check if heading is valid (mode A or D, and within timeout). + */ +bool um982_is_heading_valid(const UM982_GPS_t *gps); + +/** + * Check if position is valid (fix_quality > 0, and within timeout). + */ +bool um982_is_position_valid(const UM982_GPS_t *gps); + +/** + * Get age of last heading update in milliseconds. + */ +uint32_t um982_heading_age(const UM982_GPS_t *gps); + +/** + * Get age of the last valid position fix in milliseconds. + */ +uint32_t um982_position_age(const UM982_GPS_t *gps); + +/* ========================= Internal (exposed for testing) ============ */ + +/** + * Verify NMEA checksum. Returns true if valid. + * Sentence must start with '$' and contain '*XX' before termination. + */ +bool um982_verify_checksum(const char *sentence); + +/** + * Parse a complete NMEA line (with $ prefix and *XX checksum). + * Dispatches to GGA/RMC/THS/VTG parsers as appropriate. + */ +void um982_parse_sentence(UM982_GPS_t *gps, const char *sentence); + +/** + * Parse NMEA coordinate string to decimal degrees. + * Works for both latitude (ddmm.mmmm) and longitude (dddmm.mmmm) + * by detecting the decimal point position. + * + * @param field NMEA coordinate field (e.g. "4404.14036" or "12118.85961") + * @param hemisphere 'N', 'S', 'E', or 'W' + * @return Decimal degrees (negative for S/W), or NAN on parse error + */ +double um982_parse_coord(const char *field, char hemisphere); + +/** + * Send a command to the UM982. Appends \r\n automatically. + * @return true if UART transmit succeeded + */ +bool um982_send_command(UM982_GPS_t *gps, const char *cmd); + +#ifdef __cplusplus +} +#endif + +#endif /* UM982_GPS_H */ diff --git a/9_Firmware/9_1_Microcontroller/tests/Makefile b/9_Firmware/9_1_Microcontroller/tests/Makefile index 75b7548..732b00d 100644 --- a/9_Firmware/9_1_Microcontroller/tests/Makefile +++ b/9_Firmware/9_1_Microcontroller/tests/Makefile @@ -27,6 +27,10 @@ CXX_LIB_DIR := ../9_1_1_C_Cpp_Libraries CXX_SRCS := $(CXX_LIB_DIR)/ADAR1000_AGC.cpp $(CXX_LIB_DIR)/ADAR1000_Manager.cpp CXX_OBJS := ADAR1000_AGC.o ADAR1000_Manager.o +# GPS driver source +GPS_SRC := ../9_1_3_C_Cpp_Code/um982_gps.c +GPS_OBJ := um982_gps.o + # Real source files compiled against mock headers REAL_SRC := ../9_1_1_C_Cpp_Libraries/adf4382a_manager.c @@ -73,7 +77,10 @@ TESTS_WITH_PLATFORM := test_bug11_platform_spi_transmit_only # C++ tests (AGC outer loop) TESTS_WITH_CXX := test_agc_outer_loop -ALL_TESTS := $(TESTS_WITH_REAL) $(TESTS_MOCK_ONLY) $(TESTS_STANDALONE) $(TESTS_WITH_PLATFORM) $(TESTS_WITH_CXX) +# GPS driver tests (need mocks + GPS source + -lm) +TESTS_GPS := test_um982_gps + +ALL_TESTS := $(TESTS_WITH_REAL) $(TESTS_MOCK_ONLY) $(TESTS_STANDALONE) $(TESTS_WITH_PLATFORM) $(TESTS_WITH_CXX) $(TESTS_GPS) .PHONY: all build test clean \ $(addprefix test_,bug1 bug2 bug3 bug4 bug5 bug6 bug7 bug8 bug9 bug10 bug11 bug12 bug13 bug14 bug15) \ @@ -189,6 +196,20 @@ test_agc_outer_loop: test_agc_outer_loop.cpp $(CXX_OBJS) $(MOCK_OBJS) test_agc: test_agc_outer_loop ./test_agc_outer_loop +# --- GPS driver rules --- + +$(GPS_OBJ): $(GPS_SRC) + $(CC) $(CFLAGS) $(INCLUDES) -I../9_1_3_C_Cpp_Code -c $< -o $@ + +# Note: test includes um982_gps.c directly for white-box testing (static fn access) +test_um982_gps: test_um982_gps.c $(MOCK_OBJS) + $(CC) $(CFLAGS) $(INCLUDES) -I../9_1_3_C_Cpp_Code $< $(MOCK_OBJS) -lm -o $@ + +# Convenience target +.PHONY: test_gps +test_gps: test_um982_gps + ./test_um982_gps + # --- Individual test targets --- test_bug1: test_bug1_timed_sync_init_ordering diff --git a/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.c b/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.c index 2b33b4f..230efb9 100644 --- a/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.c +++ b/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.c @@ -21,6 +21,7 @@ SPI_HandleTypeDef hspi4 = { .id = 4 }; I2C_HandleTypeDef hi2c1 = { .id = 1 }; I2C_HandleTypeDef hi2c2 = { .id = 2 }; UART_HandleTypeDef huart3 = { .id = 3 }; +UART_HandleTypeDef huart5 = { .id = 5 }; /* GPS UART */ ADC_HandleTypeDef hadc3 = { .id = 3 }; TIM_HandleTypeDef htim3 = { .id = 3 }; @@ -34,6 +35,26 @@ uint32_t mock_tick = 0; /* ========================= Printf control ========================= */ int mock_printf_enabled = 0; +/* ========================= Mock UART TX capture =================== */ +uint8_t mock_uart_tx_buf[MOCK_UART_TX_BUF_SIZE]; +uint16_t mock_uart_tx_len = 0; + +/* ========================= Mock UART RX buffer ==================== */ +#define MOCK_UART_RX_SLOTS 8 + +static struct { + uint32_t uart_id; + uint8_t buf[MOCK_UART_RX_BUF_SIZE]; + uint16_t head; + uint16_t tail; +} mock_uart_rx[MOCK_UART_RX_SLOTS]; + +void mock_uart_tx_clear(void) +{ + mock_uart_tx_len = 0; + memset(mock_uart_tx_buf, 0, sizeof(mock_uart_tx_buf)); +} + /* ========================= Mock GPIO read ========================= */ #define GPIO_READ_TABLE_SIZE 32 static struct { @@ -49,6 +70,9 @@ void spy_reset(void) mock_tick = 0; mock_printf_enabled = 0; memset(gpio_read_table, 0, sizeof(gpio_read_table)); + memset(mock_uart_rx, 0, sizeof(mock_uart_rx)); + mock_uart_tx_len = 0; + memset(mock_uart_tx_buf, 0, sizeof(mock_uart_tx_buf)); } const SpyRecord *spy_get(int index) @@ -185,6 +209,83 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pD .value = Timeout, .extra = huart }); + /* Capture TX data for test inspection */ + for (uint16_t i = 0; i < Size && mock_uart_tx_len < MOCK_UART_TX_BUF_SIZE; i++) { + mock_uart_tx_buf[mock_uart_tx_len++] = pData[i]; + } + return HAL_OK; +} + +/* ========================= Mock UART RX helpers ====================== */ + +/* find_rx_slot, mock_uart_rx_load, etc. use the mock_uart_rx declared above */ + +static int find_rx_slot(UART_HandleTypeDef *huart) +{ + if (huart == NULL) return -1; + /* Find existing slot */ + for (int i = 0; i < MOCK_UART_RX_SLOTS; i++) { + if (mock_uart_rx[i].uart_id == huart->id && mock_uart_rx[i].head != mock_uart_rx[i].tail) { + return i; + } + if (mock_uart_rx[i].uart_id == huart->id) { + return i; + } + } + /* Find empty slot */ + for (int i = 0; i < MOCK_UART_RX_SLOTS; i++) { + if (mock_uart_rx[i].uart_id == 0) { + mock_uart_rx[i].uart_id = huart->id; + return i; + } + } + return -1; +} + +void mock_uart_rx_load(UART_HandleTypeDef *huart, const uint8_t *data, uint16_t len) +{ + int slot = find_rx_slot(huart); + if (slot < 0) return; + mock_uart_rx[slot].uart_id = huart->id; + for (uint16_t i = 0; i < len; i++) { + uint16_t next = (mock_uart_rx[slot].head + 1) % MOCK_UART_RX_BUF_SIZE; + if (next == mock_uart_rx[slot].tail) break; /* Buffer full */ + mock_uart_rx[slot].buf[mock_uart_rx[slot].head] = data[i]; + mock_uart_rx[slot].head = next; + } +} + +void mock_uart_rx_clear(UART_HandleTypeDef *huart) +{ + int slot = find_rx_slot(huart); + if (slot < 0) return; + mock_uart_rx[slot].head = 0; + mock_uart_rx[slot].tail = 0; +} + +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, + uint16_t Size, uint32_t Timeout) +{ + (void)Timeout; + int slot = find_rx_slot(huart); + if (slot < 0) return HAL_TIMEOUT; + + for (uint16_t i = 0; i < Size; i++) { + if (mock_uart_rx[slot].head == mock_uart_rx[slot].tail) { + return HAL_TIMEOUT; /* No more data */ + } + pData[i] = mock_uart_rx[slot].buf[mock_uart_rx[slot].tail]; + mock_uart_rx[slot].tail = (mock_uart_rx[slot].tail + 1) % MOCK_UART_RX_BUF_SIZE; + } + + spy_push((SpyRecord){ + .type = SPY_UART_RX, + .port = NULL, + .pin = Size, + .value = Timeout, + .extra = huart + }); + return HAL_OK; } diff --git a/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.h b/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.h index ac41470..9153011 100644 --- a/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.h +++ b/9_Firmware/9_1_Microcontroller/tests/stm32_hal_mock.h @@ -105,6 +105,7 @@ typedef struct { extern SPI_HandleTypeDef hspi1, hspi4; extern I2C_HandleTypeDef hi2c1, hi2c2; extern UART_HandleTypeDef huart3; +extern UART_HandleTypeDef huart5; /* GPS UART */ extern ADC_HandleTypeDef hadc3; extern TIM_HandleTypeDef htim3; /* Timer for DELADJ PWM */ @@ -139,6 +140,7 @@ typedef enum { SPY_TIM_SET_COMPARE, SPY_SPI_TRANSMIT_RECEIVE, SPY_SPI_TRANSMIT, + SPY_UART_RX, } SpyCallType; typedef struct { @@ -187,6 +189,23 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); uint32_t HAL_GetTick(void); void HAL_Delay(uint32_t Delay); HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); + +/* ========================= Mock UART RX buffer ======================= */ + +/* Inject bytes into the mock UART RX buffer for a specific UART handle. + * HAL_UART_Receive will return these bytes one at a time. */ +#define MOCK_UART_RX_BUF_SIZE 2048 + +void mock_uart_rx_load(UART_HandleTypeDef *huart, const uint8_t *data, uint16_t len); +void mock_uart_rx_clear(UART_HandleTypeDef *huart); + +/* Capture buffer for UART TX data (to verify commands sent to GPS module) */ +#define MOCK_UART_TX_BUF_SIZE 2048 + +extern uint8_t mock_uart_tx_buf[MOCK_UART_TX_BUF_SIZE]; +extern uint16_t mock_uart_tx_len; +void mock_uart_tx_clear(void); /* ========================= SPI stubs ============================== */ diff --git a/9_Firmware/9_1_Microcontroller/tests/test_agc_outer_loop b/9_Firmware/9_1_Microcontroller/tests/test_agc_outer_loop new file mode 100755 index 0000000000000000000000000000000000000000..3cfb6ef6d018b6643e6c1f48828375cc6d13dea5 GIT binary patch literal 156528 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 D*j~j7 literal 0 HcmV?d00001 diff --git a/9_Firmware/9_1_Microcontroller/tests/test_gap3_temperature_max b/9_Firmware/9_1_Microcontroller/tests/test_gap3_temperature_max new file mode 100755 index 0000000000000000000000000000000000000000..d073d6811fb3b65a54a81c080d4365f4d6f412c2 GIT binary patch literal 34088 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 E0sNFG#sB~S literal 0 HcmV?d00001 diff --git a/9_Firmware/9_1_Microcontroller/tests/test_um982_gps b/9_Firmware/9_1_Microcontroller/tests/test_um982_gps new file mode 100755 index 0000000000000000000000000000000000000000..8f96f185d93a4ddeeff554a84b17c5e1c230aacf GIT binary patch literal 99728 zcmeIbeSB2awKu*elfWc^fP&&142qIqfP@4{R5X#dV0km3VtpBhWI{%gOvp?Sq}Eup zjY8W@#jCB_Le(00^fp%P1Gl13s6{VrAysR8eF!IxW_YMb~nte_fP*ZSO}NEk%sehoUIu`+$+4e65?!}WjKAl z#ies+e|dKKBBt68iEK~m2a!%Q3i^CYXD?f7&zAVR?P)^6U`6muSJ^&aB(Nr;0Q@-V zb)qoojk@0|Lzr^Kj&#u!yT*mj7mhS8566<6^hAqAuT_@-Y|`^6deEUfe7=fsq#;0F(|x|iy4!MW*4V9#pahvbcFVs)lvuxR{O~00VK{xh6(OS;lG0m)vhvt%;VVcC zz{P1Az%TR`std;{I{90(+v3loa0rv1WC!IelJ-V9%~CGQ*mvtRX?^|V)U%uTw*K@=6uo70Vgzk+DsE$$)LU(Bs7@zXdeabo%Pjr| zFOH`TieFl~FyMH9pFeNmmuAnJXITgALFuhY6)v$jX_;-ogiPKFg=nIk2$ai1MuCF! zN?qbj)h9 zr0;=#_Tx84!PFNI%F6tsce})9ZLG{la`d@fhkDn!xAyK8(ar8L-K}n4H~heMP#eK( zk85|aCn{ET2(grD9??|paf#D;w*F;I(U)|&3=!=dDth{SqL}46hnDmZHxuQL3=}(2 zzR*nfY!$0I2maukPUOk-fh9YuU1FLplj$lc?(~%udt8}UcY>y*r|LM;*LRktPddqX z8>jhDcp3+Ki}RAPyBP9LWxY<>MreHS(y;{cEzx{{x9df5-;I>DsXZ;Nsl4z4v8iLA z=poNX22%E%m7Qn(;2fQ|16r+xgGfH}$G}2tlN4r`o zM+;Bs7}hWC1$Be>;ho^+9oUA%xuj{QaAj^_`}}q++GddG?HE+j>+#+?I$iNWcz(|vdl>}gO*5A0Lg0mRx6vpctjq0N`+_}yE!eo9Qyed^y76|_O*4r zuR9xkHap){4F14FNe}ASG|9wkv+$ZufH%@5HjOdyc3XH2C&2p;;K7H*`8;UhRh|Iv zFz_h9dG@ZmYHJ^So7LB-Ul;nCh<3Q4TX$Ty9k^Zu`kqnZ&tFrz?L&WtQy#%`o+0S} zfJvMB>s?ohc2jg`xrSbM5)~oh){eMjg^x-8XlO zX9e2*#_qcS-#XCp$K+!jaR$WU+X2JorN3@PKJ60ze`h*m+n?D~&THxlK6hv5k1d*q zf4sYR-#_{u>OjAxuhssZ{alnRAH8|+`7dnVd-Drha0>6((HtML-C`>JFm19-jSnop zdHv{Po7dlRYzt2IU6$Ps8_q;oD}M~~eaQF4^OX-}zLeEv`493*{a$6rOdVfg$V~WB zL*`DvQszOH%&i{CjB6?LAjo_dW&U#a;k$Mhe}gi^|JY=PKan!8hs^6CGtT46jPmgB z$2PkmGtPc8%Y4Y}hRir)`C4Y=OPMp`GSgm;o}=3Rc~MN8aZzT~u7rmJmU#JMm$ZG@ zQa5m7WdM70nc=F;xg|Y+GRpw&)AfwB%5+XH*|`<=mOVr4Bz@1bCB^&oxUBPvEq(T` zo4>Vhrd##lH1xGh^x?FAeeF7L|GxGF+Sb|E){{5YN1Ax8`pBKUR(<3SUZan6fcM*Z zeHO0ID(Q*v`V3s3QPQ)D*NAzjr{{RB^wtU3gP1|ecgTu|SY{i_lnhZZjx2-ND#NvE z%V29PBccOuP&zSh-y9Gg1Xengu&UO$rg$LUAfri^|>ebt*X zKxZ|k49M?98fDl+88C+0`h^@X;R{Z-UvNA70`h_}9E&x(Fs~lL>&)&SmwR2~M>9>z=`QI>H}K?GN84o_ zuu2qj{NwfhEW`wWiStX!M7p!JOy(GC#IuNDwqQ=d7?m>BK_=K+ckB9FVq@V{$=5B` zScp9M^zKI>6JuHUy6%T5pXz%L@>=!1@9>&^4?6!guMsOzcN=*P-H^_&d9B)y@H>Dd z->Pkh`wOEC;n#H;-Nw-43uYO>2XvW>EFG@b`k1HnVZ?MsY=AiGsAr_~4Lz;U4dprv zdDtJaG2NwZdF{Emw5L_ae6YJt9nWJ7^r*R4=eweKJj)~hh+9N~-_!BFh`NV0wI6o7 zx22&h;=h)AI?|%&(UuS!!*?J)kH_1cjLltXe|}%ZJM4!heavnpKLY#^_b}+E%@C)r zAKX;F8ZyH_?(96*qN(RPJ%wN1@W$cLl{+^2zaKj?n!&f2yTbDa&q z&v9jK$VMHyk1|He20hlH<%h2r-U)r|!n`PHER6ngSjEHpwcWulFuu`x9SxeDDvj#_ zdsG|J?;J+@p<{gyjWo-AQ>+@RbVWP?pH&Kb94j)SX|AUBRcL#(yPVTXLJ3 z&ONjYwm5se5x*Z-*l)nEocq#tr4Eoz`#n5HL@$7T+&JH$?drIQ{Hwg>m_vOg z^<>2M#`*|-jGB*G^J}BOv_3bwi1RMWQLWc8U~A&+l3knkjz(O23*y>aY%w0zYUG+j zv!lG&eZgp~#q^8iP;M&cMdX2WWx4hJ$LCHJN16SZ{9#Q?;(AtDaYvK3GtiT1!(EBj zQhxX1dCFY%HTbg3l`+0hUh)-NgE7Y}!>&|6XpQ^a(_8nB*)b4x zWwI{z0VO}vNptgF-;ShqdK`M6V;qt66z|FD#be$w=NN)`^)Tbq$zs>xOT;e5hv41v zk&LzCa>RZ67*}x%_-1^G^^x+lWlinq7vFgp^FjFY9{9|j?3-OO)->Y zCvAtg8V9~8arvX}=zNrCJCn!5pgBnK_bB+&=~AYf(xd4rkK^qoQ?8cuXfNYkjHBN& z)AyxE|EAKLkxo60fggHKSMrUP30?r^9k2e6-~D51nJkZvgn6pdVVR#zSDVj!geIRF{LLQ z-(9q)*!XV5y@pR^pGGXS<0bT^64-?pml5qb5A!5mw`N5DitE)FH-Cup*Es)<^J1*? zT!T}VIhqmu6lLxJ{5sBAX=2lJI4^LEO{;M3!YRvD4v4;wa+&F3(}oPOsb+vme_=rM zZKUr6{PaMTHez7(O{7irV2uN3S*FB-ZrKRC#N%qK_gk2;Y)jTC($Fw`bdJxZZ}?y$rrC2WeO1cY-Tx5M#|tT%spC z17jg#k?c&-Bk7k6if#Z6d3|h9v>Df2YetN-BZo8)JBinSaE^WLJMMRBQ=|?5*5Yvu zk@2jgwR>>15ww`kQ>HB*5^eA4dk8m9PI*MqL*2%CfOJn-LEfF^H|+9;06HT;}AtY-se!ljONr^KlY9Pts+-2+xlVjq3_L zpKI{!Mf;2MhDFy{JWIc!<;~_8v}%~dmF1x4!4@9}vya2GEDJrmblFqnS=PJLs24o{ z4`Mm;#Z%HBH$3{KljQkb;KJrlis#pK*)PI#?eMs+!1Er1XWSlaACrvVJq8|h{G8_D zBy`-W%YG4lU8mdlebC@n>bU0gXjixFfBo%Zmw^kOzpnW>37)yeEZgIFJkQKHbS!kn z*4}j^u-=|Qe{nEArykvHv(brX*yN~Ca!46ApAp@Ib!snkk2M8(ABpS2o+lq@_hkO4 ztM!~cUHd(qUGm=0Ylpwu`s`!vt!HlU>U`(TF3%euTIpDKUZCR=;4=2eLEp$J9TClh zk7Nvz33{2Jw-xkW0X;A8HDw~!cpP(eZ#*^`2fTX@oDt1eJkl3-q726N9?36sS)lcE z61vRRWgWWQiggfEXXbo-Byf7yE!}!7v;^y|8P*!rspvZ}BF-=De4vs=@}E93>c<+= zKG=;--@G5E=83kp%O4r11=&AC?478u@_v@?|7^dqgZH&pyLWXp|McB1kEi>eZohe; z7X-cgKra*YPSk#Tz^9hO*?xPI$Y72|QdjViJ9ODoXul_c^G~(kgNDx0eh(>GBu~rE zj2=e&Ej`)xyYEa}``x4EaoDc2{jzV}&|dw@uCCVguXgPp^ab1R(=%iJF9-C3ptlwD zUID!mwcj;L=0yE(NfH?nwO^SodkXExwd8-Q{YIV@*E!m6yplz>U&~q1Ex1SZ!QcA# zzrl(6-yVY&`rimG&k5SE`iiFZ?1MYInm^dn)jH@4`cI?%f}ocJdiR0eR?s_9`yIx7 zCRzV`A9;y&y@>eIdQPNo{dtGXc&Qcl zsBHG%W7p}cpwIkoV%{z8Y%0&eT>DnUsKV=tjzx?&7IW7Duoaf6X8J|Pi8%w!?adXt zy2{>qxvT8`c+6R=Vor^JN^xh!sDyFn1B!1s?x9S!5qCbQb>^_oiLQ9;MP58(T~U!y z(wlS)Pa@AZ4S6(;m`ui4kaR4s7?Dt>TWm5Ju_^r2tx06+M!T?Wbo-DWKAV8`fK^@x zpIJz!zOp$VK5~xKnOqaW+DJD14%bFHDu(sv?VfX@(`~#Nb6W6LoP@VSiFkV+yyYk0 z4e2r7&OX=1TQlyzSiB8R$lEX*Z-cch92DT~bc?q(=RAL#owqjGj``O5YV*g@_Ocx> zc6sjo&#um1WyhFPRe$?y?fXA(?aIFCH(kv~0>S4 z?ESC@c_-5kId--dey81Y`b%BaGxu~g8|yWmBM-JWU;kWJ*+2f!RrZ_2eUbPvn>E&K zwt{9RXa+&^K6A~cB5_~bXOqR=7hg^yOGyGfbL{Nw{%(8q@B7c6lF4I?otAGQ4U9=S zu)!Q->^uUxLD20tkE%%A55H}b$=(m6Nn}dY55KO-Qev>bbm;NC|j z#(6$xGe(Z{aXn%!PxiknRK1ps+jUr?_2TG%iF7zsmpug?UI3ilbxYvK%CXnLTFW~n zU$$j*d`y8a8=++R9qv1czc-bKow^(~Cc47B}Cem*Vy}!Ne-WR)?o$I_wVpMYsPwF>7a~^2k=UnSe z5{vxQCX3w%?nolb?MeJbnd{%$%L*Uw+V5O9OCrz7`i*&@I}dbUaju^w@r8HWWU~9h z^+{y9Dv?ZMt+=H6g-z|%5A5jjq`%Qs)*X)>o3DJZJ^Pmb=xUvJpv&`7+`spWO%$D2 z|1I^#V#gq82SGa%wC92LiDHwhZL-<>^ZX>TCF;+my6h?R=SjeE`b2ww_8dPpxxwmZ z+9!IIEbrsqGX0$Pi?4j%+@5pOkGt;s`RiSo87dCFNc4_{PaFHDH+ubF9R8Ah{05gf zH|pQV8^_xEIG!O`#DL*(OouK>^AdK5?K=2%ywP&6l`V-aQfDJY~$!D+06MD*v5bd zlq}c5X2k7xmv`Y;+l{mj+~fXDm)$<}b84+E-){HZ@zbvC|MO~B>uD!$i+=rBJ?|Fl z$6GFlwaHe{&IIio(B2B#@qV1ZzAy(|rsS~3WxIWSS?k#`E@R)PToa&O>bO8ZN7rwB zTV;%Idn_Hs)&*kYTRdK1454F&d>e0ednri5TOxbO)@4t@UPc1PX)k^28F%4c>$;KH zb0P1yw&=N&WB$|Tc|B$?ZJhrMRIF(b>vQuuf90*Ic337P)SK zw(b~@HSY0Pw_m46?D{dogp0_Rf+D2mj@%?@_(#CmRE9#H= zN0d=(7?QVbNqBSENE_$KKhR|p+eoaP%{lT$;PkG$7IEcL>|;n2SITiHhTG3ZdJJ8{ zM!u?KDRtUN^|g@YX z*Zxx*Qxe<7vlqqe;y%#6544Yf_AAF9Q>2~jRs1KilV2e3l>7yr!#=K^d~WGZ`-|q} zV~X?_kJ@;%+sXHn@RrC<9?)e^!A_chb9_4)%(ykVoeaO&W+x3wmZ?rVslGVccGTf7 za;!N-^Njo3J->UrtF`{OUDZS4vBycQKU;R9=*0X-=J>dsfOaNmZw2ijXvbrZe(PS+ zPKp)(mYu}reA1s>ruFOaCyn;l!{SNLYd&=Uq*=seO6C)d*w&8kmTN_AITyucIs%&a zfo5EmesPqPWq?hVSR5r~@g$MOG1s$rxk$Csk*~LB=eKrwo_?#VEbYWH88M=bPOP1- zjmvZ&Xy<@-CTPzC?YL|Sd@KC^Z?L`*8)FgMn`7)D9IZgf_E3 zQ)-J7_nu(Buxmn`U-+^HB?}(Dk!^Mezp~A)y`*28-H5V@+N?TBn`IAD?}9nbz3Bxf znp?b`8|zy+pcflw9#1@mVnbhioIx40ZKfkHQQIV(XZC+aLE2GP{27Hd&)A8QzK$DX z&nP6a8_Y9Lv+)+Qn-fVlZdf(JnF<(v0F>d^OIuz zC=)buY_T==_1T}DZ{b{hxoTr;Y;xITu1q3xB740-mpui0odcZSb=PBEM%lyIv+Qh-f)m(d z!ad09nNf2+&DkD__8}*;$CG@15B)4JEC$B#ZDZS4miU>`7Ehy5 zFZBK{Xvy&(d;6rmd-I}vF9Y}GQ}5in&$UZDFWXPwzf-ZA)))69Su$w%3h%(OwrS+5Q`QTG?J-bIOKwd7q=bb|;gmcB)OL!J5yLXfKy8`$c4W z-l!Kc{SVfG*apuknHD%@!t=Hh95TIQ$<)8EI&AQFpnbCKbU>H=A~FT0#dQgpb}E^^ zqGTH7lnKwReEzY$Uu{j+POj;3+OWMJYCcb*ogUIduB zHO=oKow0%J_vaT$y>J}O#&bN)MR!~Gr2EIhExhOQCB>^_4kdln0<9;9PT|W&kS~+B zE0eX;E{h-FNSb)L#Yx-VL|xX=PJGtUY!5TOJ_k6?c^UTn+4feNxc%C4RdL*|(3XQi zk8=J7d+6y~R+?>zIrLaH9?WH%dG9T+U|V87Jr?@Fy*}$51$=kGp@FM*tM~5kT?W)Q z-l^Miwd>O81hwzHnR|@*%vF-M>cBjnyd-L?_mFq8efoF0>?!DVA8`8VHCa4z&80RS z{!H=xRqH(j@o^OIm8ko)?;&ZoyDpV63gxS2U(5GKJ+6|qI$rrcXmlc8@wmjt7>ky& zoYsZJ?=k9xKVbPp`ry09G_H(?#W09u+ifoEpN(iWFq9z7d6O*mfHUT)+2 zTFr~2e<$MmYF)M;-|<+)w*E15@FDP=+-L4Gc!4Zalq@4*BUw15yog&nFT_0ILd2TblB*Ka+G3~mznGK57W>h9ThXd!{Vwc_#vGmP z$@wXMkB;r05$)o7P@47bC+5)xCBJ81VdM9`Bz5dF_>IxM^@`|Q$>{#dPWM0(y8oVt zZqb#|my^+b=1LpCKTSgS;Y4&_xHQ_9jBbye?&c(P@$TDLzo#B#UnvpM?Q8Eogg?{BE(+y(J0Vl0h`0Y;Q)3@5| z&Ph_Y>93?-u{Jkamv#6n6+0YEv^F;gIDIqi_or+=ZSNrZv>0x`*kPnQt}FPoUaWUe z&JMhn=XIR2-_ob)HF&OlK>iO=&RF}v9t-$1_&fTvD10IP9b*DMAL1?Xj-CSlUafrw ze4ng?F$ews)9&aWx!#gyy(^1(v2iQIT8GuP_d3cY@=J;I`Km5^3i|xN!0FpN$acTa zrqA^!(5K(v7y8@^dX#4)ba^*UKATv|=Qp7*)8BuDc~OT?`Fp-=KhfOv&jxMy`|oJ^ z9AhEh56C)sc0M52E&9)czl$|n#Bf@#cO{{fNUsrH_7wE$2TtF5yI%3m?n8QSCwYyv zxobe2H|TH~aG8HD^vB;a+B5e8T5B@>WjkcxLr-OzUx%J90xi;me>uptWLzKRI?3Ig z)_l%UPyadUjDc}JQO~3#^(4~ag}SUmhvvKM>~<$(ljQxl$KVAz8>DphYrJENa%dTk zT=Q`I*3nOP-S;uxp`q{h;+bNRF5kOybS&m_rB3;IKSS-q&^qD049wS}nb28I(tQ~5 z=PuGwj&rxS)H)5@x>N1>(>C}H@)GrJbI%{^m(Tn|j#kLg3^_c;J@I7Ekr->-7C!3F zf$zz=&l6kQPN*CCJhAF z%-4tEe%Nq4n+sc@k4knwY*%L7Z-95N;{AQRAFpGt8b{A=YIhB4D!%}E97~(i@lN}_ zqPPt23GDnYcX8jl?qV(Hd!w4l&-}>Z*>Mj{`bl{YYz*#!jln%IoF}*k7Q>PE!0{XFd#>XgjVZ=;MEJJcgDQTv(q#x+m+-M0FfN}aBs!S*ml zO!iFW;|Y8g#+11>-t0bWUJ~9C+13@h>?zpRCBSjs8@Jik`V-ie%i1?5eGP2ud?iZ< z-kYiI1GaXM@2a@*zhiMpn~Z-P&ly0MGF?AsAa!}jqTla1gNlCbe30YwXNcW(U+qL0 z)y@aGzVKJ%p`F{D>kH<7AM(KQIoZ40PV`Kq#*f7o*9?i-Y|{6)RrIrqgS-d5$0ke6 zE~G4blgQ$*3%P$CFC4byPHY!#+RvM7x=#Yf`K+z;S+#7oSAsD@w%bnYy_>KLxqtm3 zCCisByJ%DKsF_?0sLx z?8)2skijqd{%Fu+-#cu*PuJGQH#yo^z6Zc~*NASntmmzFjYxg`Vwmi|y6?x|H4=}@ zx!(ysUiSUZ@!s8d-;c#tvcLQdd5QXdBvD)alkXbQvIs>dW{2kwkJ(}Jca0?QYw!gx z+GMl)wcSZ%n~_MiFYvCBm^{Y2Mlv~XYK+U%|6L=A`_o379QOY7tt4_JviJ46>?zoL zJ#hNP=WhGE0J4wg)84k;p{jk_awW?}PJ74x_01o|eHzCTy#F)S_nq&^leYdV>s_b1 z?|(_l=kP5zCTdgoI*-`j9(%_j-X)sQzvNr*Fx7QTNm7UTTz#zV|H(bnPCBtZ@!%P; zK5?>psAYdgpTGyzjQ(!7rT;}H!@A#nZ z5BdIe!lVaUd(^izWE#tWA2)a*U!>3brm=6&8FN+n9Uyl}555txsY!hckndIZ5C`e} z7UETy%RK`p>inJkJD$)3zULCZ-({}3 zksjy7`M~A744viJ7LaqNtv&EA{R<$2*6op@P4b(Pk|%s~EnD4tBo6a3`MpWqF39&9 z?V@pGZG(J8cW10^_)QCbHwAorz_tO*Z%azK@&5kf>Hb-KLu9kkz5Fi1K+(%@FKPYf zLHE!>uhL4DP{C`d(e0AjRp_C=fwMWUVP6< zf14p2-(@iA_O5#g?@AWYYT%7Id)Qi+xV!yU#&|+RC(1stN51RGR?g*tyv?edH+mt; zN&F1YPWhXO{1VL{-W`s7m#10rJ0g0PF7K#sxKUr^pI5Mz_^&j-OaNm1m<_3NTOX;!)^wc|xK^JY;hqeWtY&R#}`_+Av zPSDFdvhKGrn!(_XBW!=vy(iueEqhS5!ull7v=Pwf_h|8K=FV9C^eOo6!eM;>sP7D% zM*lZuyI()&Ff;)V^1DjlLEG*bcoqWRQXpSjG+)Xt`7I0VRj_zOedJH_XxQ;#@Q6Nv z?>8i{W3~hP9LkfwY_xGq7M1r=ERXGyHON+m^1?SAo-EeB=aAQPw^;Sj0Oc1c=cix! zZ5i!%?BJ*;80?0wdpL(FRqet48OtAzZ!`_ZH=HJ0-*6gh=;9-k<5-acIyuAf9i$;* zC%>oDnV^m`bzd0rN&hebJZRkP;Dl~`XKC%n!28IZx$WxVgEo{67i+0c)}d*$4?A_b zA3BZu0>^jHD#on&p?l1Zz6Z+@cz+4JzqEJs4wh@(d&>^C zW9+-Wd%wR!wPTBJM}DWuY{#uAgLbs?RXc8l{Ip-)j{V9EDZ#fO$L!F$mi0oGR`BsI zbj@|f&P$X&@eF{}XISa;O6U{MKyI6Z{|{|;fB*8$?jKy<4BD;k(L2y4E%aHQjIy1rGso=M?0)C+ z4)`tdx!L{hwD1g@3+D3TY|u0-{m{Ga$qk(j5+jU_~uAde|1oNYJUivLBPqnb5IPY6LO$kHh40j2k<&r++ChEMV1mUyTd$TWvBHitCB|v94UBF6r-FgEw3~Ttq)X z{x^~L3F_bI8nR&{>c1L!W%$0Fv%c(1#t`(iN}rICzR>w>mX51iikkPk;2^P8}gOTdH`MG2K)t z$BFCQ;=qf|4~#MPR~!#uBa%MsM9QVdc<48gT&?OGc#K^=kT01X(e5~QXM*1tecCeW z`y=W_e@Z;IV{FzjCC3lO-t<|xmT{N1<ikAHlbPa$JKpT!}Vk?3IH& z*xH6MLo6FG<4p9UxbJ}9*n)Q@|F8nS1AdR+09}WA@r`Hs-T7A4hv>IB54i^Qzx4R| zYbaam<2SF_S^*yco5p&YY_Hb6kL@^KTW>?Yv#oWT={kx?`*?KF4@hS|`a!I3$i9XC zh;K!1!}GLHgE!qTNQ-?p)@NBZL7z2w%T{`$j4ay1ez!@i=<^286`7v3HHc3>M ziaWB+zJb_5_6^1z>>F&CBzPmWRGrjj@aCHlBI2cis=&%ptFy1K)`; zJac91OvF+%5kn7XYCi&>%(0H;J*6Y%dXRvBmEUDVKEKO21#6Wb!*6qp;CzXG=;|RQ zJx_y%HD-I{n0@~cVdZ5e$jd|?%F{)r5Hn;uz3H9V`#sSo8HGS8|Ml&2XKk zKyYri^9aT@e3KW?IMT=MzMS)vj`e#kkIhri9`-m<9>%jb^v+FyFi&zxT6P2t@E6tpMI?G=MzSWOUfPXIRN8_K1=ajJCMH*hvc>W}55Fg)G zEKUP%3Gki*UNiJ$#r(&w-^9HYxDS7UI-7uZey})j%0|0nBX-1GR(`Xb-$LdX#naMp;{AqM0-gR!wQ@|(s>S3-wpl@_2yd}V)K0TRbT-PgPy&7g8}YDXW%d>!j8a;*vb_eMoKG5;24tA2_1EwNv6P5}Gqp}ZfVtmkZ_UxB9VSHlN5 z`qfO#HnXw50oQc=EOrdV3GL|nIYuDB>XBuiYo zaQ>pXV&05!(}uwVgslctF4W|uFSw`gIhm@#99_u2);MN_3yGnbm=cmEp!(FMuqOC6hv-hRR@_KN9dR_BVusbt{ZaGSNSk-1JW+Tm4g^ zs|2Y_{WUAW-n?01qp~@HK&5xGcYd%g;4KY@1GUR*)*9K@`D=oe!N^(^DP0jTGL{7D zD!ns9wY7fy#s!;K7mRq91XeW$>MG3Qvnzo;(;p6)buTXWUO27DTOL@^5D15Zp*lqf zsymeqn zmfq~WXyVkVVXvrAEqbYUHTC1AosOHk5I?zjdHH#T1(WjfatjOd3Mb_k<`qoKU6`9c zB|pDtQqk1nY5BR==jH>>&6`wQl$)QQkHWbNawks7pHz^$U_#+^F{gCid>a2bKe+{kpi)p+m|Hp_e~wWwSZ6VseS1R)wg#Xvkdpvu z&K#pog=CPa4WgNVKfzn;Z-6cJr(hIbc`9k;Yy6R5q_HyKjceVzP{aYa4sZ5~Py{}ps4CYRSW_RU zh`=%k<_L}5k6J;&)S^knQ>NzSd6#&z>jEoK&1z^ao^Hsdv%OWJ2Jey>EhyY#&9DLQ z_1^4)iIqX*cq?iCfpCs6@{>`$UesuE3Fzlf%ZJ4kPoGlkoh|a?kU_0J6b@1Z$>VHI zBT!q9E*_3FuyGp#k;aC)uySw+d}pR zfo^iCx2mzG#v2aQMWmx(dwTsysR{;aD#P*CLN|`LRb`HViFj8vqSHmziaNN|us;$O z)s>-o;jghQK&%La&?UoxdaI)HrC$QoHS_`saYmsuec4;56ih29l)W_%y>)s)(e(Uj z1yk8!X?zH?#dBsIV?6XCa3X7+p*XHI!R^oiP0>5svsHjbUNYvucydlgTjn zkaBPkL~_si;@n?nF&wA4aKf}gu{utH9m}hFZyh>cMYX>U;{c>!Ar9-8di{-&P+h1t z)EM?w2mBZmS9rA-6DmQ}hAIPAX;QIVnM_k|FZa3$`FXmut`J@mHtW5;I#B181}@2X zud@j0x&mwb6%h=1c~D?po_1&!L@!z#BYQ`nA!Ly#wUej|_#3ML45?WD>=v`S`EilT#IbVvHM0r&Vi6|XLbqx*hdo^nz=VFc*`BMre6;7Qt z9Yph{$5@rUaqi+co%zS1Gv7fc|0)Na`JxKeda0KqM@;}c)YjJo5ct?T|IG6FbF}t# z`&0jO5b;^~wHV-oK#d`WF}lE(K(e~AZly+sfy<^Oa?y~if7!4MKD5nLHH2!t5Lv2gvO^O)*Ma&hXO+iI_!k}*`OOA-)OMQ0~kNzdWzNRuZkdg zixIP`Tkfxf_$t1PX*3vy>%C2maJo|1qgKlt>Qu|3>TU?s`k_rad5f?PaX~0tAF6|q zh69Ldt7`l!#DzLDcY1Ly0^i&@^A^sAUzjp2w_tkFl!ED$Eq`iZK_Q$QoM%x{@nsjt zF!=)1j1ZZzo)4B7z(@pd7K?Hs4UK_VaIMoBYEbOj#=2ky#$Wot8XyYk2QUy^>ea$n zo`L2ISt7yO0Ahp$#dH*5X>IL`S3WO za)?ml5+)r9%4$wzC2CwyL(7a<9sU)8OEKnhY^QqQV;kAuYy4sDF5$s*z4V@Sp@|%p zXt6A(L=H!S7=7U~r8(R2=*2OmF)%fj;*HZ7T{(%y8-z8`VjCH2#l4SFF{(sYsD=B& zgu=&W#sG&=p}rn)*n3mMO?9?;84PIYGH*?wZbhV;R}~?K5V27P6$W-k@7{=h8E9~iC%F{y$7k_;&!q(RD|Sj}~0A+48iV?_l=Xw#n1 zG%(vckSZsz@orDL-s4Yd9fj?4-y}2Isd?T42cDWCE3N`{{^jtdGz4?58^=)vFy^BG z++A$`+ph>SG15;hyF)A~y>7O}U%b@9MN1K=A?QS7RRvdgvlm{sz9!C+SA3{psk%*(#wv?xrkypUQ+3qoepM6+S&qmjc^Y*Umt2<|5&(S zcBwbg;IFC*R#@KF#8K3M)e!N*6&mCmBvi?yelvi%ID!MLGDx3d1^?*dlQFk|Kav4B z1GmOHD_*PQq{DzL{McX<35D1|;3^XGRIufE6Yv#tRNi1Ed`l2I zsT9mpnw8O%rM$TdRcI8OL+V0ka#^m@R-2ym#int3`lkxV>yFR#yqFmNyiL!`V0~DehZF17A{QqQ{-((*k&ZRcbm0X!Or&*Y2(cLHJmnj3^fh61 z;CWp!Sd13;C<<-o3D>RMWHMg3ZdxEj$x`8}yk3aN4Z?NwRw0Hh7p@TjAzlc8m9R+L zjSa{fBO>i`y!`zutA%^%?IJCGjd0IeBht#&3h~5R;ZDCph-F_DX&rZQqch-pMf%`- zg&6mBk@57`B_nB~L@}WFO8ulXkkUX(11SxpG?3CjN&_hkq%@GyKuQBC4Wu-X(m+ZB zDGj7FkkUX(11SxpG?3CjN&_hk{Qp@4!V(gSvi^#dzKZIVz7>uB z29!ZkU428aE>gu*dyy)C5LA7>+CXhM5V7*DvVv)vH0qZy%BZ@5wfv4iLntPt%O^hN zOB2#XcS{=nZd%X3pY*x#x8rVJxBUa6xXT0n%EiGtF>+~W#fq8$FVDTcAsCTYW7EZs zuR&93i{~x!iSdER(qP3(F*jY@vxyXrZc1~N2Py)=)d6vHx_B$f#NFQ^g1;dm8bbAA zO}f~=k;&btU!>{M_qmof`0K*8!HD>_OJvLn)cDtmp>xH8C5z|zVp$bS=PmFpzJ7sk zNkn}0+S2l+KJg$M4&*+0ltd5wfPXhX#=jqYpMM`lif{)ajrHOqSHvG_42z?#wRIKZ zuP)&Z)}g+4Tn&NR5IFw86&A-_>Eg2oiMZ*z{M-CJ`S%g>S_k#}>%{YEcZ5N}2VH~c z&(hMxepz%k3V{P4i1dKilNM@>`07Kq2O7j5(!#gNgwSi zK1r(&`Wny#;t{vvZ)=+3@5gCjvBfRYilq2v>?WGiW=<%?gZPZ6&n^--C+S*3oEUMN07>JFLu zwEWv9^9n>$##Hh343Xg%ZRx=&72*%+;rgIBnhyOGh`*>7QOO46)(l|fMP}=)d#%h0EMF8k9MHLwGp(0dwFA(=owHU3-%45U$}RmNNZT*6P*Jh_`6}C7y#t|&5(Mh zbkZcA8lc=npw7R%CQvD!8DL2cuAUnZ35s6~px%693#j?gaetZ-f~yff9td-moqpf9 z$zg4!>|XyE*l1nc<4G4U^pL%#mJF9KvbH`TzR$G3Gwp+JnbSrgK7$Yng?LS*rsL z!K$@z4uOi5;l^6gnkBMIXDyjtRFLOe5b%c^8v?#15U3_F8{MZ;WR{iA_lc)nzS?SE zU`?Q+F%s~xB6ixIMis{fYGE^w#w412(!hy0^P`q_<^sqr_{jw_LBue+S%eroEZA!}VI`LHuq` zyJtYFtIhpZ`orlTxQ}KWNZ;*Rx;VSdwRl-}{jw%ko9n!B_oUr)>u0WIH&q^U9Y||- z*R;47SK_#}rh0_u;k0H~Vacq^i;5zJ`&@+>Z|^|AI1R@28pOhnxKF{kXbr-f6#Ot= z^h5Xu3a%V(!P^vE1Uq2<^9t@5X~BDS`Oy~qrh-R}vEV-|_<({v@G|75$!q10Q*hx} z3ocUd2MWGM!4F?x<<}_K!*~Mxd_%$eFS6h#6x=-Cf?rZ_S&juC()klC_&o)`aES$f zuHa+27MwNE;@4AP!Q&L%GR=Z7Q}AokE%+J*KXI7_S1I_-85VrEf;}Y`{D^{cud?7a z1sBe;;9n{Dra2b;wt`#cS@5R{KJQBw+^gW$`4&9NWAT5}LJOXz;7thdsK4tKJZp&s zuTk&|OD*_81s}WCf_EtRAY(Y-zop=(ueabH1vf3T;L|d#`j_5d!MO^~{;~xxQSfIs zT5v$Y^KZ7`dlme|Efx$fCGF=Xp9R0H;Jiu;ep|s!0SoR?@S9Z@JPG}P_Se0_g6Apt z*liZPT)|JQwBXeWURrCx-%)TIB0$RjqJsCYvfxeyKOMH}# z!L4g8c%g!iDfmVO&%eXUU#Z}Tf>$ee+&U}&8#-UX-%;?!yR7_26PEqYn5Pz*XR_^UimJEJV~v_|pl$#Oq(C3o*`snKlk* z6EAS^XQ3mX_|@oV%v+)GHOw^P4@N-1gD~;UeBwu7m(06E;cJ*_#J`mnIQT<+GoSd{ zpZ^u|k$(-dJn_-}d=0Za@oUrz-3Sxk%qPAcFF1Y>U&Aa<`~wd8 z&3xkP@rC0J@inaRUjq#ugjv6tPkcQdaeN}ahFPBV590+6{t(~HCw|!(R^D^z7QTjA zp7@2lz`-BloB725$_OiOkiyq6%M-tn7dZGsd^4Z;di>;gO8zy>^2FbclLukqoB71w zbf%T}gsNY|8b2bjo@a>zZ4UGnWykI%rx@%Y<*7)_jz`-BZZ{`zU$DfQxiLYUnXZ^c*frCH9H}i?F<5kA5#Mdy( zC&D-LiLc{Z#=FGVa58)|pZGc+W_(P14Qu=oUf|#l`8V@r{S&M_#?!KX1#5h#|7-JO{p+Pkc{_B^&26#MiLKALqa~^NFwLJDmRzU&9*T=|9bU;_LYl=S#%b zu*T1J)Nke!U(csFzaqYdHGZK(|7Je%_56$TG2&}j<8R~z4*o23r#Mkpj&L@el zVU6GBz&G=WujiYbe-dBA8h;HhaPWuxoB71o^Ha`OiLYUnC;uh9z`-BloB71o^I6Vs ziLYUnC;n?Vc@QSPnNNH@|K)s`_!?$;;^UTvJO~rt%qPB{FLVA(d=0aFqWaBz;_LY} z=i9{Ba58)|pZIz{&iOg-1H8b&pM{Qm;_LZ7=l{glFw0Z^ zWxT+_AL5(&#MkQsTrVKLhFLxlzL`&ay`I4J1>$R1Rs@!NQT zgFg!$`NY@jIb7c%zJ^(z?RS&If0_Bj*XuuA4uFqHBff?; zel}?EAk6yBeB$f%H?GGKU&AcV`knI^GoSc+y^ia5#MiLKck*xM%leJ=K3TtlHU2X2 zz=JUPkEndE=Ut33qXaq3<9Z%pb3Ko+Ue9BhO8!wt20jWl)qhCgYgpqu?ZwO|{wE55kiyrn#>aAmJP0o|$`dBO=c`uz zzd^sI{x!^e>YpbM!o)Z8iJz z_+~!w_4+l}vx%=^mM8wLIC&5zzL`(_PgMOAkWYLKvpn%X!^wj%@y&eVcQjdfmm{C} z8fJOoJMG8JCw|f07Jh}o*RaNS%5UZqf0M!=qwqDX@hg$egE09w^NHVmx0Tn9eDbeh zTuT0r;g<(t;+y%z|Lkj4-Xdjx8rJyE^+GeB`1*bW??1494Qu>nUf|#l>o@a>zyDq< z?=n@thFPBauffSf@zZ{`!fY# zPKIyh6aNW?f02@3!y5lq(B(mRp;4YN@zd|O@?eHieho7}QTv1K8h?buj^ms8#Mk%Nc)yMHYgprZ9QZo_81&^;dHm@Ff(ajW zz<8*{mM_4sS)S`ECOpgmGj28W83&s15(j*R1D@@G{SG+jfV~d*%MO_L6B&<~_Y)$b?E0D2mDtDJ+AAS@+^12oetO~?D5Y}9r4aT9Pm&)N0BK0`Apf*l_1FW*D&eR zen;^F2Y+aPW-2rI`ynDv|a#IO05 zmDhuO)~{ifPt<;9KJhmz{E@gOzJ@jaKG5MonDv|a#IO9em3JYoiLYT?CamAgC;r0< ze~QA_a58)|pZEt9{s4uq;bizapU)e}`ONJ2^9F>?=M4y(&l?cd&l})TTj7O_`uIN% z_;v?Oek%D#9mp0#0qgOY@f%?spG{D(jyGw?%)x;K4iX*|Nbc9VfY)jKjv%uVtWwQ`lfvm*7ietA*}6z z?N3;@Fa055?eFNH2y6dCe?eIL1NL9Sx_{Ci5!U{O{gbfnfAklGwZCBhBdq%u$J3!$ zL#K4O#6!#$oUUMwr_A>#nByto!3yShN_d!pIi3<8p-doI zK4BftbN)eC&o4NBOa2yH^tryke7%0a@t*mE6@A9v%-8WX<9Wh5US~WZ>8bLZ?=xS| z=Q)2Ttmo%kPav$<3m890{ACtDT(4lhUXNfrHx&0K*X*|X6Q3VpzJ5N0&qEN_&pYt> z1j73H13s@oSU-=kP{I273qFs;eEqx;pD!Y;pC97$5`^{h5PW`wuzo&-&%+Sb&%69m z!TNcrcK{G#oQd#Sk$y6`)T~$dj`ysykIy<= zyE)|LTy7lETTJ39@x3PTwAiK-D@pA&k$`PeNWT=lr$lDNcZ_gHfg=g~QDlnTN@7Ek zDY1Pg*niXSQEi{UQf@1ddq^~(c4}x)ZaEM!$l87q1GymtfVB}pld+&U9Si1T{sFcB zB!(gr&AlkLocQ(=Te9AXVoNmkPQ+MN73=LN))o-IP+LLNF9eX!s$&T>MPI5B3KT!cQT7h*ud5g zYd45JO>QAElCU>~TSx3E{SZ+~ZZ)%Z4XDi?J_}MiKClr38y4g?j`*du@k7F~ogEV5 z<_>wm{T=ec+Tww&Z04p8pS3eVZkT*D~Ds}-O23K>$knn+J+a~t!M4z6F$9* z4_o*2jzQUKfMYub<+eWjiG-}JgprW7#n9Soh-UFsg&J!8kqEYq_$=M5Sb;ujT{hIB zds>%~>af0C9YGt`TdMHY1nZ!lNFdCuh1T{JwaX?^qEC{smk!oh+jJb|YlGo1n-$ss zYj%{n#u|v>NDKKYLp3$=!raN@tMNyI5tuBDw*lLX6plSB3`gh43e~N!&!w<7^1r7O05CbSev=(}uA<%nv^wt`F6PHMVv>(m;K;2P4(NI_dIZ zF-jC&L|L)VUxlu8f-HAgTJaOD0jq$u|*V{^{{jA4j2V>&NxK3kV29j4P78m z175JDwvu}pV=~B{d%j306_^#gICIH1Zz-G40rS&-Qu%ao%;EUPlqh^?T4wvXXp1@>0T z0lL0145uiEal{tk8agc*GI0l{WeJhS|?`|XGvN{LEMY# zi*N_38HqH&q3K{Y4BF7PGo>=H8tmzy%_w8-&t-xvGWpsty7c4~{<=W8y55f+rjr-X zpR>SMUOKC^oQzB^_RR@4)ZUKmx46vrEeKX%KnvAH8Zd?g8YWB5CkxpttVjb$lPbjI z)&7RbRiPSewG24j@oMk+uF79IrEq#t9*z}tlb1?DDl`Cv zi512E{OSHlA!x%k_Wr9Fw&E#<%4{n#{IAi3gKp?wMOVNODjTrdzu{lZu!Ao4u>Jj= z!Mm}Am&=5DPCo)^n5nwIA<{6JPveT0Sbdv^TS%6BhYw{GUZV}CmO*t;+NXz}#weOLVa;u~gu|5cV?s(PpqhEh#{m3)hAG!Ids+(&Te|FJrlmEV8%(b5e-x>Y+ zs=w9Ey|Vg-q19K6{9D7o1M}{E^2OGRhu-qspDuas;$N1Py*i}lNBa+4u;BTX&)oI& zPnLyVK2o(i{db2BtxQ|AETiu$+rM(hy?@xXq3pigr*8ZCfyXBP?A4cxTP8Msmj1$? znz}m|EE;v>xq?eS>mBc^&p8qPKbya7Q}g#SKb&>p?ycKyzwWPpf1~ji;n!||v2pYh zf%aec*PQ#`_T_h``NY6UGk&iyZ%vl#@bCs z-(2>C!k#}){lnK@9C7BmuKnM7 +#include +#include +#include + +/* ========================= Test helpers ============================== */ + +static int tests_passed = 0; +static int tests_failed = 0; + +#define TEST(name) \ + do { printf(" [TEST] %-55s ", name); } while(0) + +#define PASS() \ + do { printf("PASS\n"); tests_passed++; } while(0) + +#define FAIL(msg) \ + do { printf("FAIL: %s\n", msg); tests_failed++; } while(0) + +#define ASSERT_TRUE(expr, msg) \ + do { if (!(expr)) { FAIL(msg); return; } } while(0) + +#define ASSERT_FALSE(expr, msg) \ + do { if (expr) { FAIL(msg); return; } } while(0) + +#define ASSERT_EQ_INT(a, b, msg) \ + do { if ((a) != (b)) { \ + char _buf[256]; \ + snprintf(_buf, sizeof(_buf), "%s (got %d, expected %d)", msg, (int)(a), (int)(b)); \ + FAIL(_buf); return; \ + } } while(0) + +#define ASSERT_NEAR(a, b, tol, msg) \ + do { if (fabs((double)(a) - (double)(b)) > (tol)) { \ + char _buf[256]; \ + snprintf(_buf, sizeof(_buf), "%s (got %.8f, expected %.8f)", msg, (double)(a), (double)(b)); \ + FAIL(_buf); return; \ + } } while(0) + +#define ASSERT_NAN(val, msg) \ + do { if (!isnan(val)) { FAIL(msg); return; } } while(0) + +static UM982_GPS_t gps; + +static void reset_gps(void) +{ + spy_reset(); + memset(&gps, 0, sizeof(gps)); + gps.huart = &huart5; + gps.heading = NAN; + gps.heading_mode = 'V'; + gps.rmc_status = 'V'; +} + +/* ========================= Checksum tests ============================ */ + +static void test_checksum_valid(void) +{ + TEST("checksum: valid GGA"); + ASSERT_TRUE(um982_verify_checksum( + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"), + "should be valid"); + PASS(); +} + +static void test_checksum_valid_ths(void) +{ + TEST("checksum: valid THS"); + ASSERT_TRUE(um982_verify_checksum("$GNTHS,341.3344,A*1F"), + "should be valid"); + PASS(); +} + +static void test_checksum_invalid(void) +{ + TEST("checksum: invalid (wrong value)"); + ASSERT_FALSE(um982_verify_checksum("$GNTHS,341.3344,A*FF"), + "should be invalid"); + PASS(); +} + +static void test_checksum_missing_star(void) +{ + TEST("checksum: missing * marker"); + ASSERT_FALSE(um982_verify_checksum("$GNTHS,341.3344,A"), + "should be invalid"); + PASS(); +} + +static void test_checksum_null(void) +{ + TEST("checksum: NULL input"); + ASSERT_FALSE(um982_verify_checksum(NULL), "should be false"); + PASS(); +} + +static void test_checksum_no_dollar(void) +{ + TEST("checksum: missing $ prefix"); + ASSERT_FALSE(um982_verify_checksum("GNTHS,341.3344,A*1F"), + "should be invalid without $"); + PASS(); +} + +/* ========================= Coordinate parsing tests ================== */ + +static void test_coord_latitude_north(void) +{ + TEST("coord: latitude 4404.14036 N"); + double lat = um982_parse_coord("4404.14036", 'N'); + /* 44 + 04.14036/60 = 44.069006 */ + ASSERT_NEAR(lat, 44.069006, 0.000001, "latitude"); + PASS(); +} + +static void test_coord_latitude_south(void) +{ + TEST("coord: latitude 3358.92500 S (negative)"); + double lat = um982_parse_coord("3358.92500", 'S'); + ASSERT_TRUE(lat < 0.0, "should be negative for S"); + ASSERT_NEAR(lat, -(33.0 + 58.925/60.0), 0.000001, "latitude"); + PASS(); +} + +static void test_coord_longitude_3digit(void) +{ + TEST("coord: longitude 12118.85961 W (3-digit degrees)"); + double lon = um982_parse_coord("12118.85961", 'W'); + /* 121 + 18.85961/60 = 121.314327 */ + ASSERT_TRUE(lon < 0.0, "should be negative for W"); + ASSERT_NEAR(lon, -(121.0 + 18.85961/60.0), 0.000001, "longitude"); + PASS(); +} + +static void test_coord_longitude_east(void) +{ + TEST("coord: longitude 11614.19729 E"); + double lon = um982_parse_coord("11614.19729", 'E'); + ASSERT_TRUE(lon > 0.0, "should be positive for E"); + ASSERT_NEAR(lon, 116.0 + 14.19729/60.0, 0.000001, "longitude"); + PASS(); +} + +static void test_coord_empty(void) +{ + TEST("coord: empty string returns NAN"); + ASSERT_NAN(um982_parse_coord("", 'N'), "should be NAN"); + PASS(); +} + +static void test_coord_null(void) +{ + TEST("coord: NULL returns NAN"); + ASSERT_NAN(um982_parse_coord(NULL, 'N'), "should be NAN"); + PASS(); +} + +static void test_coord_no_dot(void) +{ + TEST("coord: no decimal point returns NAN"); + ASSERT_NAN(um982_parse_coord("440414036", 'N'), "should be NAN"); + PASS(); +} + +/* ========================= GGA parsing tests ========================= */ + +static void test_parse_gga_full(void) +{ + TEST("GGA: full sentence with all fields"); + reset_gps(); + mock_set_tick(1000); + + um982_parse_sentence(&gps, + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"); + + ASSERT_NEAR(gps.latitude, 44.069006, 0.0001, "latitude"); + ASSERT_NEAR(gps.longitude, -(121.0 + 18.85961/60.0), 0.0001, "longitude"); + ASSERT_EQ_INT(gps.fix_quality, 1, "fix quality"); + ASSERT_EQ_INT(gps.num_satellites, 12, "num sats"); + ASSERT_NEAR(gps.hdop, 0.98, 0.01, "hdop"); + ASSERT_NEAR(gps.altitude, 1113.0, 0.1, "altitude"); + ASSERT_NEAR(gps.geoid_sep, -21.3, 0.1, "geoid sep"); + PASS(); +} + +static void test_parse_gga_rtk_fixed(void) +{ + TEST("GGA: RTK fixed (quality=4)"); + reset_gps(); + + um982_parse_sentence(&gps, + "$GNGGA,023634.00,4004.73871635,N,11614.19729418,E,4,28,0.7,61.0988,M,-8.4923,M,,*5D"); + + ASSERT_EQ_INT(gps.fix_quality, 4, "RTK fixed"); + ASSERT_EQ_INT(gps.num_satellites, 28, "num sats"); + ASSERT_NEAR(gps.latitude, 40.0 + 4.73871635/60.0, 0.0000001, "latitude"); + ASSERT_NEAR(gps.longitude, 116.0 + 14.19729418/60.0, 0.0000001, "longitude"); + PASS(); +} + +static void test_parse_gga_no_fix(void) +{ + TEST("GGA: no fix (quality=0)"); + reset_gps(); + + /* Compute checksum for this sentence */ + um982_parse_sentence(&gps, + "$GNGGA,235959.00,,,,,0,00,99.99,,,,,,*79"); + + ASSERT_EQ_INT(gps.fix_quality, 0, "no fix"); + PASS(); +} + +/* ========================= RMC parsing tests ========================= */ + +static void test_parse_rmc_valid(void) +{ + TEST("RMC: valid position and speed"); + reset_gps(); + mock_set_tick(2000); + + um982_parse_sentence(&gps, + "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B"); + + ASSERT_EQ_INT(gps.rmc_status, 'A', "status"); + ASSERT_NEAR(gps.latitude, 44.0 + 4.13993/60.0, 0.0001, "latitude"); + ASSERT_NEAR(gps.longitude, -(121.0 + 18.86023/60.0), 0.0001, "longitude"); + ASSERT_NEAR(gps.speed_knots, 0.146, 0.001, "speed"); + PASS(); +} + +static void test_parse_rmc_void(void) +{ + TEST("RMC: void status (no valid fix)"); + reset_gps(); + gps.latitude = 12.34; /* Pre-set to check it doesn't get overwritten */ + + um982_parse_sentence(&gps, + "$GNRMC,235959.00,V,,,,,,,100117,,,N*64"); + + ASSERT_EQ_INT(gps.rmc_status, 'V', "void status"); + ASSERT_NEAR(gps.latitude, 12.34, 0.001, "lat should not change on void"); + PASS(); +} + +/* ========================= THS parsing tests ========================= */ + +static void test_parse_ths_autonomous(void) +{ + TEST("THS: autonomous heading 341.3344"); + reset_gps(); + mock_set_tick(3000); + + um982_parse_sentence(&gps, "$GNTHS,341.3344,A*1F"); + + ASSERT_NEAR(gps.heading, 341.3344, 0.001, "heading"); + ASSERT_EQ_INT(gps.heading_mode, 'A', "mode"); + PASS(); +} + +static void test_parse_ths_not_valid(void) +{ + TEST("THS: not valid mode"); + reset_gps(); + + um982_parse_sentence(&gps, "$GNTHS,,V*10"); + + ASSERT_NAN(gps.heading, "heading should be NAN when empty"); + ASSERT_EQ_INT(gps.heading_mode, 'V', "mode V"); + PASS(); +} + +static void test_parse_ths_zero(void) +{ + TEST("THS: heading exactly 0.0000"); + reset_gps(); + + um982_parse_sentence(&gps, "$GNTHS,0.0000,A*19"); + + ASSERT_NEAR(gps.heading, 0.0, 0.001, "heading zero"); + ASSERT_EQ_INT(gps.heading_mode, 'A', "mode A"); + PASS(); +} + +static void test_parse_ths_360_boundary(void) +{ + TEST("THS: heading near 360"); + reset_gps(); + + um982_parse_sentence(&gps, "$GNTHS,359.9999,D*13"); + + ASSERT_NEAR(gps.heading, 359.9999, 0.001, "heading near 360"); + ASSERT_EQ_INT(gps.heading_mode, 'D', "mode D"); + PASS(); +} + +/* ========================= VTG parsing tests ========================= */ + +static void test_parse_vtg(void) +{ + TEST("VTG: course and speed"); + reset_gps(); + + um982_parse_sentence(&gps, + "$GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34"); + + ASSERT_NEAR(gps.course_true, 220.86, 0.01, "course"); + ASSERT_NEAR(gps.speed_knots, 2.550, 0.001, "speed knots"); + ASSERT_NEAR(gps.speed_kmh, 4.724, 0.001, "speed kmh"); + PASS(); +} + +/* ========================= Talker ID tests =========================== */ + +static void test_talker_gp(void) +{ + TEST("talker: GP prefix parses correctly"); + reset_gps(); + + um982_parse_sentence(&gps, "$GPTHS,123.4567,A*07"); + + ASSERT_NEAR(gps.heading, 123.4567, 0.001, "heading with GP"); + PASS(); +} + +static void test_talker_gl(void) +{ + TEST("talker: GL prefix parses correctly"); + reset_gps(); + + um982_parse_sentence(&gps, "$GLTHS,123.4567,A*1B"); + + ASSERT_NEAR(gps.heading, 123.4567, 0.001, "heading with GL"); + PASS(); +} + +/* ========================= Feed / line assembly tests ================ */ + +static void test_feed_single_sentence(void) +{ + TEST("feed: single complete sentence with CRLF"); + reset_gps(); + mock_set_tick(5000); + + const char *data = "$GNTHS,341.3344,A*1F\r\n"; + um982_feed(&gps, (const uint8_t *)data, (uint16_t)strlen(data)); + + ASSERT_NEAR(gps.heading, 341.3344, 0.001, "heading"); + PASS(); +} + +static void test_feed_multiple_sentences(void) +{ + TEST("feed: multiple sentences in one chunk"); + reset_gps(); + mock_set_tick(5000); + + const char *data = + "$GNTHS,100.0000,A*18\r\n" + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47\r\n"; + um982_feed(&gps, (const uint8_t *)data, (uint16_t)strlen(data)); + + ASSERT_NEAR(gps.heading, 100.0, 0.01, "heading from THS"); + ASSERT_EQ_INT(gps.fix_quality, 1, "fix from GGA"); + PASS(); +} + +static void test_feed_partial_then_complete(void) +{ + TEST("feed: partial bytes then complete"); + reset_gps(); + mock_set_tick(5000); + + const char *part1 = "$GNTHS,200."; + const char *part2 = "5000,A*1E\r\n"; + um982_feed(&gps, (const uint8_t *)part1, (uint16_t)strlen(part1)); + /* Heading should not be set yet */ + ASSERT_NAN(gps.heading, "should be NAN before complete"); + + um982_feed(&gps, (const uint8_t *)part2, (uint16_t)strlen(part2)); + ASSERT_NEAR(gps.heading, 200.5, 0.01, "heading after complete"); + PASS(); +} + +static void test_feed_bad_checksum_rejected(void) +{ + TEST("feed: bad checksum sentence is rejected"); + reset_gps(); + mock_set_tick(5000); + + const char *data = "$GNTHS,999.0000,A*FF\r\n"; + um982_feed(&gps, (const uint8_t *)data, (uint16_t)strlen(data)); + + ASSERT_NAN(gps.heading, "heading should remain NAN"); + PASS(); +} + +static void test_feed_versiona_response(void) +{ + TEST("feed: VERSIONA response sets flag"); + reset_gps(); + + const char *data = "#VERSIONA,79,GPS,FINE,2326,378237000,15434,0,18,889;\"UM982\"\r\n"; + um982_feed(&gps, (const uint8_t *)data, (uint16_t)strlen(data)); + + ASSERT_TRUE(gps.version_received, "version_received should be true"); + ASSERT_TRUE(gps.initialized, "VERSIONA should mark communication alive"); + PASS(); +} + +/* ========================= Validity / age tests ====================== */ + +static void test_heading_valid_within_timeout(void) +{ + TEST("validity: heading valid within timeout"); + reset_gps(); + mock_set_tick(10000); + + um982_parse_sentence(&gps, "$GNTHS,341.3344,A*1F"); + + /* Still at tick 10000 */ + ASSERT_TRUE(um982_is_heading_valid(&gps), "should be valid"); + PASS(); +} + +static void test_heading_invalid_after_timeout(void) +{ + TEST("validity: heading invalid after 2s timeout"); + reset_gps(); + mock_set_tick(10000); + + um982_parse_sentence(&gps, "$GNTHS,341.3344,A*1F"); + + /* Advance past timeout */ + mock_set_tick(12500); + ASSERT_FALSE(um982_is_heading_valid(&gps), "should be invalid after 2.5s"); + PASS(); +} + +static void test_heading_invalid_mode_v(void) +{ + TEST("validity: heading invalid with mode V"); + reset_gps(); + mock_set_tick(10000); + + um982_parse_sentence(&gps, "$GNTHS,,V*10"); + + ASSERT_FALSE(um982_is_heading_valid(&gps), "mode V is invalid"); + PASS(); +} + +static void test_position_valid(void) +{ + TEST("validity: position valid with fix quality 1"); + reset_gps(); + mock_set_tick(10000); + + um982_parse_sentence(&gps, + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"); + + ASSERT_TRUE(um982_is_position_valid(&gps), "should be valid"); + PASS(); +} + +static void test_position_invalid_no_fix(void) +{ + TEST("validity: position invalid with no fix"); + reset_gps(); + mock_set_tick(10000); + + um982_parse_sentence(&gps, + "$GNGGA,235959.00,,,,,0,00,99.99,,,,,,*79"); + + ASSERT_FALSE(um982_is_position_valid(&gps), "no fix = invalid"); + PASS(); +} + +static void test_position_age_uses_last_valid_fix(void) +{ + TEST("age: position age uses last valid fix, not no-fix GGA"); + reset_gps(); + + mock_set_tick(10000); + um982_parse_sentence(&gps, + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"); + + mock_set_tick(12000); + um982_parse_sentence(&gps, + "$GNGGA,235959.00,,,,,0,00,99.99,,,,,,*79"); + + mock_set_tick(12500); + ASSERT_EQ_INT(um982_position_age(&gps), 2500, "age should still be from last valid fix"); + ASSERT_FALSE(um982_is_position_valid(&gps), "latest no-fix GGA should invalidate position"); + PASS(); +} + +static void test_heading_age(void) +{ + TEST("age: heading age computed correctly"); + reset_gps(); + mock_set_tick(10000); + + um982_parse_sentence(&gps, "$GNTHS,341.3344,A*1F"); + + mock_set_tick(10500); + uint32_t age = um982_heading_age(&gps); + ASSERT_EQ_INT(age, 500, "age should be 500ms"); + PASS(); +} + +/* ========================= Send command tests ======================== */ + +static void test_send_command_appends_crlf(void) +{ + TEST("send_command: appends \\r\\n"); + reset_gps(); + + um982_send_command(&gps, "GPGGA COM2 1"); + + /* Check that TX buffer contains "GPGGA COM2 1\r\n" */ + const char *expected = "GPGGA COM2 1\r\n"; + ASSERT_TRUE(mock_uart_tx_len == strlen(expected), "TX length"); + ASSERT_TRUE(memcmp(mock_uart_tx_buf, expected, strlen(expected)) == 0, + "TX content should be 'GPGGA COM2 1\\r\\n'"); + PASS(); +} + +static void test_send_command_null_safety(void) +{ + TEST("send_command: NULL gps returns false"); + ASSERT_FALSE(um982_send_command(NULL, "RESET"), "should return false"); + PASS(); +} + +/* ========================= Init sequence tests ======================= */ + +static void test_init_sends_correct_commands(void) +{ + TEST("init: sends correct command sequence"); + spy_reset(); + mock_uart_tx_clear(); + + /* Pre-load VERSIONA response so init succeeds */ + const char *ver_resp = "#VERSIONA,79,GPS,FINE,2326,378237000,15434,0,18,889;\"UM982\"\r\n"; + mock_uart_rx_load(&huart5, (const uint8_t *)ver_resp, (uint16_t)strlen(ver_resp)); + + UM982_GPS_t init_gps; + bool ok = um982_init(&init_gps, &huart5, 50.0f, 3.0f); + + ASSERT_TRUE(ok, "init should succeed"); + ASSERT_TRUE(init_gps.initialized, "should be initialized"); + + /* Verify TX buffer contains expected commands */ + const char *tx = (const char *)mock_uart_tx_buf; + ASSERT_TRUE(strstr(tx, "UNLOG\r\n") != NULL, "should send UNLOG"); + ASSERT_TRUE(strstr(tx, "CONFIG HEADING FIXLENGTH\r\n") != NULL, "should send CONFIG HEADING"); + ASSERT_TRUE(strstr(tx, "CONFIG HEADING LENGTH 50 3\r\n") != NULL, "should send LENGTH"); + ASSERT_TRUE(strstr(tx, "GPGGA COM2 1\r\n") != NULL, "should enable GGA"); + ASSERT_TRUE(strstr(tx, "GPRMC COM2 1\r\n") != NULL, "should enable RMC"); + ASSERT_TRUE(strstr(tx, "GPTHS COM2 0.2\r\n") != NULL, "should enable THS at 5Hz"); + ASSERT_TRUE(strstr(tx, "SAVECONFIG\r\n") == NULL, "should NOT save config (NVM wear)"); + ASSERT_TRUE(strstr(tx, "VERSIONA\r\n") != NULL, "should query version"); + + /* Verify command order: UNLOG should come before GPGGA */ + const char *unlog_pos = strstr(tx, "UNLOG\r\n"); + const char *gpgga_pos = strstr(tx, "GPGGA COM2 1\r\n"); + ASSERT_TRUE(unlog_pos < gpgga_pos, "UNLOG should precede GPGGA"); + + PASS(); +} + +static void test_init_no_baseline(void) +{ + TEST("init: baseline=0 skips LENGTH command"); + spy_reset(); + mock_uart_tx_clear(); + + const char *ver_resp = "#VERSIONA,79,GPS,FINE,2326,378237000,15434,0,18,889;\"UM982\"\r\n"; + mock_uart_rx_load(&huart5, (const uint8_t *)ver_resp, (uint16_t)strlen(ver_resp)); + + UM982_GPS_t init_gps; + um982_init(&init_gps, &huart5, 0.0f, 0.0f); + + const char *tx = (const char *)mock_uart_tx_buf; + ASSERT_TRUE(strstr(tx, "CONFIG HEADING LENGTH") == NULL, "should NOT send LENGTH"); + PASS(); +} + +static void test_init_fails_no_version(void) +{ + TEST("init: fails if no VERSIONA response"); + spy_reset(); + mock_uart_tx_clear(); + + /* Don't load any RX data — init should timeout */ + UM982_GPS_t init_gps; + bool ok = um982_init(&init_gps, &huart5, 50.0f, 3.0f); + + ASSERT_FALSE(ok, "init should fail without version response"); + ASSERT_FALSE(init_gps.initialized, "should not be initialized"); + PASS(); +} + +static void test_nmea_traffic_sets_initialized_without_versiona(void) +{ + TEST("init state: supported NMEA traffic sets initialized"); + reset_gps(); + + ASSERT_FALSE(gps.initialized, "should start uninitialized"); + um982_parse_sentence(&gps, "$GNTHS,341.3344,A*1F"); + ASSERT_TRUE(gps.initialized, "supported NMEA should mark communication alive"); + PASS(); +} + +/* ========================= Edge case tests =========================== */ + +static void test_empty_fields_handled(void) +{ + TEST("edge: GGA with empty lat/lon fields"); + reset_gps(); + gps.latitude = 99.99; + gps.longitude = 99.99; + + /* GGA with empty position fields (no fix) */ + um982_parse_sentence(&gps, + "$GNGGA,235959.00,,,,,0,00,99.99,,,,,,*79"); + + ASSERT_EQ_INT(gps.fix_quality, 0, "no fix"); + /* Latitude/longitude should not be updated (fields are empty) */ + ASSERT_NEAR(gps.latitude, 99.99, 0.01, "lat unchanged"); + ASSERT_NEAR(gps.longitude, 99.99, 0.01, "lon unchanged"); + PASS(); +} + +static void test_sentence_too_short(void) +{ + TEST("edge: sentence too short to have formatter"); + reset_gps(); + /* Should not crash */ + um982_parse_sentence(&gps, "$GN"); + um982_parse_sentence(&gps, "$"); + um982_parse_sentence(&gps, ""); + um982_parse_sentence(&gps, NULL); + PASS(); +} + +static void test_line_overflow(void) +{ + TEST("edge: oversized line is dropped"); + reset_gps(); + + /* Create a line longer than UM982_LINE_BUF_SIZE */ + char big[200]; + memset(big, 'X', sizeof(big)); + big[0] = '$'; + big[198] = '\n'; + big[199] = '\0'; + + um982_feed(&gps, (const uint8_t *)big, 199); + /* Should not crash, heading should still be NAN */ + ASSERT_NAN(gps.heading, "no valid data from overflow"); + PASS(); +} + +static void test_process_via_mock_uart(void) +{ + TEST("process: reads from mock UART RX buffer"); + reset_gps(); + mock_set_tick(5000); + + /* Load data into mock UART RX */ + const char *data = "$GNTHS,275.1234,D*18\r\n"; + mock_uart_rx_load(&huart5, (const uint8_t *)data, (uint16_t)strlen(data)); + + /* Call process() which reads from UART */ + um982_process(&gps); + + ASSERT_NEAR(gps.heading, 275.1234, 0.001, "heading via process()"); + ASSERT_EQ_INT(gps.heading_mode, 'D', "mode D"); + PASS(); +} + +/* ========================= PR #68 bug regression tests =============== */ + +/* These tests specifically verify the bugs found in the reverted PR #68 */ + +static void test_regression_sentence_id_with_gn_prefix(void) +{ + TEST("regression: GN-prefixed GGA is correctly identified"); + reset_gps(); + + /* PR #68 bug: strncmp(sentence, "GGA", 3) compared "GNG" vs "GGA" — never matched. + * Our fix: skip 2-char talker ID, compare at sentence+3. */ + um982_parse_sentence(&gps, + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"); + + ASSERT_EQ_INT(gps.fix_quality, 1, "GGA should parse with GN prefix"); + ASSERT_NEAR(gps.latitude, 44.069006, 0.001, "latitude should be parsed"); + PASS(); +} + +static void test_regression_longitude_3digit_degrees(void) +{ + TEST("regression: 3-digit longitude degrees parsed correctly"); + reset_gps(); + + /* PR #68 bug: hardcoded 2-digit degrees for longitude. + * 12118.85961 should be 121° 18.85961' = 121.314327° */ + um982_parse_sentence(&gps, + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"); + + ASSERT_NEAR(gps.longitude, -(121.0 + 18.85961/60.0), 0.0001, + "longitude 121° should not be parsed as 12°"); + ASSERT_TRUE(gps.longitude < -100.0, "longitude should be > 100 degrees"); + PASS(); +} + +static void test_regression_hemisphere_no_ptr_corrupt(void) +{ + TEST("regression: hemisphere parsing doesn't corrupt field pointer"); + reset_gps(); + + /* PR #68 bug: GGA/RMC hemisphere cases manually advanced ptr, + * desynchronizing from field counter. Our parser uses proper tokenizer. */ + um982_parse_sentence(&gps, + "$GNGGA,001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M*47"); + + /* After lat/lon, remaining fields should be correct */ + ASSERT_EQ_INT(gps.num_satellites, 12, "sats after hemisphere"); + ASSERT_NEAR(gps.hdop, 0.98, 0.01, "hdop after hemisphere"); + ASSERT_NEAR(gps.altitude, 1113.0, 0.1, "altitude after hemisphere"); + PASS(); +} + +static void test_regression_rmc_also_parsed(void) +{ + TEST("regression: RMC sentence is actually parsed (not dead code)"); + reset_gps(); + + /* PR #68 bug: identifySentence never matched GGA/RMC, so position + * parsing was dead code. */ + um982_parse_sentence(&gps, + "$GNRMC,001031.00,A,4404.13993,N,12118.86023,W,0.146,,100117,,,A*7B"); + + ASSERT_TRUE(gps.latitude > 44.0, "RMC lat should be parsed"); + ASSERT_TRUE(gps.longitude < -121.0, "RMC lon should be parsed"); + ASSERT_NEAR(gps.speed_knots, 0.146, 0.001, "RMC speed"); + PASS(); +} + +/* ========================= Main ====================================== */ + +int main(void) +{ + printf("=== UM982 GPS Driver Tests ===\n\n"); + + printf("--- Checksum ---\n"); + test_checksum_valid(); + test_checksum_valid_ths(); + test_checksum_invalid(); + test_checksum_missing_star(); + test_checksum_null(); + test_checksum_no_dollar(); + + printf("\n--- Coordinate Parsing ---\n"); + test_coord_latitude_north(); + test_coord_latitude_south(); + test_coord_longitude_3digit(); + test_coord_longitude_east(); + test_coord_empty(); + test_coord_null(); + test_coord_no_dot(); + + printf("\n--- GGA Parsing ---\n"); + test_parse_gga_full(); + test_parse_gga_rtk_fixed(); + test_parse_gga_no_fix(); + + printf("\n--- RMC Parsing ---\n"); + test_parse_rmc_valid(); + test_parse_rmc_void(); + + printf("\n--- THS Parsing ---\n"); + test_parse_ths_autonomous(); + test_parse_ths_not_valid(); + test_parse_ths_zero(); + test_parse_ths_360_boundary(); + + printf("\n--- VTG Parsing ---\n"); + test_parse_vtg(); + + printf("\n--- Talker IDs ---\n"); + test_talker_gp(); + test_talker_gl(); + + printf("\n--- Feed / Line Assembly ---\n"); + test_feed_single_sentence(); + test_feed_multiple_sentences(); + test_feed_partial_then_complete(); + test_feed_bad_checksum_rejected(); + test_feed_versiona_response(); + + printf("\n--- Validity / Age ---\n"); + test_heading_valid_within_timeout(); + test_heading_invalid_after_timeout(); + test_heading_invalid_mode_v(); + test_position_valid(); + test_position_invalid_no_fix(); + test_position_age_uses_last_valid_fix(); + test_heading_age(); + + printf("\n--- Send Command ---\n"); + test_send_command_appends_crlf(); + test_send_command_null_safety(); + + printf("\n--- Init Sequence ---\n"); + test_init_sends_correct_commands(); + test_init_no_baseline(); + test_init_fails_no_version(); + test_nmea_traffic_sets_initialized_without_versiona(); + + printf("\n--- Edge Cases ---\n"); + test_empty_fields_handled(); + test_sentence_too_short(); + test_line_overflow(); + test_process_via_mock_uart(); + + printf("\n--- PR #68 Regression ---\n"); + test_regression_sentence_id_with_gn_prefix(); + test_regression_longitude_3digit_degrees(); + test_regression_hemisphere_no_ptr_corrupt(); + test_regression_rmc_also_parsed(); + + printf("\n===============================================\n"); + printf(" Results: %d passed, %d failed (of %d total)\n", + tests_passed, tests_failed, tests_passed + tests_failed); + printf("===============================================\n"); + + return tests_failed > 0 ? 1 : 0; +} From 8187771ab01df83d3125a6ac6cbaead6ec1aed75 Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Thu, 16 Apr 2026 00:13:45 +0545 Subject: [PATCH 2/4] fix: resolve 3 deferred issues (STM32-006, STM32-004, FPGA-001) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit STM32-006: Remove blocking do-while loop that waited for legacy GUI start flag — production V7 PyQt GUI never sends it, hanging the MCU at boot. STM32-004: Check ad9523_init() return code and call Error_Handler() on failure, matching the pattern used by all other hardware init calls. FPGA-001: Simplify frame boundary detection to only trigger on chirp_counter wrap-to-zero. Previous conditions checking == N and == 2N were unreachable dead code (counter wraps at N-1). Now correct for any chirps_per_elev value. --- .../9_1_3_C_Cpp_Code/main.cpp | 39 +++++++------------ 9_Firmware/9_2_FPGA/radar_receiver_final.v | 18 ++++----- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp index 31057c5..b1d3964 100644 --- a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp +++ b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp @@ -175,7 +175,7 @@ float RADAR_Altitude; double RADAR_Longitude = 0; double RADAR_Latitude = 0; -extern uint8_t GUI_start_flag_received; +extern uint8_t GUI_start_flag_received; // [STM32-006] Legacy, unused -- kept for linker compat //RADAR @@ -1177,7 +1177,14 @@ static int configure_ad9523(void) // init ad9523 defaults (fills any missing pdata defaults) DIAG("CLK", "Calling ad9523_init() -- fills pdata defaults"); - ad9523_init(&init_param); + { + int32_t init_ret = ad9523_init(&init_param); + DIAG("CLK", "ad9523_init() returned %ld", (long)init_ret); + if (init_ret != 0) { + DIAG_ERR("CLK", "ad9523_init() FAILED (ret=%ld) -- calling Error_Handler()", (long)init_ret); + Error_Handler(); + } + } /* [Bug #2 FIXED] Removed first ad9523_setup() call that was here. * It wrote to the chip while still in reset — writes were lost. @@ -1800,29 +1807,11 @@ int main(void) HAL_UART_Transmit(&huart3, (uint8_t*)gps_send_error, sizeof(gps_send_error) - 1, 1000); } - // Check if start flag was received and settings are ready - do{ - if (usbHandler.isStartFlagReceived() && - usbHandler.getState() == USBHandler::USBState::READY_FOR_DATA) { - - const RadarSettings& settings = usbHandler.getSettings(); - - // Use the settings to configure your radar system - /* - settings.getSystemFrequency(); - settings.getChirpDuration1(); - settings.getChirpDuration2(); - settings.getChirpsPerPosition(); - settings.getFreqMin(); - settings.getFreqMax(); - settings.getPRF1(); - settings.getPRF2(); - settings.getMaxDistance(); - */ - - - } - }while(!usbHandler.isStartFlagReceived()); + /* [STM32-006 FIXED] Removed blocking do-while loop that waited for + * usbHandler.isStartFlagReceived(). The production V7 PyQt GUI does not + * send the legacy 4-byte start flag [23,46,158,237], so this loop hung + * the MCU at boot indefinitely. The USB settings handshake (if ever + * re-enabled) should be handled non-blocking in the main loop. */ /***************************************************************/ /************RF Power Amplifier Powering up sequence************/ diff --git a/9_Firmware/9_2_FPGA/radar_receiver_final.v b/9_Firmware/9_2_FPGA/radar_receiver_final.v index 4be1571..4560026 100644 --- a/9_Firmware/9_2_FPGA/radar_receiver_final.v +++ b/9_Firmware/9_2_FPGA/radar_receiver_final.v @@ -404,16 +404,14 @@ always @(posedge clk or negedge reset_n) begin // Default: no pulse new_frame_pulse <= 1'b0; - // Dynamic frame detection using host_chirps_per_elev. - // Detect frame boundary when chirp_counter changes AND is a - // multiple of host_chirps_per_elev (0, N, 2N, 3N, ...). - // Uses a modulo counter that resets at host_chirps_per_elev. - if (chirp_counter != chirp_counter_prev) begin - if (chirp_counter == 6'd0 || - chirp_counter == host_chirps_per_elev || - chirp_counter == {host_chirps_per_elev, 1'b0}) begin - new_frame_pulse <= 1'b1; - end + // [FPGA-001 FIXED] Detect frame boundary when chirp_counter wraps to 0. + // The chirp_counter (driven by radar_mode_controller) counts 0..N-1 + // and wraps back to 0 at the start of each new frame. Previous code + // also checked (== host_chirps_per_elev) and (== 2*host_chirps_per_elev) + // which were unreachable dead conditions for any N, since the counter + // never reaches N. Now works correctly for any chirps_per_elev value. + if (chirp_counter != chirp_counter_prev && chirp_counter == 6'd0) begin + new_frame_pulse <= 1'b1; end // Store previous value From db4e73577e0f7350a67b9d0e492f3bc19bd8acde Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Thu, 16 Apr 2026 00:33:27 +0545 Subject: [PATCH 3/4] fix: use authoritative tx frame signal for frame sync, consistent ad9523 error path FPGA-001: The previous fix derived frame boundaries from chirp_counter==0, but that counter comes from plfm_chirp_controller_enhanced which overflows to N (not wrapping at chirps_per_elev). This caused frame pulses only on 6-bit rollover (every 64 chirps) instead of every N chirps. Now wires the CDC-synchronized tx_new_chirp_frame_sync signal from the transmitter into radar_receiver_final, giving correct per-frame timing for any N. STM32-004: Changed ad9523_init() failure path from Error_Handler() to return -1, matching the pattern used by ad9523_setup() and ad9523_status() in the same function. Both halt the system, but return -1 keeps IRQs enabled for diagnostic output. --- .../9_1_3_C_Cpp_Code/main.cpp | 4 +- 9_Firmware/9_2_FPGA/radar_receiver_final.v | 39 ++++++++----------- 9_Firmware/9_2_FPGA/radar_system_top.v | 2 + .../9_2_FPGA/tb/tb_radar_receiver_final.v | 17 ++++++++ 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp index b1d3964..16c6954 100644 --- a/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp +++ b/9_Firmware/9_1_Microcontroller/9_1_3_C_Cpp_Code/main.cpp @@ -1181,8 +1181,8 @@ static int configure_ad9523(void) int32_t init_ret = ad9523_init(&init_param); DIAG("CLK", "ad9523_init() returned %ld", (long)init_ret); if (init_ret != 0) { - DIAG_ERR("CLK", "ad9523_init() FAILED (ret=%ld) -- calling Error_Handler()", (long)init_ret); - Error_Handler(); + DIAG_ERR("CLK", "ad9523_init() FAILED (ret=%ld)", (long)init_ret); + return -1; } } diff --git a/9_Firmware/9_2_FPGA/radar_receiver_final.v b/9_Firmware/9_2_FPGA/radar_receiver_final.v index 4560026..e86c34d 100644 --- a/9_Firmware/9_2_FPGA/radar_receiver_final.v +++ b/9_Firmware/9_2_FPGA/radar_receiver_final.v @@ -11,8 +11,10 @@ module radar_receiver_final ( input wire adc_dco_n, // Data Clock Output N (400MHz LVDS) output wire adc_pwdn, - // Chirp counter from transmitter (for frame sync and matched filter) + // Chirp counter from transmitter (for matched filter indexing) input wire [5:0] chirp_counter, + // Frame-start pulse from transmitter (CDC-synchronized, 1 clk_100m cycle) + input wire tx_frame_start, output wire [31:0] doppler_output, output wire doppler_valid, @@ -392,30 +394,31 @@ mti_canceller #( .mti_first_chirp(mti_first_chirp) ); -// ========== FRAME SYNC USING chirp_counter ========== -reg [5:0] chirp_counter_prev; +// ========== FRAME SYNC FROM TRANSMITTER ========== +// [FPGA-001 FIXED] Use the authoritative new_chirp_frame signal from the +// transmitter (via plfm_chirp_controller_enhanced), CDC-synchronized to +// clk_100m in radar_system_top. Previous code tried to derive frame +// boundaries from chirp_counter == 0, but that counter comes from the +// transmitter path (plfm_chirp_controller_enhanced) which does NOT wrap +// at chirps_per_elev — it overflows to N and only wraps at 6-bit rollover +// (64). This caused frame pulses at half the expected rate for N=32. +reg tx_frame_start_prev; reg new_frame_pulse; always @(posedge clk or negedge reset_n) begin if (!reset_n) begin - chirp_counter_prev <= 6'd0; + tx_frame_start_prev <= 1'b0; new_frame_pulse <= 1'b0; end else begin - // Default: no pulse new_frame_pulse <= 1'b0; - // [FPGA-001 FIXED] Detect frame boundary when chirp_counter wraps to 0. - // The chirp_counter (driven by radar_mode_controller) counts 0..N-1 - // and wraps back to 0 at the start of each new frame. Previous code - // also checked (== host_chirps_per_elev) and (== 2*host_chirps_per_elev) - // which were unreachable dead conditions for any N, since the counter - // never reaches N. Now works correctly for any chirps_per_elev value. - if (chirp_counter != chirp_counter_prev && chirp_counter == 6'd0) begin + // Edge detect: tx_frame_start is a toggle-CDC derived pulse that + // may be 1 clock wide. Capture rising edge for clean 1-cycle pulse. + if (tx_frame_start && !tx_frame_start_prev) begin new_frame_pulse <= 1'b1; end - // Store previous value - chirp_counter_prev <= chirp_counter; + tx_frame_start_prev <= tx_frame_start; end end @@ -481,14 +484,6 @@ always @(posedge clk or negedge reset_n) begin `endif chirps_in_current_frame <= 0; end - - // Monitor chirp counter pattern - if (chirp_counter != chirp_counter_prev) begin - `ifdef SIMULATION - $display("[TOP] chirp_counter: %0d ? %0d", - chirp_counter_prev, chirp_counter); - `endif - end end end diff --git a/9_Firmware/9_2_FPGA/radar_system_top.v b/9_Firmware/9_2_FPGA/radar_system_top.v index dfafa65..a133453 100644 --- a/9_Firmware/9_2_FPGA/radar_system_top.v +++ b/9_Firmware/9_2_FPGA/radar_system_top.v @@ -505,6 +505,8 @@ radar_receiver_final rx_inst ( // Chirp counter from transmitter (CDC-synchronized from 120 MHz domain) .chirp_counter(tx_current_chirp_sync), + // Frame-start pulse from transmitter (CDC-synchronized toggle→pulse) + .tx_frame_start(tx_new_chirp_frame_sync), // ADC Physical Interface .adc_d_p(adc_d_p), diff --git a/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v b/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v index adc78e7..2f8ef37 100644 --- a/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v +++ b/9_Firmware/9_2_FPGA/tb/tb_radar_receiver_final.v @@ -96,15 +96,31 @@ end reg [5:0] chirp_counter; reg mc_new_chirp_prev; +// Frame-start pulse: mirrors the real transmitter's new_chirp_frame signal. +// In the real system this fires on IDLE→LONG_CHIRP transitions in the chirp +// controller. Here we derive it from the mode controller's chirp_count +// wrapping back to 0 (which wraps correctly at cfg_chirps_per_elev). +reg tx_frame_start; +reg [5:0] rmc_chirp_prev; + always @(posedge clk_100m or negedge reset_n) begin if (!reset_n) begin chirp_counter <= 6'd0; mc_new_chirp_prev <= 1'b0; + tx_frame_start <= 1'b0; + rmc_chirp_prev <= 6'd0; end else begin mc_new_chirp_prev <= dut.mc_new_chirp; if (dut.mc_new_chirp != mc_new_chirp_prev) begin chirp_counter <= chirp_counter + 1; end + + // Detect when the internal mode controller's chirp_count wraps to 0 + tx_frame_start <= 1'b0; + if (dut.rmc_chirp_count == 6'd0 && rmc_chirp_prev != 6'd0) begin + tx_frame_start <= 1'b1; + end + rmc_chirp_prev <= dut.rmc_chirp_count; end end @@ -128,6 +144,7 @@ radar_receiver_final dut ( .adc_pwdn(), .chirp_counter(chirp_counter), + .tx_frame_start(tx_frame_start), .doppler_output(doppler_output), .doppler_valid(doppler_valid), From b9c36dcca53e6a28606a5e1e63a3538145d92bd9 Mon Sep 17 00:00:00 2001 From: Jason <83615043+JJassonn69@users.noreply.github.com> Date: Thu, 16 Apr 2026 00:45:52 +0545 Subject: [PATCH 4/4] fix(ci): remove macOS test binaries from git, update .gitignore The gap3, agc, and gps test binaries (Mach-O executables compiled on macOS) were accidentally tracked. CI runs on Linux and fails with 'Exec format error'. Removed from index and added to .gitignore. --- .../9_1_Microcontroller/tests/.gitignore | 8 ++++++++ .../tests/test_agc_outer_loop | Bin 156528 -> 0 bytes .../tests/test_gap3_emergency_state_ordering | Bin 34288 -> 0 bytes .../tests/test_gap3_emergency_stop_rails | Bin 58096 -> 0 bytes .../tests/test_gap3_idq_periodic_reread | Bin 34080 -> 0 bytes .../tests/test_gap3_iwdg_config | Bin 33944 -> 0 bytes .../tests/test_gap3_overtemp_emergency_stop | Bin 33984 -> 0 bytes .../tests/test_gap3_temperature_max | Bin 34088 -> 0 bytes .../9_1_Microcontroller/tests/test_um982_gps | Bin 99728 -> 0 bytes 9 files changed, 8 insertions(+) delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_agc_outer_loop delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_emergency_state_ordering delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_emergency_stop_rails delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_idq_periodic_reread delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_iwdg_config delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_overtemp_emergency_stop delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_gap3_temperature_max delete mode 100755 9_Firmware/9_1_Microcontroller/tests/test_um982_gps diff --git a/9_Firmware/9_1_Microcontroller/tests/.gitignore b/9_Firmware/9_1_Microcontroller/tests/.gitignore index e185c71..c836306 100644 --- a/9_Firmware/9_1_Microcontroller/tests/.gitignore +++ b/9_Firmware/9_1_Microcontroller/tests/.gitignore @@ -18,3 +18,11 @@ test_bug12_pa_cal_loop_inverted test_bug13_dac2_adc_buffer_mismatch test_bug14_diag_section_args test_bug15_htim3_dangling_extern +test_agc_outer_loop +test_gap3_emergency_state_ordering +test_gap3_emergency_stop_rails +test_gap3_idq_periodic_reread +test_gap3_iwdg_config +test_gap3_overtemp_emergency_stop +test_gap3_temperature_max +test_um982_gps diff --git a/9_Firmware/9_1_Microcontroller/tests/test_agc_outer_loop b/9_Firmware/9_1_Microcontroller/tests/test_agc_outer_loop deleted file mode 100755 index 3cfb6ef6d018b6643e6c1f48828375cc6d13dea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156528 zcmeFa33yz^l{Q@6E!i#E#tSmurS<}}Y}sf7OO6RGO9IJwLlWSywOdl#YOD=)%L_{) zER!fe7+>%Z2MEZ^B(lRKN&M-eQ*aSFe5YyT6VW!Y1&~j?bm|Y#JfNLv1seC8pq0 zhL6{~s_2H&+e#}|GB^64tQ?&cmm(cE8t{6nN>^7!-`4BLQqj}ND9R65lK;HkkbhH1 zC2)zQcK`)hbH@(74AYb={4Ytgg@5CR*BcDARtLjbvGi6yr_*aw>@jVo=T!87q5S9d zuB)l>`Zv}1n?v4^uR50AJDobcaf%+(W_mi6$hX&96AZNk8rP|;Sb76Hb$ZuL)eA6f z{ufId^qLxj5ddT9UHM|Pyi5=G&+Bb%+!$!A^#&T(HlbiFy{?yZdhaMkn2zPiOrLr( zAnBA8RTX)QSFWg3+G5j{)MJ!Z0IIYD+5C|9IDF6#O%W-XPE4;rks+6?Z~UXaxr_v^ z@wi3PE3oPOajftk(`I^lZsePCvTdEONWSnWIS;5jq~$-4elg@UXnVc2zK~D9$M2!& zEjEgP-f;L+&W47jMx%Hfy)vD@(W{ISLX3+16pGt$j@MfqjEt^${>JUl>Fp>ESBb(c zmR`gjEh}GfV`)jb(hl~#URKp;)343Pbh=EbJ2E3*h&JkpK)KZ^LgcCR>Mz=ad%Uhk zlX3gh(>5^;%5dPXHc{u*Wi>=!55vUIKavj0OyhNkf1PJ-;)VqGETZ@&HI)#G!K=fX#qX)G9?Dt}A8u>D)o zT-=lL;mUt*$VWN{so17}Y&RPp-jjM!e0U_OhIs)$HS^{z$XNiU0@aew0&{t>3tW}Y zoSHjX49a?|oZ5KQ%d?5?KSMqD#Ijx|>bWO6d*%IuPAx^zy&&4Zil+U^<)AwZ?GJIE zbT5eZO({`)A4A1w7-D5Umu3{=Pri!&7-0)X-3_%!_cm~7}`6dX@3TF7deLR%bPBS z_6O0lm!R(b!_Z!IF|>W7qcE9=x*rTfd-lc9{&6(zG}OH!X=qGFUkvT>W1{#zJ4bB) z_hD%N5%-PpJ}_1cI$?9(b2#_WZgn{_P8;@WF6>pHgV5o0JSXvpt2*&Eg)9O;nK= zY3m+!YDKV*Go6=cN0ZwsFhw7(sk=mbRq;Ep4t2&4UB^B`)j4#Dw%@3;9(9t3t~1N1 z;~uMh$EeffDTLdRpNOv|M)|g}+SiQoL9}t!Hl!@oMx8@rwXYa;HV!Y#7NgGOaoVFs zo%>M7CMFCg&n~0hrg7S5je4IOTAr7U@`uK0Ek^lvS^kXU1!{sq*JWieAzl80qPC7KwXavFkc80NsFW+KG{Ez0Saif}v<`F=$Sopp`0` zVS1Q52SESCxpR~DwtG*T^$)swa*fd2T7-I0I$O*+J!$V*=&-qt)Y%%L^^X*Tfh4iL zf23z{pvF@;;1z{#(N+PsdqN}fnRmkLDSYqip2AF9>UxfgDBXTHqT5SS6egP{XcHCx z1ARmEt*KtMQO|R!HqxlKKc;U@<+m8+(YJq@t&jQPF!>|OoV~AP@3~?%jxPX{ISLa4 zi+KtQ;&bkHQ7HT6c3|^;;DT{TT;@9TKIjLoPKDtNRgW0PVAm~HrO+;P(=JqxlGt_E zJb$V76D5<;26Siq0NOl`z8?TC<~B`z5k>E)LC>A0eaD1R9b9q4ZkhGw`C%|J*D>qO ze>il#F)%ucw4p<>7*Y1Sl}$9`^9$68mGdLYY3SWIq~48+!>&Jqo&6GpU4NRk5pqa+ z(fZRZOyy@8<)J_8Re9=9dh+MJcDJnwu*r!QP{!j zY+Rui1M4DV>>p81&Ka3ewj6z#8rF@YW0ibe6SeCUznpIj+_zo;jV0qEG!`ft!^!MM znJ7DQ0W#kTJ}9#@2{Hyn;ebPzxr{Qe*JU2qC<>iwY}{h-{a}pjoe|k*O;CJ0FVlqL zo3a};N-u!M788v>%!=3xbKjZ!`vl5dtn8DO?1z-h=h)}4=ft6l@?R+m52fQe5AwqY z7^tBQX{-1q>Ny{ck^fXg{#|KG{<_Pw1B!RbKNEGIW8GCl*L~Tj`_^UJw@r1AKo_^M z?x~^c9yRKECTY7&bq`Ge?^lV!BDDWG(186h{E2R1;=6jH;=6m2_PD9O&E8gV59$rT z7jX)wc`k{n|FThk@?>p`sz02*-j6a-eP*)p=6*KYuW#6O`*rSz(AAi^?_0QM*q}Ju zQ#C3)HmfHYa!%G(D?T~rVU9QajBa5nzr`pIKVz9ueqofK5mkPdQ67GVN0m3*&xbCM zPy6Hup9>V7;qY{$Oq9(lcEFDq4L`!6#p0PZLmyN9eL{N|eM|e>xm&zm3Eqs~WzhMq z_8A37Q08To@4{GFh`RmLl;1SX(+eAk5Bw+E1m!=$hwc`g5zOt=lq~Kk+FxesZMcN% zt^P@3aKK^Phq2a6Ufu>Tb5slf5tEAPY-^HgYZBVZKwBAT%VxW$E#j|7wY9})t8R+c zZ)%Hjv5l9|#&9^kjXG!VTL$05A=eQ7lRSg;xe#AU<5kju@AVqW!9NN6YOxrz&siSf zGwG`lPudVC=asLE!nzDxVQbuwbAU3!e>2JsKvt$dLEQo9nlmMK+()q8GQ-f5DcT!Kc;KMzs>XGN&=xh2c7!M{p5vjKXHWBNg?i$R+9j5l8#*e9;YNI^H z&;3UE*zsd3zr`qz@zZRS$5?j;hQ{EiQ73zHC zCyE@{$SUF}_1MJQEThi2X}Rf9)H>s1`e0c9IAi^iHKW6}?`4;gxp|s4Me%>mp~ja3btgu*XUy5FjrLfE z?V-+vw6|quq`k8)o#)~3`ZLNz%?W+PYsB8O?Y1}@MtcQ2G!0Qs z2{AY>6b7G(86PGZM-3W1)3wJ;?MB%JQ+fO4ices$#VB9w?HP{GSw@}iDO#(E&;C&g zH`sgf+XH_4M*%n3ex_fDNp~YH`}EFX*E`R5$gICac}zf1r2PblY1i{W+Ln6M4mnx z2OQ>DRJSnES(2&fc+#~$W$3oSOs95OgS^toc8 z#~#}SY?p2CS)>ix?1%q6ckav7m$Ua3?LF77%9{L$PQ)g61~Uq}u)ghTPe1Maj0gQA z7Si6|iO=5lyH0lny#;f@pVO9_>h@v1f^=E3?!WHC{jwRloi3XpdcAj|uWg>f@={OX z(&dr0`6xBVk=|U~bE6FCt#{i*A-17pJ8qO`nr*)`je307=@Sky_dQ3-zELcXc97N> zpIwUh>e7G8(B@)4={?7&eRER~vmGP%mbQuRbnRYXKHs2wC+cDzaf3HEerMjywo}$W zlBCbO+*HuH^pitkZTe50(v_df7VdIR8lF6fb8+~fY&HYfOX zgWmy1>OMF4#eBa_ypW--R60btqvr2E_Ng87kR*Kl11+qN8_4;aXLoyiXx$12dqgqljA%Sc|R6fsmc>GZQ2s`JL5rHVa7xF_(kvj zzVsgQ*wuGe5BvBP6+a{$;HXJVsT-Bzb?BG$(b&&NkXLA=@%t|IThc*)b%E|l^jAOj zK;(J|>j9iCNHeGVQEwIMacp)%=gfM^_Q`W4?#thhg=OV$@U>dC*N;7uo$2r~hpK$~FyA_NEIcdjvX0n|cHod>-va(KY$P#Et9xPV`}$t?iA^qAYDD`_pN|yb9g_ z<9Hp`!9FzJ3SgIbNx^zc7BIuYYv`bchq@qJczZ9m%hsX_~P2?0uKwTtO23?!!j>ne$Qq z4XAem__$6CR!)VE!LCNx)IYk6J-}@uJ(Qn>@V>Q1`O))pyO-_A_pAoo6tBao6e4=WZwK#bO0n!tK5@Tl+TZb?&yk-hZVS zoRzFFdVY>}0QpC*j9_F(EP)u!22J{+PWZ(93{=_+ao#EIci=ZsTZo@Ta9ee`_K%d4 zWiy7sUyw$G3=NqgZp=7PUQhSK9&W^~s1ooS<4xlY}jI12n1C>h(xxV5YZ`M_F zeAow?TyqIvboRc=y=R&#ut%J%`)P^h5UkstQF5AeyW8orNBRr8T?)GUKT0oG~+6fN{2(i=ne4NlO78%F1<_+D&zjkxPJ_|1dz|Q1?h1ua|Hg|50Tf0kJObU(c1$VXw&ww z?cvAHHt~L*b{FK4{Gz5$%7N>XhnVL)0 z`xNwU{rSp^xmubkzY^uW=PSQsuI5B}W3KIlKfw9X4m@{Zy!`7Vv3;lrzgG=?Ai;uDQ?_{jO(0|74k{-r-BK?!Jmd)4N6s_;6x({OAwF|!wov-f4^R;_Wx69BA z*u8^B`>?%?vwi=3H11!Zt%;$Ll*o2rey6P|!o2~^ue4oTVr&;}leArkLDF`4Q1&?D zkB03!s%+OHmaze<}18fWh-MZ78gJWXu8iF`S^W`-^-MIYeP;vE0Qsa-W01-GiU zPQpI3TseIB%$tN(##l2B>K__6yd zP4i17>Z(3^2mNmJ(JmGHk$r$NyV1rj)lV!ZaYDYd_n`MX;ACDWBW@t$d`GayGBDE9 zTMoPGd>~~S#!@fq4q$%+v4VSmWp5pho-^++pb?HY#Mqfjhr!;%Skm-4+KZ5_&17e| zF4WGtyCZrajsonB#=(j{(FdQ?PzA^@HrU6QDzT@ptXF z5PbCn{kGSUF6Z&P(H~t7*cAG|Di&t$w^^#+_Vmr@k?SPr^Pavtdv>aRU4r{Hpusxk z{A%PQ4jPxg1^Kro(1HIeb-<+iebGK;7(?*=oWhCgT>2r0gdS6sV`_P!^cxv}k?GIq zX{mFNb1(fttce8d3iMsd{tfW{9@a2e$? zUuz=h8ot&RV=SQUohUo*W0D^?P8@iE_3iPcQw6Xn#f@6DLM`Fee}$ zW}`h!Ihleuj2QE?r-ssf;@#+D_Lyz56(51$X6XUDvyXggZ)*_8D zM`C06cg2w9Mtqz?#w;f|1Jf#5mU1)xiL<>u&i?j_6kAGa*RA4p#`U_si*?7$^0_R> z`vcg+0I#WtpA~RT!hOD-z=1vjvAA;-){>Bm^f0%-QG@)c$YYx2INz~cCGw)iSNEf`F4~oM*cs`J}}MmhFxMz26UY0 z1IAv(n3PAt_^UF!FK|DcAH(bKC+cH8(R?6n(yNzijAuxjqe~az2?0uF;k#nW@;w9K=? zmm%|(7@3d8$UF;W%`y`cu9>DIKUU^OA0`X@^E7(J5v8W_*Folo|~ z3pEF1=a@43`|FT>8S0%to)fVf=l#xU*bC~7(yt-f`}FzRJGD^zE&OY?XJGvZ+RHv) zd&PF>vlHi`?9!L+EY5h5>v`!@J7%1AsdgC~=q&cWC=Sd@?{uV}!FsC)^T5^Ap~yTi z{dDv^Fdge4#N{1#o!N(ZpsW23uF>Sa*j$W>rSN^;o2|#gTq)u#_r>H`*;Ams09iU6 zcgi+*V&9+vHt}p4#xP=FpfUIN*lYXezPk#ZfAg+_Z@{)1v7-g>tK7--rN+p;s{zO8 zeWW{py*JJ$(#M*p+NmwnoiuY-hk8X=f+sbg>M^-(Fm~f4CR2&JNsN zVC-uhUnqJ@!2@|Yj`Kn0IxKSxzRf1wzfAFKzCR?*Jkk3FgJxbl%|7h){y@ncmV-6| za{U}*MdpEbX*Yn&50OV5*VmtAI3s3{k0E0HDRm1zMA<8kRdhJ^wFujl>7B*tFFJQW zSTXSJy)uos=S%Ll9;_()>euyjhDv`)rKgFP3_W!2e&~&kj(s22U3c(9w{74fZO~!&v(LRzx99l}2Uh;(!$W`i?S~>< zch4Igiw=F*_0ey2dPeYSO5{lu48 z4rB2pr^}W8Ps%4@n&T&mZ-?U3t@uRU4;9A4mUsEmzi}aS3nFyi2i;+5LRRPKfj1&J zZce9N#QuJ-J1|%3w3HpXfY?s&k3cWVRt_;Yj^((;m^ID4hmCc=9Pg_qYCTvpaDKBv zk3KgdL0nDEi%*?3%@OBWn|=jl&2t3j5Y7=#Am6+;eFf>*IpYZOPT<3N@;8_2{Ku?K z!!kszO}AgBJp@_g7%|PQ=Cx^Lte9fDLtuA6wLK(u&rH$+3cH!WE_)d4ZiGC>{5oVz zQmyNkqO2J^V}30`ek@i`BJWvzD3=p>J#jI3y)#)WOn_HxOfoLE6*Es7zUXeOZ}$`{ zpA>#$SEaWg70(Q$jCo~h<^!qI;5VJ_~w%h*}SFFemOtoLKsnh`H|1Q+sD) zvEIvruK|CPzQ*mK#q}b6jah2$**{zP8nbm@;}yf#K)lfD(0vWYY(NE5Yio$2mt_9yWlP)lUpVQ;a^z<73G4q^1#yJ@DBmHBU##sfXDJ%Pw zu@%mL3*dXMiNsgZPM~gAvA1WgA3g`pp=GAc^vPT?m|t_6_MnhX<5T&%QnajCm#`6|&)#7ir-<^aJ`t&ey})-0+z;U?kUXkgd(| zzaR_g|I28szwn#=X@hLM+JOVt$;6BIhHGOd^hWZJHi&are^8ISr+`nXKTKaB-$ra^ zAN$-m3ncZn2KPv~pKru7ulWo70f!#XtX6n1 z7Ds!<*b{Z~F_d`{A7_%MutV+DKaBH2;AgI}ZgX?p#xpf)Kgi@$9Tw9UX&kT7xU6*Hv}Isl?!|i5 zF3-Y!1NHWyEOcJ3Yr&6}0zNXqM<)2d*nobH+K2OTxTfw)86yV8cySg!>tT`qDQy&Z zV%<*g!v5{-^S&6hpWxuydL+&ZVV_E2xC{Js0>@6Qr^)vov@g$c;91V!eRA&0CEyQy z_Uz|AJ88DxDa)};H{|P2($6|@Kgfx(+l6vGdj+4Yhv!V3n(dywDt3~iWaar583!z$ z(UXO|lUT1lUwkKYO|QeVDSW>GY0}SB@z}%0-o#0)q2~dExsczDHMI2EkI&bB4!?f? zM;Qe(!ROns#}keApd)N=0BhHAY!7|(KGv@Pt@f&}(!PcE3_PlVM?L!+?Ms|K@)n%E z?*^P-QESf&)Zfnob3=dI)pJ_MaE9-Kbu(+R_C@gJg#I}Z-{Oa7H#|x=yYT#B7y6ui zy_NLmk@t0oYL)&+WUbpw6zx z-+L9GQjbwK(HcRcX z8P8rE!8}I0(}KKvnXl$SCw%+>>S4ct`&bj4SPwWSrpzUtdOZC(J)TZE7)Mw6;W#?_ zg8a~b=NiWjSs%rDog{;AwE--CSV|ATMtn|?TW z?#rFK?}E+_?YkVw5QTUay_fUGkqi%hdwRbGJ09h;#LR=l^eBA)W7mm7;wsz38sHet zDHFT5&~B8SFIICh_Wn5MVqWfbCl7I!xIOv|{uHGo4oywYxB-&5Lg?0aURz30(a z>wyD4+%J8KIyx6N7V*Ds#{YO0&JF#9UgB)mb=tpR?YIwEG48-U5%?Xcm>c9-{w{~E z_qrtC9la*l|j(=$T5 z-bBZa@#z4@c=n|CS)spWwd<1_|eUj>c(FNVfyr#1^T7{@SZ$hj70FD3xX zz{Su?OVP%fWUE8m*YGu*%BQ)R^njCr5%iWmO;{hJe439_w7+1zKwXLTmzIFHrT9=k zok@7!gIDM%Kk?@RP4=~Kh&^1aEf#<`#%cpP->cvr%Gu{8RUaCUq=&W_{! zczY7hg@oT-BG-M6DR@TXGp7e`5Q7IViL+;ioy+xiYDpW3GfWM@`3ET1**CeT^DnU9 zICGBk;cv`@Upn*fDD7U{$8$1+Yq;--v*Wwe+3{bY&hzo~rG9p`Pm<^Cq|K}wtyO`> zPL%Cxzg6lC_a>+dwA~!{dbu&$Qk0YJV9&I_nCn^njQOtONj+o9WAUv$U&HmW^U)HQ zXbVAW7s~e+WBr8lbLYnB^`AuD&z`UTGnZ&rqJIAk=oj=OZTipuj4=v&pGVzBeD*>X zj!({4xN518g+6|UVF&TfsLMcO|92-B?B6|Ek9ULK-rcJUPT*|4fN${$X!4vq#^T8> z%3oxgJ5gr$cUOnc-5hTcy@M#rd&isL*Wo_jE5y0~BjigT33(U;*jJfc@L%wsOTi=g ziyd%vb3$zeJg@(q*=*xPz1#Wp+QYx?q;EH+!q-ebJElR>-XGFTwqPNswQS z{O$z#TadpG`4S`0kQjkCo>}3%Gy(E`0(lc+b)^ZbH50U5kdM6n@=rJ~ih10Dx+hup z$|3N<`HnC?S(j>$6CbqM6$CytCVXmu&ukr^R`AMwN$NxtJ}9$0Xu{_@(Hk=4y$<-O z`^2X)K|b-ROOQ`|s*x}80S$={cr);M1@e7I;luU%xA6Nt*z~Tx)pCt!Jc|(PhruU1 zywsl-ekK89yqjk-ZvqCL|A6N&aE=GIM7J{s)3i0nKZ0{SQWs%owkSK(hxVk8X0mgP z1)*FOc`imh&T0DkpaRbw+=S=xlJq@82j9;z3TtM4KiY_ibUASL2r-e4NqS84UL~Jt ztQ>akonoBz?B-d|+2q?1IdAb(=sql zhqocyrfSKkyFbr#Rw)m2tz(8f|Mebt;2tt{WtWPVkjI@UvkU!7ADuRWB>dnJP?ZwBPmmU~v(*Hx#v^VJEV~@ED z`ycx+HOX`-WtuK!`ks{O4k?qN|57HD;ayuS=P3>%nsY1$Nxujr)8)Tk?oJ$s^jLo&Wjy zc&neGg}~d7Fjfx4mp$y9k{+e!0oBLGyf+5CeDp4%M_vV=dEpvamlr5_O!Tl=|$U_fYt#XThW$ z*ps16Q25k?9>-4*^=@Zf#L!@S;>M2?&uoS9DR60a;sbr)89c-_BKY(HA9XJBKVf6= ztgpmpm)Rzu%x=VWb}4*VPRfLQDHG@!HeoqGIoTRkrC%uhd49F{l0z&Vi|a59PbG#d=Ie? zp5M=$`N~wxLv!Iz6&mG_<-u>qGvkjz_Ncf>U-YvJ=WDn8yzOSDCTh3&0@~eGgS}_O za^zXh8pNQ~JGr<9p&aJEc>(buCooKO4`+9z{tPE)>^{o5tJHJ)SK&M=pY2v>F3#co zZ|p1B37LPlu^%-G&po2-3FK#{q>eK7*!j*1?#a~I)Se{z=LpKl`tX5|T^V_nKLzV2 z?9-&N4~HsqE6T9_Fb~|v0#EP4zREoE%RKPUvjh=;Bj$YRSey&O`5o?2<&G6;=66>y zW-s?V5Hq<8XJO;!lb`9&F~L^IXL?6+Y{3r7_7O8NKlk`P?5o^!!@OUuFf3OzW8wwj zabb!VbPHFe_6PW`{h-SjaT(&9#&eGgFNV(axf<7joGUQS!!ZS%p_W)OZZF3zK{q_=H~0T*i(vd@k0b%1AyOclFfS_2(Ae$2oBJBhUOJ zme!MC-(#Dx?_oTfE9Fee(*6N*8uYr<-Xh!X>YLHS^Mb^bzgecU@6Mj6y`Tj4#2D9% zmz=dA9Fnonl;7R|W*M+>9!b(fARyx`PVAl9#(Or)vmbhY zwj9M?LAE;Y9yQiuVi{})SPbHQ5Q7=X`Z}0Aa6gn|Z@4%J?F*lk|8JKq*5l8l7v3lS z{|le7eF__mXJ`fy2a)^C>^uIRtmZ_@XzmZZ3uJrj{6_n0?AdZ(7HcxOr);iw_P+f% zuZz7(=;J7SVrj^^0(6`<>Ji@EW7o&j0O;|I{0z`EerKuQDag-6-%}6eZ=~Vh$nyBx z82Vm^+CQF+G-WgMguc_CAwnI>IRO2^JQV5E7_1B#zxI)uuUSX!OV0v*(xCiB_?@Vo zu&%_=mGc*5Abr+93Oam-GZ78$ceqm^H)Q4dH06BHcEDDJu}ucQ*s~%IoFjNvf;0{o zd*Eo>2|PJx)9#Cz;sZWUN$m0d5BW}x=U}5){}k-(36v)tcd~$vMBdf@5aw(%wqd#3 zW8#_$ckW5?oIuprRedwu7z0o8{UK+69~1u^0$-dX9pp14c3=kE7mcrjHeUbx8}d0i z;D)mq`g==0c;HR;Gv?eu*tP9K`7*>vKYzk8q~D`WWj{_rIbGi(xEPp7TUi8bzic{Z zG7L7Qz&r|@n6kv^%Gfe780@5OpLe@f@dDi!waF$nOUx~9bIQx!y zO#bZ%qmHsSarzL01?kdHz`5=>68Z`;vXXDUqmFZr8+tD7C;HcI6Y|X1A)(J@^iOCf zNK>~BCY?<{lVd@ypN#sbJ0G}TNZl|$$%-G;#W_4_?`J7{FZn?m*<9!1zH_E-`+3&P zxR-@{d`^ySo&f(WM|;mJ=ZEMqK^q!*&WwJtv^&JTMrgBuC+9V;2Rir+3h}@=-sSMh z_*I&cjb*uiEBWC%26fDP(|q@te76?P&avz*3Qvxycj5cvU5emCf7hsC%cU-&-uFLH zb2rM`@Gi97s4M3-q-h_&h5PIyVlQpXZusz+6Z^J~M5M}8r7(8*VlrqDgGGuoqMSjz6I`K@T(+Pj8U5(QO zV}LvwwldC6CMa*%9AY8IF4~EbDM1}0PQiBQhe+MF>Fv_)$Igw0?Pod8RUG$Rj}Y@% zo5Q+^@^G#YZRukva^Ez5V! z$}Gir%S?IYDVBwvS5ZefuK0d7zLSprUm42ax%sE*7jRzLStDL=2R$cvV>#9#rsnZy z{##|n_@b|L4D}8CxfaIr1jzFYj-;;3elX2H3H&W%jOIfQ>I~0(^Gt3kK6ppv;8NSD zlcV6f-8kmwPo;uyrZdN+J|f@Kg!@5Nk7GfgP80C}cGSgs{FZ(L_#o|L7{6RMHj+1_ zi5c6YZKLeeRr?;rT{=N|Tf<8sf!!ejqZz;p8ST}bS>*vlG|H(!F!Olp3{YVY^6@7!hIS4s*J5Kqz zrZV%fL!SB9*Jv^})RwI+N1a%I&X}V)zV65U^NlU`Da&#$k1E?9?SD`|xNbDdYpfY@ zMhp2r?viu4Y5Y65R&_C2k&V`1*%Dyc^ENbRz z&)^bVm)wCpNj=V^$AKZ6F~{Ah;v&?aIru$PpOB}Ev3tf?Wt|(yBjhauFU|(Y484M1 zHKgqfV~@IAuM+!j!XLe8?2F@V9?k*|9)r$u{Lr@YtUqnhbz|@w2Z^V7B!RWK-xS%fhls*}F<{1{&<$X8$_&wTG*b;Y&kp2zx_JM}X zL%YN($_ASCkhp_S;zt|9IYjqSJm44kXzvL4j?#Zqed>uZuB4uV-Y@aYC;4?Ere@fA z{83A3t8B1=)T1bR&|%{p#RB(VL4C^omb@xm3n^XO8X zf-7ddE9C)im_u-uDMLO#%{-2ArirVLm&x9n_>=u%!t0yh#XRm4*~I$TGBLK0zNRq; zk(X20+h9AKKYxec(*A;H!_MQGx|2@elsV?mQ+CXMw@LcZ{2Dfab!ZO^zh2q~>Y+{7 zDb5Z29cv$`6NY_=#ahnmz$(*;G)oygy`6U(=d=xMJO|$u;emi0w-OPEqd<8A5kyN8)@mb3dVv3>~AdA;%x; zP;O&wa=;XeO2IgmvAq<}Am-fTI&7&Ugx zJfbfQT{2=9924vV^2t76-*G(qLC5eZ=uc4Z{tBMVybycCRz~zA`uzoLPwpq+yoj{P zd=|k0`^NKyI6uhua~_A>#(wJ|^}HOea_pcS z&rHfaBb#n}qI4lazsj))dUE`O{w(ktJ11YwJjg>ooc(l-Oe>kuN3?fro4%C1VqHN# zW$YdMU|jz)&V+}-qU}a;ykA88Ij0Gf9cnE&p7$X0JFtO&kF}t{x{3S_xfYD+GehSg zuk=5NA^SQ->ZZx(F4pH7@*18a+atE}J>={2DzF<5zYKjAwx0>wG-4UlJ41J~$piW( zs-N45YvetQQMMQO(r?7yQJ450p&bVQw1u>-(B(neH+>Gc>oj9ovGyPDY{s)QoFnd% za|Fvo?WsaW!{)FrDL;9J-yFZ*BOahdOpS3FrAx`cCN`#`bSjLMS&!iJ9>H9}^XFLO z;cu+znv824+O16Z2B}z&W{!E~ zDFHn(V}>y(*R*USacs)$v!r9LOUFD6{{gzR6S}^ZYd_BE@F{pslVim2Bl!H|R@|o@ zpwB9OrQhg#%>BwIARRoDFnBroWq|V;brR!`b&t&U3_gJRQa3p_wc|eY_zP?kzSGXA zxyj@Um~6Uv9L4J9rD!vrj%kjI=_BeAapKs&6+A@gY|MBYAg?ITamV!u?Fi2qGp3M& zzHs8bd>m)=^=W&E4}2kM3+Qjs2J*ZF{3bcaaooo9dj9dq{wE)ttKcJkP;Q*rqkWe8 zg8XFhffM^ncFbiJcqa?T7Ii2}PfU9E|LJjM>U*w9Y3B`F?o0+2=nKlnx&6HR;M}W4 z`E=?q{TX06M&UEuK6oGYHjQyboiWdI<}q*9r=iAvRQ(v)C>Q;Ylk!>4NE|SmevjhU zhyzZNK9epx?S!yJ`=?KWXCv+=_$&_MfH$H}B716#f$7v&&XKe;9JinwXIGVdiIO8` zT#?>T@(c0TaIDSDOQP7xUf>Yxr}ap=J&2>9XTKGCVysa)7L2hu9&?K8e>e_O55A*p zNdkQE>}gyXV|_`PrM*zLMXuRle-1djZySADhjV`!JI8Idi3i_U!?SQgXlo=*J-!-M zuGHC!XPQ(wmv#%v$@=9^zEgKw#&X>Ew7t$=?Cc&nzuN9{!e;+PlEtQyfGLEbYX|Hn!jGw7E1q6a5J18p96=k1^^S z_6N`5T`uOo!)T`au<39{`U8~Y}B4~&y%GeM7S8GOn-K8K7L z1oXZ)+&=ma&z|(chwMFvXPeFMVTpV=GsLlj<^b0qd|^l?}gb??3KJ@!lL zsHifO7i0g(Rbn%rcN3Ld80knQc+qL~;@q1+3wYnWNJtxaPz#PIk7kY|!bh8hf_oNz_ z!S=34{@tY=y*z`$+qJG_T$9_br7Yn-?u&^_fOkA+(i8P} zve1vI>dbUk-?Kfj81u{l`sk$5k9$!jwjcLGese#@l^KI~ZlGNQYrLnShqB=P20eV& zs~hK42j(d}5%Z9E1{I!oRt;DW_P4*hIE-g|-(up~Eqz6Ak2yYqcc@3N1tD`8=_lx~ zbHnu2SELVU>MIjnaa=TYI-XtJ>3D8&2hZB#3~(9dRoX0Pd08)>AMWXN{CY9hB;>Qx z@tei{quQ>ezdQhYE>I?V{b=I3FQbR_S-yX4+qHED?|r&%CDJRtS9TxnmxBj4XdB}= zstt$f9Wcsw!aHC#?QX~WzSzd6be!?dnoR>w0Q>g4dInaiKAA`Sfw_{Wzx|+;XBFCo zu5YH!oyhQP-iNwQ(8|R7p=eX_Tx%8Y5gX^uRT%58dj`J#+*IC^V-B{pOT9xx`fQ*9 zJ(BOjyAgE)sG~nOnz}C&`VzpLBkinBXlR4+gF;D%^=J>l3*VtDz(dqKSo*jgi~hTS zM^To3@G{-c>4o2fadle$jqwuj%(3mX!8VU-gB%aOG53Mgr(s*RW%_W|J}|cjwou9q z+q#*uQ~!;3o(-VRDAY-PU{tt{e76;NcBTLa@H$#Ni08vzox1da(bLdh#A`En*!&*q zE=4`cmpO)*rL6aY9eQp@KbY4W^s{NRFqcTb z%g|-)2f_E!b$AqX*ub9eoyxS0dgMCvIejm@lM?S%OL-(?jIIMwKC9Vwz?a^MnA5Hr z*bdk|#xL(fyPbVA@chA@uqFB!qTT9(ExQTr@83NGM=LOwUN%+t)^)8ExPhFueO`7&;gSq_Yg;AUrnY*ur?kdmy+c{5*Iw#sz6{?1slI z%O)7JX5QQiH_FJeU6A=8`mYS{9^u?}PR?tvt#V$2ZN?gxIv4e#^9 z95=)}rDEp`yPE5UnJT& zrffTXHQB}x{@M<-q0c3W{Qwz*KpTht8*O~<0^6X^IgqFwhwc{)C&yZ}5!K(ZeStA8 z_p30b_h3vrsk5`uFVeS#&Pv}FI(r_xmW5?8^+}?(l;7btj}7`A92@jII5yBn;31*k zmz$^^`qFsU)Db+3Y52eFJFb&spQWSyVqES3?%VPCG<*PQ7j5*N^yjlUHhKQU$fqsC z-a}d!<}SuVoS#|R`!MPn@9L#Z<2&%Wis3`!*;~2Cjk%8HoeyTpxVwOT#lBDlo>6_n zA=)0l7yEE0VYfL)aJ@u3v~&#LiT7-eK4&}Soc-_^q2EhMa4!Y-P@Xmte#9gDz&Gah zK{xoL9ddsr6@M4kY)4FSMF-xc0IZL|HXXf6^p??28$VOyd?nW*YK~iq{H4e*x3ys% zf_HR+F52KaWSdj1*H7R*5+^WcVV)d3mnXQk>&3h2drx40^916g{p|-9bDh%P{^P~r zb&5m%y`z}9OrC#GeSd3(qMg_U$>*K2lc*=dL6(?B-7^~zI}7uHK@DeZ)md( z^&U=CuP@pM-idV)_dvKmy$kENPSm>}^#;KIA$3-T>oBL!cF&KMk8}d}+~^lKd`GNh z8PnkzE$M@Ep3*Un-a9e-D3tF2+ToaEzw&R3^vCuqbn>k6%ns}l<93WY_N#i8s6#xR zDP?@GZ9dyI(j23V6?EagT#L=Tu@~oMqsA!SLxOlqTQAEvcV@{rzL=uMrBff5+hGr& zKk}^LdnoIiVj5SVDaX~!Q8D9cn7swajWdH`x%oFk;^dCiXVh_->P)=AIv!IUXM#Gg zVW-B8AU_#z%iouneorv{zRdJ{s_A#S>Gv$t?<-8d=bC;mF#XOo{l3QZdy(n)r^CMw zk6U8;eZA@TQq%7hrr#B&-?x~4SDSvXHT}NZ^t;9M`?IFsTTH({Z~FbP>Gxx%-;bMq zKWX~?l>YnNIor7DtE|@tq%pos-nuuR6Q@~3$?cRLV>16Z;QXSwZO}(!{m2dEE zip#6<)d#8-7icf&2ah_(fuOIt-e2o&gp7KYuesS^A=n%+ct90$8T7YofCM#7jcWtz z^m`@&Ynoac!K0qv5ZDB|LH|9i{>B==p66e?)?X6}Z1C$G`fJzuy*0j|KPU)&g+EC2 z7P&63z3TE>SFE`erkfE>2H)UG9%Q|>W?a` zP>B$(_d!<_Y*IkiT3>xouVg|~ssx}0rjfenNw406w+HTwWXE9;fVu{J^{)9YLKF>! zViZKAH#@8n*cEpESjVSTHsAqdM1OHx@><*N0EV019h z=FfLYWN0j0^FQsnyw&A$>xTE*%j;V+Qw3~(41o$|eO)vp2`HqR%EN}qe`pz)>;F>4 zlIvZoR^D1#G5_XOuFBGzZZ2I>Tq-Io2OWFY#{( zV2*Nwthuyn?%dLfin((axe}LlU0+nbth6Lmpw!BWMd4XAQd~}fFmwUTHZ$Wy8-nV} z8>87khx$VjH^aU)G}ZcDp(ae!O#giuq{dKY>Y>X0g$3GvO%I^gb1+zeqr4u!v~ zxT&GJ9-33@s%)(RBEhw-_4S+CDd7$+S$XSfHR=TQIyOyskDUD&bk^?7ak&Db$2Yf--%ImL>sR7UdWMN6{j68n1v0uU*38rxz=az;I-MCvaio#h9nJ_Czf_l z_G(pA)#~NYJ1Ef*NK_1qM40!XfzbQ-f{-xF89xdnUO+?I4!`V#q4Y`?z1rMSao9#s zgM?<(h61W09;j$#UJGByKr^<_T<*puqbsBriGdMgmlnaI1VctE(FDNag%D_Nh3^$% zp{l~A_p+<0v3_%`T(WSax#0^#ftL7v4MmOX>izD^7v!vk&aKPB>;NIER*Q<&F(bw0 zYOcf7bbI!K1)QESKcR5=6U~b2)}o3Pi(D;!Uu~7Yq1g}TzO}{gR!W`e3a$?{H~VWB zxf+{75hLucjixd*0o?Iz#DKUwJ9o9~TFjMXzc{*fWKzKTB(Qd~K6k)yHiY@$d{OJ) z9S*sT{035(3 zD<5B@zo|7CuXHX~Ea9t3SX$rm73Ec~qGiimC8f8N7nfGX@KmlZ0|NK5d1Gm7m_GOz z(eg$>jLgTCs9EpVyViYqYo?m%=?eL(n{+3JrK2e=az#u9@49093q!TO-jyH46CDq; zu4YNO$vI3iC(xnW2sW(^VK4xvq02}&8}mAsu0<|)Wywl!QE^rIEv0cbCBi!hx+;p6 zyQ(*HHR^J6VwhKrK|M?z-7Z41VwXF2dD*?Ln)>y_6xY?CQdX`i=Y-PG+8C&j?oxaQ z>7(AnUu1yjbd2t)#(-<^wX7%INN3hU@aeH3u4jSDmk=cB2nI57i|YY;Ax)h2TM>bjagCk@evQC}#wtogQv% zkIGVT0hC{ZQuBu_hMBLps$v;_T` z>xT3ZFimt=AdF$mcK}w8*2Ou=ks+dN z2W<&fdooUAczP0F#=8Rk+Bj^Y7>Z2!W`-*MCWfGeay1agkQq=ZZX$Qu%~rMLjEIU4D|0UR2o2sqhU>^ZLl zXywgS=K;x3r3gsT-ZgbtErT%cg<6{G-SA%)MdnqLv+F`QfFTjMkerD1$ya(aTtU;_ zh^DO%B}BT_GSv;btBP{wtt!gJCyz#KW!wTn8N}gh#V?EWwg8N|F-j&Uh+&%=wo-gc zKx|df63p^CP_z)r3yzf^B|&?LqKFYxex|ajbh)dzXj%D^ilVA=_>9p2BK~3oqU3UiDZz+sfIHLFBCLP^FC)OMNIWYfaJF0E{j7p%oX5lC%<^B77$<*L zVNa1+cn!V4(E*z{fC}#-1KXcs^>ebUOzXe&@BYh#c&Af{gR_NrAJ;ZKNSL$}`=NLN zK^m^3aTs_Gu4yY5 zR){WK-@(hVdT`}If2%9q(d$Jy3tMY)a zB4HaS0-bVUTUCyO2TO(R1su59zCt7)sD!L{2%85Wb$f;Fpci!42wVLcVeejpx;|ms z;S-`C*HgI8sTQ_n)x!Q3t^?JOr$*S^HNXMaq*`E7E9^UPUF8?HHa}iKi0iw!0#92T zFg;W!?5hI8?!FtC-z^+Y;M%<&{9@18-6-rGjp&0W;plDxFHIup)h1!j2G-ky!f`k# zY{!Gbz6O|ggoLdd*LOq0Ue$_gt8kpc_5F>)zG;&XAKwd__X$Tf`eE|@!g0s_xITcg z4}gaUgyRgZuFncvKKf@Xu6uBGJt!Pi4+{Ic4?@-lp>tb=EqjZwZ`&foar{1w>-2Wy zp)VJ26^`1ic$3psVSDQ#;n@0l@cVh;IP?Wz)FEtJ*}snp$C}54Xnq3eCq&YtPe4Dm zixFA>h)(uMUBwUUpM`*hfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jC zfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jC zfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jCfQ5jC0N&)#W|J_CYqP5>-^svyzKem^ zWOe2HCzu|ou13j7<_hCejSU8k!n{$2(CjcdcJBjgpYj*wTE zy3SPBS?Y>cO5oqPwmIsGS7ONY73wNHM9d|0-0)MSb^Ib}9luCg#|!VzcnW#eKMMg1 z0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O z0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O0Sf^O z0Sf^O0Sf^O0Sf^O0Sf_z0H4?Av-*5apU>#?`FuW`&*%L4Y&)M{=atX3^PK>E4*;+F z`vLI7`ez|vAz&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3 zAz&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3Az&e3 zAz&e3Az&e3Az&e3Az&e3Az&e3Az&e3A@FxWzy&I+@OdAfEAa{cO?&+2^Zv%a$;J;{ z)G(40Q&-bK8;T;K5h8y5#sDYeBQT-v!B?6J=HGGPPGgBdv;;_6F$=& z;_RpKX-g7kzlqQ3WO24&q&U0XDb9AM2-~StadyrqVOxdI7JQz;=MX+;@Nth8w!889 z+Gufh0H3rm;_P3?2>V-?h_nBN&nshv{rPdi{)2Hsc)i|rn>Kly{VlsW0*#@yyc-PpYSw#e>ehSLwfb6WndJ)x{VgGHOQoQ<$1k1*KF|Dgqm8)S5$g)vRfMi_q6)G%^{?7t}ZGms>sRC&R*_o^sV!^ zg$_oe574@4Ks6c{SD3a zz8b%`8qAk3)pILwDQR9=_7cCZp}47WZD3t& z+qrD}8lV$c*SMsh(Vv^04WY_cRpxq^1+sB(LzTC(0L=#jjS}0MO+Ih6e_f!_3+`*` z$UtSNFywD(2sHXaesC5BFXx)Dkls*>FAxe6N0a1#FI4j-s$h0utv?uQY1(X(q;jDl zNCo6rr6WlQD?>RsP@Z*--VMHbZ^*>=|6Zr(=6by~O^x8WwI<|kYV>=3A+Nu&*2KS3 zgbiUW_+Qt|+*r&_s)RTU9y6Q*OP#ab2j+>u+gkYEc6!IVTl_H; z(K9(Y^-b#nH9EcG+|pGy*2uPQ8KSM+>}p@F*VoeG+w5)hZ}jTy6zgqD7893HtR}vx zSf=&80F!a?#y6)x&Q3H$8v_6@rWa_5slYVE&{E)@XRRD5E2dzNslpHkf1@ znl_jx#Ph4>@XQQhr1K(1I^QtT7i>t*+hRiP&NpdyK5Rktz5bRasw0FB`a^Ud=m>em zo|(8NiNoKr<8?^~#^7h$wq$(2ztfKIgU|B2r<30uUxnM`sPOx0R|Oh{tEy?;x_Uo< zUU6$nAS8cfC5dgQC+w@rS9(RRKU5W{SuZM*#Jk@ig+t%9+baAu{s2I)OA;@1Gjqqc zS;5y55)U*ri*{R*c=Q|0KfH_iM)7~NRkipUgAIX@c-khCOZ@e|&0^{eVs+)Ja&P!n zV^#Tb@2Xpudn-fYi?*AKDlj4L1jPp-l0)pd0bh?6;p>GGeD!;n^q>(Ap)f%ywZ33T{MHU8maQmS z67U7l^f{1y^+}R#+la4i8_Z;1aD>VBI+8^HA$YlxZc%LwJFFCBzv*ahtq=Oej~v0~ zfJAJqzom3lU1hfSZt*s1b-Zi?>}Q^38>coZ0`M74tUa340%{d-kb>}uz^-^aiTB}v z6*WQ|O4riq$z!@C&;sWY_On#%NOFj0nnC-;uY)f;v|^JK3QV0yYFZnTZIsrD-=o}) z6)5-4E99j6Ih0P4=!lP#nwvKITW)Ty+>DkRfTWg;hKuV0&6RLIYXDufcrtk-716|A zop>fWNo?&Pxvq!Uc*Ukwb-th8qu<{g zXk3SGe<(#)Z1EeXztL9>15{MmiXj>B2XXfkXHYzn0^{{KmH1UJz7E}k7PfV=odc?! z>oL44W#7qOsTRLY3BmrvwDh|akyKOf_q9azPoggTWlC)z7{|-6Qgj9}giRbCO$myR zQo!39@OFAVxZ3_0q<1I^(S-+7(JzJu0YEta^)Lm0P1Ow&8C%s949HQoL9~xb5~sIN z&==ce&lr~G@Tjl?zl}0&eY{&#Utc1ZazXL#sHzGbk1#cirjJL7)NHZUkt5!9*PV5~MX}=P=^?qGaX!HwQ7K-bR^spCO>#jre*YfPyq=a)|2F&nIIc*{blgGZt#P z3`Gy#fTElz|7jd2%6;P;;{D~w-?Lohza;Zt9w(eR;+3?4+J2D0ZUN zaGay{t??J)9erA-1H=Hfu? zNxOgm&1uwW`!#v$_zl0e^|SuP#uvUb@gf%cJrlv;dBRrDPs|lRV!2`a35LbA0@r73 z@z=D!Q^yS*bQ8~AmXvhp7O0^{PL@i*o~ zS%{oG|Jt?mEjRdeheYffug5dRz$91(D8_9o#Lg)VSgLRG*R+QG-a5EE{uc4(6s%}| zNXxnBNBll5f4}$=f1kp)aQH*5&El_9;QF@)#n!2t8*9YFQ-y=}SbR98#V^;3r>6wP zwyAK(Utq=ezt8Xf9{Jr%%Y@)zov%^+Z0fy15b(mBg6M0g&?yV;_yLRVVbLVN_{G$w z){s~FY2x=&gB!i9BR-xQf)7+H6Nx$^odi`s>PqC z)rd3GYQ>i6e$g>~t$1wuI}c` zzn_lfi`Y5?_~ePlW*`C{5}h+JKXK{W(LDm+ZSs37zI9IoIE4@e6~CB47EQpa{QsDN z{(B0dI3!}Szl=Js%~0qanX$nK2OZV1qWxkzKzy3r_^MniA4F}q2=ezCxt>L#e@$!Ni2}gD7TJfa}z2FlW z2>6JvWC(l9Ca*Y?9>Vu?8Daz~|3kXOozh8__+h%fTYz9I-O^g|<8)neaP`ylP(b{9 zI&t%g?|~YYvf`B)P1sTpeHl>aZ?gGk@Ga~O(s2-vyIS=hJ6v#AckuqfZOJxoXmhh) ze1~~oVcv^h=672+g?JT0h~%24*2a+NajoUs1ir)@t`@E>#XBHy zdP@?TYu@Y?zjlQh@^ZcCV{cP)P<&yg7+q9Sxv(HF+q>NF3u3+E)m^$$XjrXCDP=Iu zTjp!5t;YZ#d&AA;+#i8#YwLaMfQAe<)QYsSqGevuW4pO>iFZjW%twp(ErK7voC5TI zHBF)?o|+EdYes`;cQrP7n}S~PtSczKG!ypZz?h`Y)EAPs+xOU?v43nkV|&4I*nZsJ zoz!jb8gam0mDS~V(e{GP)nm`f$_n9=RhD%s`5DLd~rS0*VI;(9kidZZ+CRs^F6MEcGsb#?RHPe z^QqfLZ`#y+#+KG^KW*D;Tbz}Z#!pH9xUDu<*|>anhb=8D&7EI6J!?)$KJt*2Uz;^2 zKR@4di+-A!vSyM1)alzvJIcck0FWAbm+H7l( zlI^ca^Q0jgMBMJ?)or$J+w?hG?RTvC*tYtP+B3FS?H!K#ZH`s7__wCMF3q{a-eJr4 zlq@bN2<0EN<>v$M|2qlq_{Ow#954OGMf^dfci_d}OkawPJ>GvFF9B!z(<*%!+hlUaF_RuhQEl>gm^w@|Wr9_f@(CSJEFlMQ=YeRZlNa={?i* zbh%2uny#mtkWRO?i8FKb^oJ_#zFbdV4?4VGrP6Pybel@w3c9@iu}c3yrCnF(^)H#O z-(RNEno2tt>h~wl(C28%ir_u#w`u)}5o9*49(*LZ|Z7Q9dq2G6w>*eoM z=>sYavm)!iU#;K&rAoi+*VDJT^!t<7>gj(~=@OOp%+&8UtMqFsy;Y@W&(iN7Q0a9l z{k}?nL!~EU9mM_`HCr#ArP7b7bhAodfqtR9dsO<2Im@Xe__T-;Hkl{&tn_SLwG@`nF8{{(wrqtOFQ2wvr}w-{uU6@a^Y#0Ws`Py-J+59ae_W-r zReCA*)`^ctrF&F5q|#|u>Gz*e>9s0-SfvM4I=?}uzbacVzec6^s`OTsep97;RN9lH zmw#WS?^bD7qfYOaD(z9}MY($UW|iKf(g#)gPbxjotk>V3rg-#sn$#Cj;Y{?Z2SXuc`El zA^m25G+T*`ap|{t@ctMReQOooE~g#4{dG5 zmip+yR;^aA_^QzQIJSpYyoa7zp!NQLd;Nbi|5-DWA!UHGKMa%K{MUD{wf0_n?X}ik z|GiYt{-oPqV!(wzTIO{G$3yk4sz)q!_D!m*R5yLfg9@USizDxCrT4yg_=J@TZ?^4}&zO#?H zQq!ZlO7&-EI(vueZ>X-i%7rhQsDt#jd@SAC`GWhs7y@`bE|A>YaVU7hU)bs+Xz$#0Ad2LG|;hUsOG_ z!P$$iar~RA>s6mM*V$L9zD4y$)&Hq_o9d~JF8of_x2vwX*6qLO)6O1MeZA^qu5G_s>bF!^-{|&NH{XR{ulfPiFRC8)S!ds) z`gYMl`|xJR-=liXSDe0IbiYcdECm-l=-Tea=4WVi&$x z^|7i?R(*!*3f0xBYg9L@ZdToX}RJ~30X4N}Y zzo>fjC6b@fMMYJ^h6VNYanK(uDjL7W=`&RqtFBgkjOtHQ-{HcCRnLFf>CdZfQGJc- zl2@GlcGah;9#<6vcnKeN*gF3i*D=(}yf5Dq18dfBT=dwj&tO$@1T(QSR>(M4xOl z>?g}-gnY0;H+XjNk179|V#iaHFBuu&N#5GQv%hkoqz~~^lgDrgHfY3e?cmwJL4OB4 zHNqqP#rQ)ue1W%i@azwve*~Ty;lblKZ1@6i?cmveLVpTjsSzIh1pFZzzQ9{Mc=or@ z{{l~q@ZfjK2OBhaYX{H%8TxDBsSzIh9{FH{25;@)*`GuI4m>r&gWrHZWWyJDYX{H% zANqsfsSzH0BmR&LU*N4B{I(A}8~Tqy`c)%5_$dC64PW3H9vVFRm*{VTr-mJTsaJli z9X$J^=%0e8PV)FeHhdv|YX{H%EBdqGsSzIWpC)xCHfZqH4xas8^nbxqBRu$O{2?2@ zz|%fibcuYpjTKu7g?yuaI>oD>pjkgj@Z_-tc9~p%QT(CXFFpOLXw)D7;ng2wN?h9R zmK`Gf)Yw1LFSpHLgGTzT9r~e7AYHupPKPkX&m@M{;eJ9=lBf9Yrs<@JkGy= z{;VB5$8#{g1D-k;Z|&eY{)6!#@YK0@YX{HqB8(q_rzW4!;|ty3*}-#s3FA%RsS!R~ z{;eH6$D=Sl1)e$=Z|&eYeueQY@YK0@YX?7YiYtE)>-ne7#alc0waR}`%Re>wS>Exp zcJSMke^=wDChwOYYX^VKsV@CLl6n^TrzXF{tN*PX{OC!J-z9B3@YLkx!GEyftHHB_ zU;A;#Uq8a})CiCBf14M-wS%vciX36LC{LZ_@rP{qLj2Ya{z)14f$h9QT>RAd4e>9R z4>oA<)(*bD)Y<-|JT>|G0iEKl9sFA5zoY4=PV#>KH9YL#_msJPpCsXM{He*m=f!XB z;CGfgzCz0nHTi0fw|4LtJV)5;r5%g-smU+*cxwm0LHRp1erobH_(L{)HJI?w;NPos zwvTA}qlO*lZ#@2x4PW4`9X!XYF@7DC-)Sx^!h=6eKG?`JJT&-H4d1WnrzXEWpi{iH zgP&04Y?tZvM@_!Ry9rzXGC)a9R={0{sf8@?LkKWhhn zcD1wJqt_2L!sGm(jXz|=7kFz2KX9(I#g(T6Lqi)Xrh zpRebinmn#)8^5)K=kq^24@6k%B=7KK`mG&2pBLi!A$aOsytRYp^F=&w1W!%gum7zb z{JL2#|4|vI0Z&c7#Y?}ngXi;1Jl_OQO+M=J)(*a-&c#1c&p$Q!W{T0YpI!CO1{9m;oU{XtE>1h8!6tsVUMMrT{2<%gQQfBvi;e6u`9K-lkU{XtE> z1d+=Ijr3bP_=NJm()3f4pXJ^EtR4JDc@BZFU)JMKP2L~Bw07{%$OVG1muUK_$ybXF z8#K~y?cm4Da|+mA(DF}>-*EnFz5kgv+>p*q+j_b_5QJ3 zHF^L3Y3<;5X!!S8{ypAr|1muF51#WyFnK@9X#j9V7?6UPfgx$ zKUh0>&ZoJ!#PQVR&+y{6cJQ2k^OW+`xp->_&-pslC%X8l$@}Ne+QDD5$Q{35DNjw_ z&%d>U=X@Z{55n=IChzCp+QD=F5atsF_&-qN4-vpkTe1*qbJ9y52!h9(3)a1u|ytRYpd@0PI0#8leFaOpKp7X0P z-wHf6`4TUFYX{HySeTy$o|?ShezJD(oWF(nT;Qq6`}wza@SN|3`Cs6v$@|CO+QD;v z80L$CrzU@zmw#&q&-rASUk09<{7R3vcJQ2kHb)`?Pfgx0zt#?ZUAwz}&m8M`YV!W| zXYJshS03}<5I;3}KYnWm&-rnfF9)8Qynp0e`^QN`IwlW37(p~ zAHTJOe@63<`JCXX$w$58XYJrQ-xKpc!Bdl$Vi9c64W1o5=Z9jxD0pgwNBP4C8#H)p z2haJWm|qH>8sWkE`L}lPoPUb>sNkt{@zxHW^Hni_6+Cq=-rB))ekJ^EbG|L+--4$m@3;S~9eh!@%Ug83 z3^Ur$%_BKPn$=(BQ2dJpCu& zPXV49;lca$pS6RhzXkj+z*Cd2k$qr;M*P+ep8gr|*8oqA@QB|(f7TA3{v7b{08dT+ zLD>g3XvA;r;OYMXe-QB02#@%y<%10xytRYhFyL(P9|2E|@ZcNegAE$IwS%XB3H(jK zQzJZh|M*)wc>1HjKLtEB`3~6!HfY3e?cnLZ0)H0p)CiCG{rbb&!PDOb{x9IE$zvbb zpb@{dgQtH?Teah<$+rlHjl8vkr#}t+YY;y*!Xs`e7QqIM_^lm0{cqkn*YVT{58l6i ztsVT@D_q*(zY`ok)#R52v8U3{@UVlYe-He9z*Cd=`(M@$p8i1a4+2k}i???0^dCC0 z#_`nT{qt|_;OTGli1O6rn-J}$@}$(wS%XB7yP{tKQ;MkNe4D)q~F@XufNjSZq@u#lV26kDc;(H^k3y{ z-_ZE!Uq)VvRj@%LerpF$|1+zw|4OK&x5}ncxv*ex#*MS$J)W~SmDwS|32{45mBiMDWz)TfFpJJ9zpp!k-a5HTjJ5 z|3#Ny*um4^5&nC468@4w{>}cu`sa_~u|M$ir-Xkccxu?e`{}oK z@btfgKPGr;@_zi*4xav+@ZSVaP2R6RtsOl5JK^sMo|?RW{Hz^3{XyX$3Z9z0-~O<6 z@bn*rKPh->^73=AK{t4I@HN-Ea|{1d@YD#8w3o;S8#H)p2Om`){;J@q5gz;o`Cx+v zZ|&ge&kFxm@YDzoUaHk#g9dNy;9IV9`-VR(cxr?P?_a;x4xaw9@Sg=wO@6uT0~<8r zw|4OKuZ6!Ycxr@4{4Mgq1`XcY!P6fX{<+|(5gxo>{;eJS+UwoEf1*4!dB6NyJ9zs0 z!v7cXQe=z)o!Bdl8DS5yK-Qd~5)1P>Y^3>#u13JZ9JNO4A0)(AC#>G!f z-ar4=4xawY@MlK)smc5CTRV9AJH!7OJT>_iFa6dIp8nDBmj+Kw-jCnf!PB1_{?*{A z$ya;vTRV9AU&9|8JT-YgerpH+;0^BhZ`9*YO&(CL0_^DwB>&I{H z;OQR@e{t~C{_Dk_mM-2Uq64}CD*4*%~{MoWF9{@+Mn6#wZq z{8G^r@;%$rmxzY{-J72Oy_W4JT>_qO%rs32@ef^ zqwS6K zg@W@>O@4yMTRZp`<-e~yHF>}MSv&Y^l;5m8HTe`MxNoJ!B?$zwy0>t zPYpZb_sfs9gI}$@6vKe0ChzCp+QDyEUb@c#PfZ@_!Uo-7!b5{^yw%xuiAMUVVMqG+ z$OjuVcxwk=|7B;Ze_K2FRm#7O@J5qgjXz|=7vg7lXz&yMm$Tih@l(T&_#5Se4H~?)gYQs& zx$@NHqXC`btsVR`$`6-tNI!Kh-rB)eta1B(RC(%LytRX0qx=iXQ|IEX9sC~UKdAYq zCf_3a#RlDA!b5{!@HJ=qmT2Uk8uo1G-`c@%R$h`3@YLkn$^rt!4@PL5ZJ+VJ)CQR(^xPrv5rw>^FJtmyJ{Zp^yXQCWmoPTQU8s+yGjRRjOf7Xuj!}k;6eMR7@5gz-|1}S8b3Apihxe>)(*bpE@z7?Pffns_9O0h*dOm_xPL zjrI~W+e2tSLbH8{_wgY8!!-SPzYFYqf6G~_SCzQ@;{7wQ^Zhb-9}aYj+VOrJ=rO9{ z?*zTN#qsbTho*lx{L!K5Z;tmXK=b_x@K=PUKO+3Uq3PcZe{yL0i^IPMn*KZRmx880 z6#NIF=|2d6aA^8_S$#P5(~#qrpypGx*0s)BhFza?nYCI4QT#^pA!= zH#GgV;hzUh|GVo|S4agRKL`GYus6#%F7zvEr@u1%V_~QNE8h13&G&iW{RPl`KLPw9 zq3Q1k|7vLZPvd%>4pCrH2vFlspk7s z;2#b<{lDSw2~B@a`2R!GzaRdT(Davte_Rkg;^Kq98Z`aU;6DpZ|5*4VLet+6<2~c# zoSnMS@fh!c{-$b-_XPHbogMEJ0nhh^z`qun{fce4Dod1jYzR;Y{i}}0IoS%#NsL-5m`pZBIB%5Tb z2>0vYcxwx7^mfo6LI{f}`{M)ATn`MC)F59kr9UsF9=HToa0k5P^O z2lRN==zl;LtNy#{V^pJm0DFaM^uLfE_OHTPf(H{%aGvB2L z8%SaZ<+)=y>$IqQxwCWw#CcaG>QUw;ku{3Qu3?>3&aN@9Dce{g9`h_4G@g z-r?!LczW#7>G?U%>12K?Jw40QmwNhgPp@z~dAx4%^nIS*;OU1v{ivs(^z`$dK31-i zvGOUFPmz3nK2qMfFW-mC=VkVb(yTEufn53)f!_45`&svFeWZlPumE{1U9XnuZ0xB-dySn>ARl+OM~`Q~Kho znE_IZv1Zx^Uz{~FJl9V4(jaRwyM^AfEbFDKe_h~lRV@(TxD3b$Sm6$tOA{R z@XN5L!IzrNo{(}qYpHc-2McFbq|Fh`UyC+JFiCFu0<}59Wv*JAJz#}qBW(@a!Gor) zZ<`}1m$A)LI4T$}Px+|KTyr*i#FaSf=?l^32q*`V>tNjW`wti~?*VoM+<5Zp` zyL@h*py|u!4j$NBYj=>q8O!eG2%BXc-5eqH`m<~F<_ej)a&PvK(}Km#(oRvfby#!2 z+1B075j5Lkyg7nOHZzt8&J{Gv!ok^tR%Kn`H%C}g;8V-~<_Md0E#T~7u~ctrLEb#q zdwSqJ7d--JTSPc(I?77T`nJhsh;!X@%SvV6Ls>L9dz?Af>&+g#tTp%g!a0akro2Um zbA->9t=uaSXWz+S%M52H23>kMJ2Lok#90|E{VVGd=d{Uk#aV6BlB*VHH>XxI&T3Cv zW;knz>8PH~YRB0F$*D=MfSff%s^#dn{c<-RYp{B9*1grR!I^iZQ{Zl`)BG#CW;UR_ z#e=ggaGbG%azSIvx>j;UxW2tq)-vvFnlrB=92}v&&0>L8rcJJWob8BYEcrZ?BU0!D zW<7x3V$%mReM4X7I+fbw^237{+-$2UVya$+E_7h3zB~{AgF(PP3#I*iQSIYi+0fXjX?#CRroqg4=G9 z>qwCab?F;OLor>#EqK&9c|-r}VX^-EZD{ z)9y#N-`2}DiNVU*&LXj;EsgDd4c4TV#jS%bp+fvESR~s7lhv=WIClCk8K8v1qS;}$ zptCM#txDIlmZhebhTTHdsXyJ))`3p0T^%SaUmg5`6|93l+#=Sp=(Jt7Ivl>RYY7&; zZi@BxbxKhPnr)$wQ0=YZ7}l(oc4FfkDKySfCdpi!kOk{uN;VYdCCW+{Mxx0D-xup@btSmIyfjF0Ocrr(O|5CYG$V9gRadO6v@}#&s@*)-iAg45=&joP``qu@n%>jb+ZJ9Z7mLZ> z+<8;ex@n=#$mOwcUst=Frc|)HhRhsSoLh5llN_Panpl5(Ypiy5Q+uuJ{9(|q)a@eN zlZe+fhw)2=UQ}{%b;J^}x_Omh=_uCL^vrE8O-q7B_afe``!2)2Yxcu=%)d`B^Z#fL za<|m8Bw>zMKKFYXDtg8Qx0=Nsu-EX~*s=|!>MhW79QuVymS z+uD(%;yI`X(Vkg7hzI^)<+ynq@CH_Bnv8;Xb#=?&T1;EaInG)BherjvD3euas5Ba5 zC*LHhXm8h!LNKd3y1_?}(>`nE+r3Ay)3#I$&YKgwqL^y(R&ZtRP zBfDJ(w_x?Q#oN1VchH?XePk!uNOa3+WK??ny{W|473!YsYWdpQ#^$gT9aA^j+h&0Z zuf~=6P_Q<6D)x8VE5~Jn_|p#i^l(@Pa9VqMr2J%FW(7a`{f#)Em2$3^_Qb;NQ5m+9 zi%2@{wH5dU?J-!T)7~j2H@vEyEqBDqrs(Wl2Y}q8hwCCg;UmC-dBhhrNep zt^9_*&&=k7*W4*ozb!MO{Oy#2WXB$~CU!&piuoUiserfe!DE*~l%sNKl35sy^U8DF zlLy~xwgQ&#CTmJ$mQfcwB9JS^jZ%__R2>eU3AxM*QNQg?y)bw}3RnLO9#2|@k{Q$+ zwUwt&cof5Sc0sz@K}}@qh@e~FFZX#lwLxV0lU26Al4Y*-jAUuErx5p?!E58f9cGz# zEzf1leKvWFIS}d(yJxv9y)sc-n^x~8_vj8!^6pg7hM8B_OvUhhStu+MW~HAkE$G1G zBqGmATj5G%+Uc3gyJ?{>t+bJ-{T9o#xU_nu zBWJEJ+o&qsK?{XsGJ>{&<2hnG_(j_mAa@-6M$&$-6GEY|JbZ8M?v%cW?N8e}ASCVh z-X57QfLSGrV(|j^n3}THRdOHg>~sTvyq6xp^Cbh4y-OlJVN8x{ZI8G1bwuKt`C245 zhA@O%A1xpHE zhl~x?^-JqclTsO$I-gJUSwEzL*``HZr=))&G9VwF1E7TMM-;Ry)aEC|8cDDRofHAyV(o|!X{t$tI1B)OsVlUCQc7iZ?+UGp+o&aWy%GUUaPE{v7prfV9t zsKEC_fk=*L2SZ$`B)AD)y)yqRxN}U^l*u4fA|An2B12=-db-=YsfRkJ%Yd*zK77EGIvB>j*BnkqR~{kA<*E;nYGP1V(&kf-D_?MCL1x*3*IBBg;E z%(YCN;r)EE-~o?}sWdgCj-NLJ|IB?y{E8zzCM^XX!>tV_2RQFfOc$6RiS)+HLNfS_ z>71C8=z5Fo3p--CN^2`+4r^bmHy)~D80T3MK>%s4F+^>@4tAqI$t>~a<(}~txag%< zY0@5(ngq?XJ*>>}L_5;#U24J599kT$ z-Qq2vo@POfnyR>@Rh>R^vA?6*>pa8tJQ0xz)TzYQHD(#pvj-rkHba%|(q0LkwWXRd zp~`4Gy2zN39X$W5m29WyyrL^MVB2E(B6CxKrB6~3%=*oURerC{jMkjh3Y?cA56uDh9j-wZPFV~UBQvX z1*!=5Zjik)t%p-CBNn+Dq~7%=nXvt#!HWW(5XneJPy@*&T^4Q%TA6YI7VN^yk=^{G z_JgN9J)7=Xe2%EnMy~O+**5jjV(9By5|^<&IrEE$QptPOmQ+^ouaHV{nr)z$OaE)I zQx|UU>@kxA{m#VTM?tE|U?9p}WsP#)ogQ&Krg!wZzTh^~8VP3eB&YLKhOMDgN{O53Q(FsX zpt*9gOkL;hg86RxNRA!E!s(EIt{}{94tp*>L)fVq^vbi-ti>WL4Sm9rnK6{i&GL7tKfemDyD*kkZ$3icdh@M!!86Co+z2V^)(N>!e& zFkbut_x7T2@Qx38@knn+x4gU}c%O>A%RsvHG9RQj(YMgO=_7E3kID-QX3m(Q@2LnU z@KhjFn((BdnqHRiQ>Zk{Z)Ks(aAjG-l~2nISCQqnsaf_nwK9{PmYL*G z)%1*TWu=*HS?P4#=<7peGiKE_hUeAR*Uo63=Y9&|jSjssijs%~VEZL+3SZFP8t;}dAaU#K=!nIq1c{zf6uh4z zvbYsN$(G^IZhpR!2a_JLR~tC&(btzzlriPq`miSp?^@&1aXpATJL zRxzzg-j7haxNAytu)lEnj?SE3QB@XOG+EwElI_(a1|P+-5~My zSnre~zQ7@T?#vl3Q-wKbY5VOiI&k^8Akr0C9EOVSUVrT0 zR$evs$E$vJ-PW#?dqUTq`q^X0yuACG=z=FMs6VOwn$io)zCUT}cUFIN-to~dZ=QJO z-A@%&-SG1pUTAsp)(7AG;%o0bI?%Pdt@xIQXZ0`Gbo${BfBT|)Z(nrPvaTOBjw(Cn zzL#qL_=n^EX;Sx&@c*9JGW*e(S1ws~d(+lKzy8qhj}?ttf6*1Sm%e_~ z`u2No{?&7}*PU4R+z;CSHgd(i&#td{@tkR!A9?SC$KQATJ>yEQUNdIfn72=8JM`&y z?%!GWWZk!pf9CbX4@drZ!@bi=mp!(9=6C<{?u$27?YgD(;hlZW=YI9~_h0?(g)I{% z^%phG`Ob~M_~~=EtzGrtYhStcrrW>2_Tv{7|8n+^S6}hIh3PS6W$dOzA^TO5h ze|OmZSFQiv{O+Ise$l28Tb_OP^5Jvmk9>dGhGkb=`|`tInsvh&-`rRG5nFfnRsMe5 zAuab_y6gU?$q!XdKB4`@zfbw;=9d$TreAj3#C_d=K7RgfEAKe;KWa|e^e^99a?yY9 zdZF*}-shM6r0=6^W50epGH~SU`S^XcfA;m=yKcKIde)zJEx7GZ*B$=S4NrgUm7*(8 zA9eiE>nC1v^J{N?^}LrpJ@%dFF5CG)blM@O{@<}ZH(t79PW{A7_sp)oeBu);cEA7E zhkki}fAOS0Hl9=W`PGk&{afdw>$ZIRnZ%8=mVfHPrRQGo`X8PdJ9X0$yS5$ui&u}D z`NEouXa4PvEhpah=Z3BGKXU*7yZ-jOM?H8{vUUp;wX?X2IuuxkAu%de1#yh(?gephMvV@qEd^~#TL zKH;J_YRQDykyYr1V2cs?e$l7D!basST)AqEuB&QI$Fmt$3&+h)U@H z+?iR=+F+JO>eD&Wow;Z3J?EbDn>#z>2RLtk^v{p$g$M~q7;OdGnQ9@P6&iX%d*7FC3N~BC%wwcXm zN_u&|mpp%4Jtw3GCFq;3OF5Pw&*leZHa}!2z1&~ZGB>`bXflNKxjx(x_el5QJ7`jF zj`zpqrk?IT_in_zO@OnKIp-=|q(*F)qe+=D0=MCo{%Ed}m}~E8f^JVR&hohYSvVKx z#1$B#ZZIy=r5vzk@1~z8jd)UY{gK_xMD4}E!0i6-+TOh*v3a|{cc(3Kx522yaevOP-W+ay#hzw5T2BDLXUy9?&Cpy9tuWal7=8o3PtE>8cz6RGcG&iRP z1aZIWD~_SxS3iO=l^@O|O~{Y@(DN4*T6Y~9jZq##bb(lCHWtLwH(}ZONXy0+#FZUT zlf;8Kk^hrLA!>1c*wcv@2{EJb*b$c-U0X zIHCHxTb&=FkKexIjUmxV=c%g3tBo~ozp+kqYN2BCY0R0bl2>bMVx6@iv7)v{jLt0n z{{7oRVl7zRt9)H*b>{<=0NhkjY^hd)=A`$^>fWz3m6{A9(sA6hb-`z~+oJIVbA zzCCi^8nmx4_jA5Ia_{i${oGrjtNw*Hry2cV?lbp@Yr*>-L+&?(I5Bfi>{_Mw{qoY; z+*ke&v4`tDd&G`?ruK~=d&rNyKk9spxXNO0D35&_v0tFr8!C_efxBj7{{Xgkyk~uT z+_(3F_7&c@0pA|E|JJkjb3X@N^{+&ov*?%QzO+1d5iTYj%$ZqQdG3dn&F22HxAqGPHe>Z4fVeaRAd*pu1v-fj93|;k4w>w4j%W_}r=6(tHyB}jSi%U713;jNwYw+@Y zYORy^)(hmjpzUSf_Rnh_>Dl_R?uM@Vk9Rnap3(-%{hSJ-`==M-R?-Zlc!ST2l{hOz6$M1g=)@Z_e1}{VPd|jW6pTat7 zz0$b%?(yFh>N?&-6jLjFEDy)7iEyLaU*z^TY}lY}O%h)T0Tr>9RW_rvt^}MYWQuc65ON%B(QrWz) zF-c}pg|@lwr0=dJErKf<1({Cea{3^a(QI=}7qnp{*25}qXx~W-Xg+gvZ8%mAk0$OBO*^`vrJ>3blMk;M*jl8?Yl6jjW-qodbX#I)4{yyCKzP`j}wI7za z-+iCKLqQTe(>EM_iX#ME*2fNvgrbB6IjL>5AvUZg%B>FdzFpswNfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XB zzyz286JP>NfC(@GCcp%k025#WOyK4OmKX8wmPm@~$Ok6C1egF5U;<2l2`~XBzyz28 z6JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz28 z6JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!-llPC&zoy=bV>s){js{}%u>A-rPu35yFC3RPtTD~Mdgd` z_z_PJdHRc<9`p^}*r)X^=|X`E`!`)3UsW&SphY8#Yq zq0+{(vLj6WyL+w@}Z(ej(lvS}Um6*l! z+Z3S{k;kyXtw<)7*RA0~DsK-*db_sll*#z!cv5BxR-{vI$(keMDN{#xwcMFan?~Bm z+opkPxMqY3=~|J>>gh)IrOe2Xk;7wRMfOA^?H$pHy>_~@&2H-~nERp=qpSC>iFT}O zg=F%Pe&u}OD!t8}L+jcHI$I3nS^-pbL%qXCf2p6wo&70P|6bpVYxFDdq6p*R2&*T3 z665sqLV`#BNK6Z(9Bf6h=z=#bbo+9{V$bUbM-RTYa>a8sbzk}AA0C~2zv&mR9_c*# z_xj(x{X~56n;-u8;OSR(8^8WwXuA5{ix>BXdv@2{IPltmuRZ&xH@>m$`7i$Pla8m7 zuRXKpkH_AseqrNFheYB!KCxl1f^5UM1JCiTO=R^P@A!guS zi`%kls_$C!Cu=s|$Jo)AB#(}|1kq0y5?WT>n$2~i&5|D+9VZk?NaS^+H*cSVj?U2Q7 zS*xq-s;yP`-CJw7Mo@JEJmuwj`Vh&Rz9-_gtZgwzGhEhR0BPkFwD}5&0t9rMG7h@M zqKOfY?(zkKcKQ5FjEk7%x!lEiE|vX_^>n04sd}DJalrBl+7De%?c1^%L&=bBZ$vN({L3)05`{H zd0Qf0-W=Id-q_LH2+V61ZkFT7e@*L{{E3x!d}l}h-F=Ua-?SKU0o=$I*8~)JrVLB% zJTKkzGd1^Zn$#BcUl?zd>$QGM@BOdg> z8TthAoTo7L;>Br$_Ef(Rt+r#J%U{Dj&r26~`Fbv%66xnomG&a#F_F40{cgV4FT?dq z(*p>sGo7Wq{XXB(YWSMFNTknB5JO(^*haMDvE8pMOV=ZxXF9FkYmv6! z=e5(-BVCCYl4-^*PqQp%OM*j8w^F5(wiV0MH4a-nY>(qUH$n7Cd-L)%>af3mLatIShaUZfVrVXG_aMH%FgQe8HSjtIehhex1A9={YGP=|^d8i&3i#r# zl|3kfT^64gWhq3T@T9wu?;+In@UP~yKhrs<_lR%KU^jS=K#T6q*@KzR2L}Bf@!RY) zS3l^g%JqXS1*#wXv?~2+)Sdmn=AjRH#^^&1?&F#}Se0Jy*@SVFXOxORC?6og3o{SZ+xGT^%xJIEZ0@=APJJ z$I~-(+dJxYZK2ZSwL8*NV86KQF7ySj)c@kH=Xx$8AC9%s8529u2VO>-AA`U2IGOfj zhJ9vKI*-54Bf3<&K-!CRlArJIlg}d9gQ=J6=_eRSzn6!0@OLR(mi|5PSovK*{KZ{% ze#5K8OXzcb*+RD4;BC~L;dLnIJkMIh6>Z-mY;A|pH!*Eb87NFK|6_j68B>e)WD!pu z`z!p}{f&MxK8H(i!~a-*pYYm#v+!3muQ|Q^97E2{^sGIHL?Aw(SDK0AhaHW*6&oS_85Q`Is2rd zJ^o3-j)C%E2is$=LyPlB7lEI7@H1~x@t(5rq7Q4;lq|J$<+0W)zOD2hqW}4@Yi?O& z{$LjV-$DF&U(wO^lS=liog_M_C-cz0v5&Od-J$6jXqwZolj~l7&&5@k<2p+R4>gpw zANG~@4qqqwGM(07cA6Np=ReZ@!F=1myCxjsF$cu&A{ zqDpvDRe^jw^HZ3j#gtqdpJLeyuvUze{W+BVxl?m`nJ#k*^Bmf-I5*Ed)$7){2X%C| zW6!Cldfn~VgZew$@sc#-gMAs~tF@N-qAnSf<4tH?hP5aAF{S4$rDsCvc?a~o4jOen zzapn+=cyIc^Vsn4m$7DIeY_KElG1dH_F7B-W3<=s724{r;CobCIsA%Wi&(essTJM6 zr&n~rcg8oTm+i+n%b<FSDw&x7+v275$jESk7+Wn=ATDQdPU*GmH65AkF1`a~-9B zrthDSs%p|@#~Q@GHCDfh!tYVoIR}-&w;so%^6)vmBS%1Es-^qg+qnYo4cgJLlA5HLlCB4foHe!B`LM z$bS9lnR>qE{G0LGdqRwzLHa;H+JimgvX6li0f%FE0DXTR`bz|BoITHqH1gO}<`K)} z_$QC^A4bHA)N=GG2X?(P4i=Rv()YR|_t0s65V z8DY=AXmh##YzEi4Ci>@!9qY9wm~)Fz&Z0+(o@|1Se&~pGqIUp(=6US(?=ii0Bkh&+ z=&fwt&?DH}2@ttKC^6fq~ zyEk*{f!>T7LroZi8O&v$K>p7?GrOJT&ph)$dryPC=U!iE?;SFyzS?`Gwmu5GyR8qY zHq&|F{TOT675rcv(9Z^pgWTAVV+-REbIsAt&kR0`vgvU_UmUx+G0U`Lj9F*d%9L)b zBhzM3=hJAvwLW`o89yx-gt0dME%M~M`4!iGtiu_l2Udll%qpy*+^4Czo$D#X zSU1MpuN^=h_FCfDvpKcGT5-(Mnw`lx7&BWY^HN0qhX4RbD%qr}m3sNr+U@yqE zj_LiOd1=h&Ljv=whk3$|?^}OyBfh7+gLzx6=|h}{){hSkJqsW9n(dcs_7nJSAZ9%|Ni7IV|Na?w}DeH!1t zJzS6R9-`Jbe5<^$9`WluDZGbZ9|OP0gYO~sH$J?t58S~u4t)mo9Ig<2x9b}y6@3G< zuwS{FbKHp)d{61`Jh>wGo`Uv}?c-X@&O(!Z)i&qw9{#Fa*ErT4Ym%E&Dwdt|p)TNJ zKejCE3wC&`i{>NGjXwb29>*WRpN0OT`Llw{{2noxJ_7LZ?GNdL{4DbKf*S)i1Y^J9G%+>@eQny1{!Gye!Ip#v_i)F~Ik_ zkY~q9wcZZER)%&d!`>0^viznqgfSxb;7o68?D#(DZX={WfqXdT*sk@+uOHuqMzt&Y zr2fv#vC410{Lb31c(veAPk+(czB9res~U5R@>@X{?DAb~#@&7Ek(YCf;(Z<8TT*>Y zwWE5 z^&W#0aB!x6NKVkf@sGioh_O7;i+50O>8mna;0PBx!dKbhs;a8MU7^+m6@fb=?SWgC z2iCNNE9~Os zfx69smPmUzo(MEX5}_^4;l{w0@YYy7tgC64x~96eHc+;uBM^%>hIv{Wh(uL|=jGg0 zEDzKmx-q;p5=F)1u|#4)LsPh6yR3NeCCXNB*bt~&Q(ISyylQLLtd>F+i%=pFjzgZ- zNX*(9k0iq)9++Ddxc8GAHi-Cwk0(1?!&IfV=F=9Xwl-~CSGPvoS-oyUAe0PHx#rlm zKfR&xfk4>}iFwNdt+9Br>W0=pYb08=sQrdTmFdhqkvJsC}0#Y3K#{90!9I&fKk9GU=%P47zK<1MggOMQNSo*6fg=H1&jhl z0i(c&R$yWZ|NkFc6I1pH{=}60?_7Zo@;_WPmr=kdU=%P47zK<1MggOMQNSo*6fg=H z1&jhl0i%FXz$jo8FbWt2i~>dhqkvJsC}0#Y3K#{90!9I&fKk9GU=%P47zK<1MggOM zQNSo*6fg=H1&jhl0i%FXz$jo8FbWt2i~>dhqkvJsC}0#Y3K#{90{>qXD2DeE-28W{ z@n`u3|GjMdYu5sQvS0oi0r+=9dhqkvJs zC}0#Y3K#{90!9I&fKk9GU=%P47zK<1MggOMQNSo*6fg=H1&jhl0i%FXz$jo8FbaGm z3IyP#26sJf{onf|C@=o^{`#7(19-}C5Pu~gI1=eW(1Sk|;F*kjA?_83uv+7hXmYEt zEGv{qgyTsoo{S1>%R}LKjFBzjmP9ydH8gFv9eFH~^&{vLnVa!*dJcXL&ce^W+4$+7 z0n5g4sIevz6<62Awry(;GdO)yJd%{5**=k-Erhpb-F=q0Hk_=BG;9|ued2gI=-rDv z8^aCZ$b(_A$tU(MK-7f=NF0hM#b;x!BIXmnz6p_;Qbg*MkJiOQ(L_rmDRz5A{_1dZ zs6$+Jm$<98W}THY-Cwuv9;;^4JyvZ}BtKcbvCa~IMlIm%;8Og&zZ^e5WoSP`XO_bf zPPVm*pL>#_WLrY?dpe>G;w_KxMWV>+B~Luu5<@v(^(4f3k53%A1+>$Z_~~83pIcGF zC}ayo#UbxQ36L%52!~(u`otj9UAPrL?=L}{hQ&9$v9_eu8rvC;i__l3PKyNbLvJ$D z5^j`0v0nr`a~pi4O~lWAJ#TAx#%)7O+V(DT_ z{FN_Hq*7k=quuhiOaAVazx(9xe))RAgk#UEX5RhuDKM zwp+#iFt1Yl1hKs`_F4IROxh~MTX{>wJ9#2MB)*szS==C=%S*II#J}W0oeJ@0UK_i| zZ}ZTxN>Hz^V?O+*>D8bVjAh-xLXEa!O-#|#ghdsQjdmMOKT_|7KaMZ@HZmuk-1FJ z91g|B_Y0b1XujtQP~vX-d4Dqe?1dlU+tRjGyjEbR`(;6MI4XWsAiVK*OZ?x0Bz^}9 zL;<*O=1aj@E!h?J6xbu$3P(d*n!}A^Ux8g^6zNL^$%yz`0R^+fFua8@HlNIoHEg%U z7YfmTKZYXwZa#|F(kRE#FACf2z*$(|okC&vc|BILqctqvW7Jd-_RIKVEdG(J@h3!x6geBfCOo*2_ePv6!e0x19Us>zsl;@b| zn(KFa@2~%zXY>7y?|Xja?eaD6^VKxss&8(Z;y>W+@>B*_uUNV?S$W!1Sqc8Fn24`J z>01jij{-lS@cRn4D!c-Jw1xJE6uvOY#$5^@#6(T|L507E36%IKagh)cU$gOdHGad! zKUBD8rbnj#xx$+j{ttzx&$8{q3I`Ns9*z7_*CZ??jT+$jX%~J7cq?*x`;j*zOh)QL z{A3Z&@DB9Y>m8VJ*W>PD02d$ky6og@{eA{NVFz*KHGp7@x6}p#N_`%@y{u~#v8iUCf{i%|Dc**FlS4? z#+v^-l5uIi(@y?A{6Q(&xD{mn8Z(ahyZevRPJUML8x&t-&3D(|X(xX*{+JchVnZkM z*I4r#5zmYGUPpRj@-vG6GBC@pG3_k>`?z@#lkc>Xe`KO#%2J+8b2;HP-xk*mx1&>qt*b{&B^B9GLB= zG40gf-TqEH`2n?mXjOcTHNOe*yoi~<(@uVu;@_m^KaDkiie!)Qop$o|{)PJ)mS1Dd z=U$5!G4t2<_n}vS26bg&3uu7n1s5K4VS(~G)B9a`q6<%V;SDZa>%t#*;WaKCa^Z*z z2VD41T=?%@^`Gg&zjvkYa@n`IaMp#nf4tGPf0S75A0g+c{oglS` z&%HV?V)C7K^4k@EFT&(&jG*KP@#IBJzSB;Aui`&|F!>rIDEX^N#zjoN(@y^Tir?E=I^wVf6X7w3A<>_)`%kUt`Tb4IjLSnZMIc{uF$R zqU}2TkgqZ0#>(GmCx5NtFIIewFUNP<$$wb!3lv}D%ki~6?V2CH;levznD2`m|IYVC zV(0rJvGaYA_;T-ya4#mHka|7l{*74g-?$$o*85HNV`9C3T!kj`p5O2cD1v0q`Xr^MqF=6XszQDLs9#8VXJdP+Q9VXk+?l?rn|!Sd++ z0@qX8uUB@ir^ICnb3G=$Mq#eU!~uo5eiAQLnCma`%?fk$@fEI{r<=GS^Dd;{qg;k_JitulIywjr|jGx(q5-{|6KZy1F1=n|3zJ0cTeqW$ne?Q=UfcA09Klk6X>-{zN^Tc|;&i#h;r_%F% zpLYE|&-Zs?{eI5x3B>w)0rwY@f50vezgN(%zejLCHvxNwKv3y{`37eE&%S23@J%kf z(1n+P$uU)ly8^cx2ZVK{4}=y!5ZXrpGI$q{8}zxvNX*Cq#YkN4q{5C;ClnHlI#IYJ zMxRGW!^m+1KTf-%aFQWoVs8N2RmZuOJsBiun%Fov#hwKB4 z9OTIYfc;ThyRp%T9~<+-aaf&V(~~m=cuZ{3?$;Afei56KnCoi11mA=u)uY4IqJw#pJVDn&P1f8tvQ6#f^bVX zzAYSW=zz0WtKDl7;T>&=LT6GZp;G*vJh`;9Z*5C72}>3d$|ag(D4*;QJhzaiOo?RM zmXWkpWBftYBY8AqC3zs@lri2uG7?F(B8~2t#_)p)$50+gV;@wJB$JeX5{I{m@@=7L zIMLJ^!m&$v&4xSgu{Kt(uHK0HCCZmscShnZJ8=|+;4RiYk%oAzAr?)>W6jOsczH6M zNG8e!AJ(=|YlT~)cqr1GSlA%S9}LCIx5k=r*pev!Y-Rb9+bTP@CmWVkBrBG+#viQg z*m2AD#g(@$U4&~}w7gC_zP!f;p-|Qez$RqHJ{kpGeq$e% zUx5zP7{}3g{39-~%Wq6C+4A|`FUOt08QpdOtitk|f;jAcyqkm%TO6x~N=RvupP=YM$oradir;~pBU-+tAJw+G*jmL2%(mtSbv zb^izP|5*Fx{as%v`uEk>o#;8b^HaZn@71;!60hw1$F?~~!Y{uNYM=b8Ki2;T@n_!s z4^N%`)98sMdEZQJ`G?o1+}yBo&bobtb3PvnJQ-cMx>^tu*eys1C-~Epp zkNu{2*>@Y`yTAUjSb6f)XE#lp_`OB#Z#cN!hz-_8t z8#F|{Ti6K>p9en1``6#)qqX3T|%GKLx%Md}Ol}(g)x#hI`dvNFeYC zGkfPj~YykI5$CU-T|iTS}Dtr+HqI&D*e#Br-2VI9tcu_hoU zO~eB61bUMxwadQI4sk`>MI-hlxS{^lG-LU2FEM@Oh4w{ASl`{p*iVcgv3N!s`(@6^ z-RI^H-tEiLA=dtU$$J~q*}mns@>$xSDP==r&#)m7=w~07=$ga^ME=BTJpuXAQtyz0 z_W-*%8t`6}{>B{a+Uaj)wjK6&ww}=>>C1&oE-K74oLtr@v9%BqE^9yARjNb2zo@%Z z|6yL*5B&N=AD8O8K?~cU*4g97{YQpAo5tm=#;!Gblc^!b`CyG+555uq8hs<=<=nL2 z1NYGuh`GgkkqxgX%;Yc~@ZS~fUMtgK&q4h(F}yYNJXXv$=W(@6FNOYM9-txh%MWC* zG26Gvu0Lt%d$!?uf98(K0JuI3llH9U6}vv$)XXx0xf)EW96C&TV03xf|1Z361twdk zXYz@tx6J20EDq$WEOdE-++E4Meu6yhms59I(cki26S(ZjV&2lZ|biHeIMxO82UHX8+xoadf{~6 z&I=FwxxGBkoZ~>b4&QxZj$(Wq2giqT{|e)axx%`KppD4ya_eo7AFDLusx;!-Bbjkk zriU^iNoNI)LY$}2#5Sl2eLh9af}+CF1MK3M8=g-NQ^#TGoXgJ7Vd}vAvY){+lWj3R z+n{d-`rOFLKlk_XwtFsQp9ga!;GAbZ6N)`Ld{+&?_u^s^4~~WLz}VLzo{SrOiS5fQ znfdw9zQE+w=Fy)rd1cu=nPqdrqr-RYz+fN0Wqls!OLJ}lGqEoKC~!>s?>^T&2+wbQ zIETMKwuz05*0O5YL)DVBqOkF!wExIUXEcV--~6INsbF;>TUt~I?L>PgdW!9xc<17VTc!$#M=F#vz z-ffC=O+{UMh((n4WTY7C($ygOYHhJ_n248C!TFTgkZwl@WNu+d*1Xl!Y! zW39eGU_7XDBPh2!8`brrM_l$wXEnqXPiS3A%!sLYmE9fjmB>Q;>6yhR#%}p)y?@ho zzrViOI=D4#mwjzjHgE{r#N;+2DzB)phUB)FLqv)Fsut?eG&OFb!r_c)rXSAKgyli> zo+=@^rw3M}U5zCU$mRA5pI~k_tS|?kXs5Kppg`6&somOj@@AmZ6I0|+BA$%GyGT6L zD=Q%_kxa^=P9+{!V@aVrK4VxrB@8du$(_;NuxJqaM2T~^W&O-pD%Z&YXdY9`Og-5$ zeL1YA)KDs#h>JmrL!GO_HLL6{u|{GqaifJAW^?b^tG=ctIanVE24vg}^>t#O&K2)! z@L3aPz2iF=zN2~JjtT#cK=X?0#0B0{;GNM1FEQAIvA6StWG=jP83m%0E<}I`5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-EpUjz!$@S8KRg0%4?lY%t<4h1YNu5=*+M1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vQG=LBRJp%qdaBs@mk z_+J2!0ka+}j%SHyP2|0BTCF!*V)T>X9|%Zru&e}!k4r(Qv1}zIIImL}`pr}7v41w6RglO2Ss${ZKb(~-41Mfxt+&RHI2K3+<83jX z1<*blAD%r5F3JeQbK|Z4hADo_6n_!;sJ;*q^0)fnG8xwE-euro86LE*_uCS9q-#V= zba6OrmN~Y=?npX1l(?Gg>{jBbPDg9g=55^XtMmDJM|aXu%{NE2t^V zI88RCC1NpEbKnWUNyh^Z0(R_IG)E*6gPoLg?D04%Dm}e>Q=w{i%3a;9?f3NVbL}nn zR93-R!_JPlBPeudJXyFbRH1qzE_;HBbBD)ggV@-e59bZTN}Pjic5N0z8GdSBW;WPd zHnG$9L;Vg&Xmc3r>y~YBEbM2pyjx~7>AvS5vv=0j{^HZ~{$~?tz}2v*r7KLedC2cUOd)#bj_L1TmNGJ z{$~EktMArz{@Qi=JG z2c}M&Yh0&^YFVrrwTYAlyNy&^Nz*8b+MuQ~iL10~)Wk&nh@z??ktLtiSWQ!@wcSwq z-s~P65Nuab|9el&?z}fMZ{GZ7_LhI{-kaC2{AUAW3Ip*#*$gF-%h++op~l$fp|nF0 zqPwZB<;yKSU1(h@a_~~q3Jv|d4IPE(Yw7P>+APNhm)e-CuK{zWU=JZI?TCdnN0$40 z9%4s-H91Z@>bR~2$z`d9I#h%(t>l2YU|R0);%6Lx#cmJOv;BEpf51?R5Fyht^jKs; zU%Fne*YWpf*9q#`lIOaDvb zW9uD%{h2|a-^d^C>*LZ-b5mcFIM8*d*V)~mxP1|&Mnv%?e0`iTPeSR@o>ae$VRYmD0t5N zNz?F0^#Ol)JQ@ZaWd{_Dj$4yHc@!jo%xby*MbSd1>|AiEA zfqS{DBQKOYpkVul4>5Me2@=h#%KQP(%-m7$*|{8#4Y5vmmEbijXO0zKJ$L^0mtf!o z;a*kiK3VW&Nf_56W?*&;SKTNIp2=P(;WpOfvs+G)d}$I!0is|8+`>S0_hNEfoH z^$P2QkhaLSiGc!X|Mui|Y(smxFgVq&uzgsUzP9bMp+2$m&RzEVxv3stJP|sv%l;Ag zU+BY&>?bp^)fL%K$k<{9vxN{_VQ}s}h(pfPHn|;q?_C&|?R$;udt0%6!u7pkU1y4I zK*<(nm~*JTQnQmaOq#EXTv#I$ackhaVQ{Fq+;XIGC$CryzQ`p}-uD|3} zau1(oj=c=dLmI}x=gSt{i!_c~!#1bE&)??fx2AW4uCT-Dt*h_XtLxk~ohrAvyC!*F z;4HxBl(R>(<@Rk*zYJ&dk-JiFl_~6+>@&T`hUdfS^T8hbvrs>KOkB-A`(9<;U+;J0 zh0ho0o9dZ6+I|+E6?-~I{IL?4@{RpqF=Lhd? zZsS9$5gtXD?OT6#RjVN@RDyiYSNUgeIl^bswdwD_2A4e2o+ zsHo+p2E)Rp&*$T;ETl$5$*5{+VP4`3405xavk_H~F$=tih?)opeJmWo_a4mT3o+NB zF!^1LJm9P3rKNn)*3igneU+@cske6_6bQfTKz|pH#^VWYXoH4k4sktZX~w7;*y z>BN=3s?{g1spp+Q&spn85;h_fA4xGq`SYV5^6DZ(nDix^8}#3fV1lX!h3g9xWPI!#Fy* z5OP&@#ei;cLybi=URGIAQ@Ovk+&Mla;d1Vf&s%Y3n>sppUrTRauk6v%EYD}2eBXNE zVZ!$ehZ2O6f&%XV{9~E_owDy9u;V*02zM;_e;-OvUKcO;9^C+5@}(zfU-sr)>`OHw zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&Ih`|3&AU}oQgMx2JrSN-Cc*pNGfu!V> zE<}I`5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&Ih`|4y z0EZd6q1+Dzlb1Tb1ppP0>|~~x`#U4D9)zsO!HmTjr@#*gD3F|3se{r7Z9)jsQbWTc zG&C$CNk}NnM8bd^yMx%InxVpgBfWJqs$jk%D>Iv-O5$de<@?^TT6q zdCb!e7+AIrD&xR+B{m_k-E1Fju!a76VE;^iM2$g;<%AluhWyc@TaiS%A{^ddH!$FX#O2rjvSAv?{t%F4SZ@Iv zp4yYl1DoxUCoKl;{ZLTgL_PE&_eivk<%ZXs8n;>b#Dvyt<$|jo<7(8`xl@2`-!*W4U?bN|INl<-Td*t o->H3b;*sjtO8fcx7|{`~Ldj5!!s8I)B}lyb%&2Z!^lzJGVtsg^7+ zb;&i7v*iUb+O)YKFdwmgL@i@p#&TlJ9Ajfp=P~0kh}{t5m^hawAzlsF>qnp-1eSpx zhJv=zEZ7#c3iE`p$Sy*EGnJxx)KH+{x^V5!W?Uo5-LAojkwJ*j9)f~-{Ord|x81n( z_?dHm|F|MN`N%U3P^UnFl)!K@9~3^aXO7>LZ-fixB&`OX4|N7?N#M9mQ1D(p{~lOz zj=5YQpU6a3*GB7F>L9P=ZfFR$0Sf9*yG55`W?mG{5I@o5AUnAP& zY7Fp?Kl);gabj^!1s2ES>z&3nXm7QdbsAo&$u=7G;QK&xO$nOomYAAT8;uP%&9zdq z^D*OL@CQKi7Aql7srk3Zj8!(xN~w8rld%~59BBTj1kH6z%{<#`jekM=!e{>&V!>** z*7z&nhDWH@S`9*)%Un%@5tiMfA&Z z>i0^}JRvo&*Bj?-nm>`6FEto%2|uTPOKL8je=W5vGxPL$jFUFa*QDk(kMV8r6_!(v zl%RP*YQE|5ZUTTILjc394f#ygFnk~!CJclHycr#W>9M0ztwmgeOODiC1_rdn%A}(U$$w& z{+7@4;5MTX{29=M{VuL`h8W8Y`&@OI@1Lw}?YqLiC-3jru|tW(hBSRb8A=}9s-zES8Q93j6qhm{ z)8oT~>4Z}IB_%MbWfEE{KEWe;daTB&K)*_+C{Zn|EA?BIfU1U6uC~LM9S?maptkm@ zYM?i&z~@UMp=Gjlb#)3GjU`h|haNl;8}o2E6xS^AEQr^|ne1h|Q!~#fP8Rk@B33#L z#p$$k`6I=7lp>G4obmxZQZW(@gu?-q2Sd@2dN-m)9W7n2)NK!U;P+E7csH6>CrhtU z>V-o)AgcqTm70u}$Y|MYGM#dYslGj8 zyO1^17CF>Tf3&r;E!4rIUBN)8Z*C#o?ND|hYp5nURBxy^pbVz9tddIW@{zbz&vy}6)I9UTe!IFJf~~Dv>oBd!gXcmIbG|e z4F-ZCbr<*dz$`3irV9m}tkS*}gRl|}M4}M|x3@r>*mEmc{(JsmxS|za@!Na=zTJIr z#e#odqWQ${+z)>LFNZJrHBitlmy16O%Hd-?UmB0vO)01+SpM1Tko0U|&I zhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I zhyW4z|0PhJgMWX9mJ`49Lj;Hb5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2>j0pC@^9eN@*JGeM^T@18{&A@rzWqfp)YX`OXeqH0kT5M3uu%+VM z*%b^LToxxHHbB>vkeC}H%n!?8L89FlLy-n&FBio>g?I>h-T2xc;ke^`|2pW8XD_16 zeNfgH#8|f;3Y@bj4C7wgee5suxfguwFJo{;e>mS+7{=JY@P1+b$i2!@ZMDUGs-V5h z56_H*5M_kHxy42CDu}VSyea_x(^$E{T0AAzM9p(@Ds%P0^krR%SW3$dkHu2@uq)it z9^@(>4$2c_SywY}Pi98PV;K$HdLB&1GwFCbrDxJ3BU;9V#|LL!C7mMdIuOgahSDRj z2C}X_URUE5@5Ej`-t5sm&10DZ-idwndmFr4n&41VcOvDA3hmn-O>(Y$R z_kaSZ`SZ#9%cp_t4X%s=EQT_%au30Md|l9BMINnI%HVj;lB{C8+01dr zW0l!9$15-Nel&3P*kr{wPHcK(s7af8U%zzv=Yi)|RA0Or+w+63fB((?^shb`nlAtS zl`DJ8Lj4uD4xc`JXz~x|p6h&e(|14X{g`_CsXf<@y|)eqk}ck%Um-#dR(dE&M1*B?rKG`^zj*NpuK D*j~j7 diff --git a/9_Firmware/9_1_Microcontroller/tests/test_gap3_temperature_max b/9_Firmware/9_1_Microcontroller/tests/test_gap3_temperature_max deleted file mode 100755 index d073d6811fb3b65a54a81c080d4365f4d6f412c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34088 zcmeI5ZERE58OP6cl9B)gQs~;XUAVk-Nr2dK9LNjt>X4Whm5|JF8AI(ZH-1T69NX9q zByBgGX0T4{v|L2HvS})v(3+^-ludjX+M;D$wV|o3%}QUiO`C_NE~r%6)DMFWmi?dW zdlTCvP*LsEo=19o&vRa$`#-;PuDN`0&g&n2@Snv(NCIYom%?L(LL3n?Nx2;(q1trnp(x2ff09ZW%g;9k z?UZjV4T4cj^O~_jk(w!^peTuCUsqzLDnH-(5+k3{gW~Lb#YR3b)J;)*iDWz!>7I#m z=X=@6chpEiakgdWrh4RyMiR3V&exYR7H`5xLUDc$qe;IgN?+tqDB@Q_kzf=x`T1P8 zXXd-l7)0@n^3l3Jr{`&H_BJam?YlZNtLrj06|TDFT?u9gzab{8F!l?z>Fs*05VaUV`e@uqTpUJx z5^*(RVskhAUBoMJt$z~F3lc0sxdTqN#Bl0MxeDR)+1(hwV2(!0A;W2(+4>T3TR7BZ z^ACjmh{^7SlaBu7?{D@`Y%6#=J$Bf3_K{c(>STCkPD>&99=)uyl73gX4sH7Ua3!n2 z{3s7SH`zw_t%p+^%|nQtASTUffu7ERL^9B8-C~8VP?z3Gd=?kV|3*rPVq7bYn0S$W z22Sm%At6RGBB^>_oBmbd zH@n7*y(1n;DlZe~U--&Y+moK2ju+#4EUzk?+V=cCSnExYO-ny49K5#?Ea4uhX%Qb>lrqLg!j^f{o< z;TrFG=+^XE78v?2t=C>R^&#I}`d&5l^=#07i8A)taPgo6j3=Dw0*jVjlX42IZMr<= zJVDxQ&}PHhx^GR}>S9CN*$vu=sSWw&()K-5TWgi}9aEcBo6$BTY3X|nZ7WmGIB8oC zZR=g*XFY~C+GoF+f1hnBF*#LfM@%gkf1Q>JtM-_w`0dE#-MyzCFK|u7!q{q)o%)pV?Cwf1Q@oHth?h7P(sUl9oqCJOa;IdJXQm#x=hE z`^P;ae>0x7;#Fnom8f4iN3K6rYptXeZ6BA}g++$WV!MX#G+n2@znkou-PGl^YgUv; zhrV<<`@5xBDtUjO5MFv-Ht2m*o@*b)K;Ges$Gd-MLdw`3n%3&xxU(39jug_WL&H5L2z)%-FiQ#@27NZp@ZojIC{yo5Nu_aG*~O z&o!*JCRe#JY-6L`elQTHiOc>#GTWtQ#2=$S+a%K?XKpXJ7urC z)7z=f!QHBFrG?nYfy||U&VJB)*kZgrADijjl zhYImhl&R2b`GW~C0Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@G zCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<3w|C_+F6#b3`zr;;tesr=d zrT;z{Kg-pt`GW~C0Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@G zCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@G zCcp%k02BD16OeI-4){Jej;zGd)U!shX>|6tX?od(Q`cQ)O=g^gKOi9Cz+4Fj>qFrSh{Q+NJGNAMXRDU2YO7sI~aaR3U$tnG$O`I<*mS7@YL^L0Af7Zle6vIvX zDGJ%~dBj1C`umsv5~4md)QS%})04`dg0IbrsctPC=XdHx@vgjf8gJ^UK$*syF^c;5 zls-Ch4;r7{o~@s7ETxk|VKkQXEJeZ8M`w~Eq$b_yocHXwDKEx(&pGYO5mWY3IPuSp z5egaWb^S8na9^DJd$V=D(U$NzI2pc6~>sBLyL{ChOBztTfJGZte zp61qOkJ24W*cz0rp?L2hH6B3GuC#@G@u)8vNyek$a3F4@!-x~M8=gsQJE+EO!Dtv8 zDq(xH*0!;(c3^+f*WgGx8e;K-wF3w2`)g|J>Z@Vh5t~=fIp+b#RlZtZgBq|#g)-lS z2qNsGKQEpD`5&NYuGI?E(NlCxSg@Ha`p(DE;9?J)3_E%#C0lT8?8mYq+LmO}yyr2C z)@R--uYWo5-iZ_ce(%6@$0pwSaBtDMH-G%2)kTf%_g#E*^A8Wd{F6P=UtbJP6uvV# zx!=;hr)c_#(@#8hG_abeuo^ z(m$X6eYENMPn!Q`hL$;+B>!5ThFd}^<3SZ1B2h)H+uYQgJrvaRwcxL E0sNFG#sB~S diff --git a/9_Firmware/9_1_Microcontroller/tests/test_um982_gps b/9_Firmware/9_1_Microcontroller/tests/test_um982_gps deleted file mode 100755 index 8f96f185d93a4ddeeff554a84b17c5e1c230aacf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99728 zcmeIbeSB2awKu*elfWc^fP&&142qIqfP@4{R5X#dV0km3VtpBhWI{%gOvp?Sq}Eup zjY8W@#jCB_Le(00^fp%P1Gl13s6{VrAysR8eF!IxW_YMb~nte_fP*ZSO}NEk%sehoUIu`+$+4e65?!}WjKAl z#ies+e|dKKBBt68iEK~m2a!%Q3i^CYXD?f7&zAVR?P)^6U`6muSJ^&aB(Nr;0Q@-V zb)qoojk@0|Lzr^Kj&#u!yT*mj7mhS8566<6^hAqAuT_@-Y|`^6deEUfe7=fsq#;0F(|x|iy4!MW*4V9#pahvbcFVs)lvuxR{O~00VK{xh6(OS;lG0m)vhvt%;VVcC zz{P1Az%TR`std;{I{90(+v3loa0rv1WC!IelJ-V9%~CGQ*mvtRX?^|V)U%uTw*K@=6uo70Vgzk+DsE$$)LU(Bs7@zXdeabo%Pjr| zFOH`TieFl~FyMH9pFeNmmuAnJXITgALFuhY6)v$jX_;-ogiPKFg=nIk2$ai1MuCF! zN?qbj)h9 zr0;=#_Tx84!PFNI%F6tsce})9ZLG{la`d@fhkDn!xAyK8(ar8L-K}n4H~heMP#eK( zk85|aCn{ET2(grD9??|paf#D;w*F;I(U)|&3=!=dDth{SqL}46hnDmZHxuQL3=}(2 zzR*nfY!$0I2maukPUOk-fh9YuU1FLplj$lc?(~%udt8}UcY>y*r|LM;*LRktPddqX z8>jhDcp3+Ki}RAPyBP9LWxY<>MreHS(y;{cEzx{{x9df5-;I>DsXZ;Nsl4z4v8iLA z=poNX22%E%m7Qn(;2fQ|16r+xgGfH}$G}2tlN4r`o zM+;Bs7}hWC1$Be>;ho^+9oUA%xuj{QaAj^_`}}q++GddG?HE+j>+#+?I$iNWcz(|vdl>}gO*5A0Lg0mRx6vpctjq0N`+_}yE!eo9Qyed^y76|_O*4r zuR9xkHap){4F14FNe}ASG|9wkv+$ZufH%@5HjOdyc3XH2C&2p;;K7H*`8;UhRh|Iv zFz_h9dG@ZmYHJ^So7LB-Ul;nCh<3Q4TX$Ty9k^Zu`kqnZ&tFrz?L&WtQy#%`o+0S} zfJvMB>s?ohc2jg`xrSbM5)~oh){eMjg^x-8XlO zX9e2*#_qcS-#XCp$K+!jaR$WU+X2JorN3@PKJ60ze`h*m+n?D~&THxlK6hv5k1d*q zf4sYR-#_{u>OjAxuhssZ{alnRAH8|+`7dnVd-Drha0>6((HtML-C`>JFm19-jSnop zdHv{Po7dlRYzt2IU6$Ps8_q;oD}M~~eaQF4^OX-}zLeEv`493*{a$6rOdVfg$V~WB zL*`DvQszOH%&i{CjB6?LAjo_dW&U#a;k$Mhe}gi^|JY=PKan!8hs^6CGtT46jPmgB z$2PkmGtPc8%Y4Y}hRir)`C4Y=OPMp`GSgm;o}=3Rc~MN8aZzT~u7rmJmU#JMm$ZG@ zQa5m7WdM70nc=F;xg|Y+GRpw&)AfwB%5+XH*|`<=mOVr4Bz@1bCB^&oxUBPvEq(T` zo4>Vhrd##lH1xGh^x?FAeeF7L|GxGF+Sb|E){{5YN1Ax8`pBKUR(<3SUZan6fcM*Z zeHO0ID(Q*v`V3s3QPQ)D*NAzjr{{RB^wtU3gP1|ecgTu|SY{i_lnhZZjx2-ND#NvE z%V29PBccOuP&zSh-y9Gg1Xengu&UO$rg$LUAfri^|>ebt*X zKxZ|k49M?98fDl+88C+0`h^@X;R{Z-UvNA70`h_}9E&x(Fs~lL>&)&SmwR2~M>9>z=`QI>H}K?GN84o_ zuu2qj{NwfhEW`wWiStX!M7p!JOy(GC#IuNDwqQ=d7?m>BK_=K+ckB9FVq@V{$=5B` zScp9M^zKI>6JuHUy6%T5pXz%L@>=!1@9>&^4?6!guMsOzcN=*P-H^_&d9B)y@H>Dd z->Pkh`wOEC;n#H;-Nw-43uYO>2XvW>EFG@b`k1HnVZ?MsY=AiGsAr_~4Lz;U4dprv zdDtJaG2NwZdF{Emw5L_ae6YJt9nWJ7^r*R4=eweKJj)~hh+9N~-_!BFh`NV0wI6o7 zx22&h;=h)AI?|%&(UuS!!*?J)kH_1cjLltXe|}%ZJM4!heavnpKLY#^_b}+E%@C)r zAKX;F8ZyH_?(96*qN(RPJ%wN1@W$cLl{+^2zaKj?n!&f2yTbDa&q z&v9jK$VMHyk1|He20hlH<%h2r-U)r|!n`PHER6ngSjEHpwcWulFuu`x9SxeDDvj#_ zdsG|J?;J+@p<{gyjWo-AQ>+@RbVWP?pH&Kb94j)SX|AUBRcL#(yPVTXLJ3 z&ONjYwm5se5x*Z-*l)nEocq#tr4Eoz`#n5HL@$7T+&JH$?drIQ{Hwg>m_vOg z^<>2M#`*|-jGB*G^J}BOv_3bwi1RMWQLWc8U~A&+l3knkjz(O23*y>aY%w0zYUG+j zv!lG&eZgp~#q^8iP;M&cMdX2WWx4hJ$LCHJN16SZ{9#Q?;(AtDaYvK3GtiT1!(EBj zQhxX1dCFY%HTbg3l`+0hUh)-NgE7Y}!>&|6XpQ^a(_8nB*)b4x zWwI{z0VO}vNptgF-;ShqdK`M6V;qt66z|FD#be$w=NN)`^)Tbq$zs>xOT;e5hv41v zk&LzCa>RZ67*}x%_-1^G^^x+lWlinq7vFgp^FjFY9{9|j?3-OO)->Y zCvAtg8V9~8arvX}=zNrCJCn!5pgBnK_bB+&=~AYf(xd4rkK^qoQ?8cuXfNYkjHBN& z)AyxE|EAKLkxo60fggHKSMrUP30?r^9k2e6-~D51nJkZvgn6pdVVR#zSDVj!geIRF{LLQ z-(9q)*!XV5y@pR^pGGXS<0bT^64-?pml5qb5A!5mw`N5DitE)FH-Cup*Es)<^J1*? zT!T}VIhqmu6lLxJ{5sBAX=2lJI4^LEO{;M3!YRvD4v4;wa+&F3(}oPOsb+vme_=rM zZKUr6{PaMTHez7(O{7irV2uN3S*FB-ZrKRC#N%qK_gk2;Y)jTC($Fw`bdJxZZ}?y$rrC2WeO1cY-Tx5M#|tT%spC z17jg#k?c&-Bk7k6if#Z6d3|h9v>Df2YetN-BZo8)JBinSaE^WLJMMRBQ=|?5*5Yvu zk@2jgwR>>15ww`kQ>HB*5^eA4dk8m9PI*MqL*2%CfOJn-LEfF^H|+9;06HT;}AtY-se!ljONr^KlY9Pts+-2+xlVjq3_L zpKI{!Mf;2MhDFy{JWIc!<;~_8v}%~dmF1x4!4@9}vya2GEDJrmblFqnS=PJLs24o{ z4`Mm;#Z%HBH$3{KljQkb;KJrlis#pK*)PI#?eMs+!1Er1XWSlaACrvVJq8|h{G8_D zBy`-W%YG4lU8mdlebC@n>bU0gXjixFfBo%Zmw^kOzpnW>37)yeEZgIFJkQKHbS!kn z*4}j^u-=|Qe{nEArykvHv(brX*yN~Ca!46ApAp@Ib!snkk2M8(ABpS2o+lq@_hkO4 ztM!~cUHd(qUGm=0Ylpwu`s`!vt!HlU>U`(TF3%euTIpDKUZCR=;4=2eLEp$J9TClh zk7Nvz33{2Jw-xkW0X;A8HDw~!cpP(eZ#*^`2fTX@oDt1eJkl3-q726N9?36sS)lcE z61vRRWgWWQiggfEXXbo-Byf7yE!}!7v;^y|8P*!rspvZ}BF-=De4vs=@}E93>c<+= zKG=;--@G5E=83kp%O4r11=&AC?478u@_v@?|7^dqgZH&pyLWXp|McB1kEi>eZohe; z7X-cgKra*YPSk#Tz^9hO*?xPI$Y72|QdjViJ9ODoXul_c^G~(kgNDx0eh(>GBu~rE zj2=e&Ej`)xyYEa}``x4EaoDc2{jzV}&|dw@uCCVguXgPp^ab1R(=%iJF9-C3ptlwD zUID!mwcj;L=0yE(NfH?nwO^SodkXExwd8-Q{YIV@*E!m6yplz>U&~q1Ex1SZ!QcA# zzrl(6-yVY&`rimG&k5SE`iiFZ?1MYInm^dn)jH@4`cI?%f}ocJdiR0eR?s_9`yIx7 zCRzV`A9;y&y@>eIdQPNo{dtGXc&Qcl zsBHG%W7p}cpwIkoV%{z8Y%0&eT>DnUsKV=tjzx?&7IW7Duoaf6X8J|Pi8%w!?adXt zy2{>qxvT8`c+6R=Vor^JN^xh!sDyFn1B!1s?x9S!5qCbQb>^_oiLQ9;MP58(T~U!y z(wlS)Pa@AZ4S6(;m`ui4kaR4s7?Dt>TWm5Ju_^r2tx06+M!T?Wbo-DWKAV8`fK^@x zpIJz!zOp$VK5~xKnOqaW+DJD14%bFHDu(sv?VfX@(`~#Nb6W6LoP@VSiFkV+yyYk0 z4e2r7&OX=1TQlyzSiB8R$lEX*Z-cch92DT~bc?q(=RAL#owqjGj``O5YV*g@_Ocx> zc6sjo&#um1WyhFPRe$?y?fXA(?aIFCH(kv~0>S4 z?ESC@c_-5kId--dey81Y`b%BaGxu~g8|yWmBM-JWU;kWJ*+2f!RrZ_2eUbPvn>E&K zwt{9RXa+&^K6A~cB5_~bXOqR=7hg^yOGyGfbL{Nw{%(8q@B7c6lF4I?otAGQ4U9=S zu)!Q->^uUxLD20tkE%%A55H}b$=(m6Nn}dY55KO-Qev>bbm;NC|j z#(6$xGe(Z{aXn%!PxiknRK1ps+jUr?_2TG%iF7zsmpug?UI3ilbxYvK%CXnLTFW~n zU$$j*d`y8a8=++R9qv1czc-bKow^(~Cc47B}Cem*Vy}!Ne-WR)?o$I_wVpMYsPwF>7a~^2k=UnSe z5{vxQCX3w%?nolb?MeJbnd{%$%L*Uw+V5O9OCrz7`i*&@I}dbUaju^w@r8HWWU~9h z^+{y9Dv?ZMt+=H6g-z|%5A5jjq`%Qs)*X)>o3DJZJ^Pmb=xUvJpv&`7+`spWO%$D2 z|1I^#V#gq82SGa%wC92LiDHwhZL-<>^ZX>TCF;+my6h?R=SjeE`b2ww_8dPpxxwmZ z+9!IIEbrsqGX0$Pi?4j%+@5pOkGt;s`RiSo87dCFNc4_{PaFHDH+ubF9R8Ah{05gf zH|pQV8^_xEIG!O`#DL*(OouK>^AdK5?K=2%ywP&6l`V-aQfDJY~$!D+06MD*v5bd zlq}c5X2k7xmv`Y;+l{mj+~fXDm)$<}b84+E-){HZ@zbvC|MO~B>uD!$i+=rBJ?|Fl z$6GFlwaHe{&IIio(B2B#@qV1ZzAy(|rsS~3WxIWSS?k#`E@R)PToa&O>bO8ZN7rwB zTV;%Idn_Hs)&*kYTRdK1454F&d>e0ednri5TOxbO)@4t@UPc1PX)k^28F%4c>$;KH zb0P1yw&=N&WB$|Tc|B$?ZJhrMRIF(b>vQuuf90*Ic337P)SK zw(b~@HSY0Pw_m46?D{dogp0_Rf+D2mj@%?@_(#CmRE9#H= zN0d=(7?QVbNqBSENE_$KKhR|p+eoaP%{lT$;PkG$7IEcL>|;n2SITiHhTG3ZdJJ8{ zM!u?KDRtUN^|g@YX z*Zxx*Qxe<7vlqqe;y%#6544Yf_AAF9Q>2~jRs1KilV2e3l>7yr!#=K^d~WGZ`-|q} zV~X?_kJ@;%+sXHn@RrC<9?)e^!A_chb9_4)%(ykVoeaO&W+x3wmZ?rVslGVccGTf7 za;!N-^Njo3J->UrtF`{OUDZS4vBycQKU;R9=*0X-=J>dsfOaNmZw2ijXvbrZe(PS+ zPKp)(mYu}reA1s>ruFOaCyn;l!{SNLYd&=Uq*=seO6C)d*w&8kmTN_AITyucIs%&a zfo5EmesPqPWq?hVSR5r~@g$MOG1s$rxk$Csk*~LB=eKrwo_?#VEbYWH88M=bPOP1- zjmvZ&Xy<@-CTPzC?YL|Sd@KC^Z?L`*8)FgMn`7)D9IZgf_E3 zQ)-J7_nu(Buxmn`U-+^HB?}(Dk!^Mezp~A)y`*28-H5V@+N?TBn`IAD?}9nbz3Bxf znp?b`8|zy+pcflw9#1@mVnbhioIx40ZKfkHQQIV(XZC+aLE2GP{27Hd&)A8QzK$DX z&nP6a8_Y9Lv+)+Qn-fVlZdf(JnF<(v0F>d^OIuz zC=)buY_T==_1T}DZ{b{hxoTr;Y;xITu1q3xB740-mpui0odcZSb=PBEM%lyIv+Qh-f)m(d z!ad09nNf2+&DkD__8}*;$CG@15B)4JEC$B#ZDZS4miU>`7Ehy5 zFZBK{Xvy&(d;6rmd-I}vF9Y}GQ}5in&$UZDFWXPwzf-ZA)))69Su$w%3h%(OwrS+5Q`QTG?J-bIOKwd7q=bb|;gmcB)OL!J5yLXfKy8`$c4W z-l!Kc{SVfG*apuknHD%@!t=Hh95TIQ$<)8EI&AQFpnbCKbU>H=A~FT0#dQgpb}E^^ zqGTH7lnKwReEzY$Uu{j+POj;3+OWMJYCcb*ogUIduB zHO=oKow0%J_vaT$y>J}O#&bN)MR!~Gr2EIhExhOQCB>^_4kdln0<9;9PT|W&kS~+B zE0eX;E{h-FNSb)L#Yx-VL|xX=PJGtUY!5TOJ_k6?c^UTn+4feNxc%C4RdL*|(3XQi zk8=J7d+6y~R+?>zIrLaH9?WH%dG9T+U|V87Jr?@Fy*}$51$=kGp@FM*tM~5kT?W)Q z-l^Miwd>O81hwzHnR|@*%vF-M>cBjnyd-L?_mFq8efoF0>?!DVA8`8VHCa4z&80RS z{!H=xRqH(j@o^OIm8ko)?;&ZoyDpV63gxS2U(5GKJ+6|qI$rrcXmlc8@wmjt7>ky& zoYsZJ?=k9xKVbPp`ry09G_H(?#W09u+ifoEpN(iWFq9z7d6O*mfHUT)+2 zTFr~2e<$MmYF)M;-|<+)w*E15@FDP=+-L4Gc!4Zalq@4*BUw15yog&nFT_0ILd2TblB*Ka+G3~mznGK57W>h9ThXd!{Vwc_#vGmP z$@wXMkB;r05$)o7P@47bC+5)xCBJ81VdM9`Bz5dF_>IxM^@`|Q$>{#dPWM0(y8oVt zZqb#|my^+b=1LpCKTSgS;Y4&_xHQ_9jBbye?&c(P@$TDLzo#B#UnvpM?Q8Eogg?{BE(+y(J0Vl0h`0Y;Q)3@5| z&Ph_Y>93?-u{Jkamv#6n6+0YEv^F;gIDIqi_or+=ZSNrZv>0x`*kPnQt}FPoUaWUe z&JMhn=XIR2-_ob)HF&OlK>iO=&RF}v9t-$1_&fTvD10IP9b*DMAL1?Xj-CSlUafrw ze4ng?F$ews)9&aWx!#gyy(^1(v2iQIT8GuP_d3cY@=J;I`Km5^3i|xN!0FpN$acTa zrqA^!(5K(v7y8@^dX#4)ba^*UKATv|=Qp7*)8BuDc~OT?`Fp-=KhfOv&jxMy`|oJ^ z9AhEh56C)sc0M52E&9)czl$|n#Bf@#cO{{fNUsrH_7wE$2TtF5yI%3m?n8QSCwYyv zxobe2H|TH~aG8HD^vB;a+B5e8T5B@>WjkcxLr-OzUx%J90xi;me>uptWLzKRI?3Ig z)_l%UPyadUjDc}JQO~3#^(4~ag}SUmhvvKM>~<$(ljQxl$KVAz8>DphYrJENa%dTk zT=Q`I*3nOP-S;uxp`q{h;+bNRF5kOybS&m_rB3;IKSS-q&^qD049wS}nb28I(tQ~5 z=PuGwj&rxS)H)5@x>N1>(>C}H@)GrJbI%{^m(Tn|j#kLg3^_c;J@I7Ekr->-7C!3F zf$zz=&l6kQPN*CCJhAF z%-4tEe%Nq4n+sc@k4knwY*%L7Z-95N;{AQRAFpGt8b{A=YIhB4D!%}E97~(i@lN}_ zqPPt23GDnYcX8jl?qV(Hd!w4l&-}>Z*>Mj{`bl{YYz*#!jln%IoF}*k7Q>PE!0{XFd#>XgjVZ=;MEJJcgDQTv(q#x+m+-M0FfN}aBs!S*ml zO!iFW;|Y8g#+11>-t0bWUJ~9C+13@h>?zpRCBSjs8@Jik`V-ie%i1?5eGP2ud?iZ< z-kYiI1GaXM@2a@*zhiMpn~Z-P&ly0MGF?AsAa!}jqTla1gNlCbe30YwXNcW(U+qL0 z)y@aGzVKJ%p`F{D>kH<7AM(KQIoZ40PV`Kq#*f7o*9?i-Y|{6)RrIrqgS-d5$0ke6 zE~G4blgQ$*3%P$CFC4byPHY!#+RvM7x=#Yf`K+z;S+#7oSAsD@w%bnYy_>KLxqtm3 zCCisByJ%DKsF_?0sLx z?8)2skijqd{%Fu+-#cu*PuJGQH#yo^z6Zc~*NASntmmzFjYxg`Vwmi|y6?x|H4=}@ zx!(ysUiSUZ@!s8d-;c#tvcLQdd5QXdBvD)alkXbQvIs>dW{2kwkJ(}Jca0?QYw!gx z+GMl)wcSZ%n~_MiFYvCBm^{Y2Mlv~XYK+U%|6L=A`_o379QOY7tt4_JviJ46>?zoL zJ#hNP=WhGE0J4wg)84k;p{jk_awW?}PJ74x_01o|eHzCTy#F)S_nq&^leYdV>s_b1 z?|(_l=kP5zCTdgoI*-`j9(%_j-X)sQzvNr*Fx7QTNm7UTTz#zV|H(bnPCBtZ@!%P; zK5?>psAYdgpTGyzjQ(!7rT;}H!@A#nZ z5BdIe!lVaUd(^izWE#tWA2)a*U!>3brm=6&8FN+n9Uyl}555txsY!hckndIZ5C`e} z7UETy%RK`p>inJkJD$)3zULCZ-({}3 zksjy7`M~A744viJ7LaqNtv&EA{R<$2*6op@P4b(Pk|%s~EnD4tBo6a3`MpWqF39&9 z?V@pGZG(J8cW10^_)QCbHwAorz_tO*Z%azK@&5kf>Hb-KLu9kkz5Fi1K+(%@FKPYf zLHE!>uhL4DP{C`d(e0AjRp_C=fwMWUVP6< zf14p2-(@iA_O5#g?@AWYYT%7Id)Qi+xV!yU#&|+RC(1stN51RGR?g*tyv?edH+mt; zN&F1YPWhXO{1VL{-W`s7m#10rJ0g0PF7K#sxKUr^pI5Mz_^&j-OaNm1m<_3NTOX;!)^wc|xK^JY;hqeWtY&R#}`_+Av zPSDFdvhKGrn!(_XBW!=vy(iueEqhS5!ull7v=Pwf_h|8K=FV9C^eOo6!eM;>sP7D% zM*lZuyI()&Ff;)V^1DjlLEG*bcoqWRQXpSjG+)Xt`7I0VRj_zOedJH_XxQ;#@Q6Nv z?>8i{W3~hP9LkfwY_xGq7M1r=ERXGyHON+m^1?SAo-EeB=aAQPw^;Sj0Oc1c=cix! zZ5i!%?BJ*;80?0wdpL(FRqet48OtAzZ!`_ZH=HJ0-*6gh=;9-k<5-acIyuAf9i$;* zC%>oDnV^m`bzd0rN&hebJZRkP;Dl~`XKC%n!28IZx$WxVgEo{67i+0c)}d*$4?A_b zA3BZu0>^jHD#on&p?l1Zz6Z+@cz+4JzqEJs4wh@(d&>^C zW9+-Wd%wR!wPTBJM}DWuY{#uAgLbs?RXc8l{Ip-)j{V9EDZ#fO$L!F$mi0oGR`BsI zbj@|f&P$X&@eF{}XISa;O6U{MKyI6Z{|{|;fB*8$?jKy<4BD;k(L2y4E%aHQjIy1rGso=M?0)C+ z4)`tdx!L{hwD1g@3+D3TY|u0-{m{Ga$qk(j5+jU_~uAde|1oNYJUivLBPqnb5IPY6LO$kHh40j2k<&r++ChEMV1mUyTd$TWvBHitCB|v94UBF6r-FgEw3~Ttq)X z{x^~L3F_bI8nR&{>c1L!W%$0Fv%c(1#t`(iN}rICzR>w>mX51iikkPk;2^P8}gOTdH`MG2K)t z$BFCQ;=qf|4~#MPR~!#uBa%MsM9QVdc<48gT&?OGc#K^=kT01X(e5~QXM*1tecCeW z`y=W_e@Z;IV{FzjCC3lO-t<|xmT{N1<ikAHlbPa$JKpT!}Vk?3IH& z*xH6MLo6FG<4p9UxbJ}9*n)Q@|F8nS1AdR+09}WA@r`Hs-T7A4hv>IB54i^Qzx4R| zYbaam<2SF_S^*yco5p&YY_Hb6kL@^KTW>?Yv#oWT={kx?`*?KF4@hS|`a!I3$i9XC zh;K!1!}GLHgE!qTNQ-?p)@NBZL7z2w%T{`$j4ay1ez!@i=<^286`7v3HHc3>M ziaWB+zJb_5_6^1z>>F&CBzPmWRGrjj@aCHlBI2cis=&%ptFy1K)`; zJac91OvF+%5kn7XYCi&>%(0H;J*6Y%dXRvBmEUDVKEKO21#6Wb!*6qp;CzXG=;|RQ zJx_y%HD-I{n0@~cVdZ5e$jd|?%F{)r5Hn;uz3H9V`#sSo8HGS8|Ml&2XKk zKyYri^9aT@e3KW?IMT=MzMS)vj`e#kkIhri9`-m<9>%jb^v+FyFi&zxT6P2t@E6tpMI?G=MzSWOUfPXIRN8_K1=ajJCMH*hvc>W}55Fg)G zEKUP%3Gki*UNiJ$#r(&w-^9HYxDS7UI-7uZey})j%0|0nBX-1GR(`Xb-$LdX#naMp;{AqM0-gR!wQ@|(s>S3-wpl@_2yd}V)K0TRbT-PgPy&7g8}YDXW%d>!j8a;*vb_eMoKG5;24tA2_1EwNv6P5}Gqp}ZfVtmkZ_UxB9VSHlN5 z`qfO#HnXw50oQc=EOrdV3GL|nIYuDB>XBuiYo zaQ>pXV&05!(}uwVgslctF4W|uFSw`gIhm@#99_u2);MN_3yGnbm=cmEp!(FMuqOC6hv-hRR@_KN9dR_BVusbt{ZaGSNSk-1JW+Tm4g^ zs|2Y_{WUAW-n?01qp~@HK&5xGcYd%g;4KY@1GUR*)*9K@`D=oe!N^(^DP0jTGL{7D zD!ns9wY7fy#s!;K7mRq91XeW$>MG3Qvnzo;(;p6)buTXWUO27DTOL@^5D15Zp*lqf zsymeqn zmfq~WXyVkVVXvrAEqbYUHTC1AosOHk5I?zjdHH#T1(WjfatjOd3Mb_k<`qoKU6`9c zB|pDtQqk1nY5BR==jH>>&6`wQl$)QQkHWbNawks7pHz^$U_#+^F{gCid>a2bKe+{kpi)p+m|Hp_e~wWwSZ6VseS1R)wg#Xvkdpvu z&K#pog=CPa4WgNVKfzn;Z-6cJr(hIbc`9k;Yy6R5q_HyKjceVzP{aYa4sZ5~Py{}ps4CYRSW_RU zh`=%k<_L}5k6J;&)S^knQ>NzSd6#&z>jEoK&1z^ao^Hsdv%OWJ2Jey>EhyY#&9DLQ z_1^4)iIqX*cq?iCfpCs6@{>`$UesuE3Fzlf%ZJ4kPoGlkoh|a?kU_0J6b@1Z$>VHI zBT!q9E*_3FuyGp#k;aC)uySw+d}pR zfo^iCx2mzG#v2aQMWmx(dwTsysR{;aD#P*CLN|`LRb`HViFj8vqSHmziaNN|us;$O z)s>-o;jghQK&%La&?UoxdaI)HrC$QoHS_`saYmsuec4;56ih29l)W_%y>)s)(e(Uj z1yk8!X?zH?#dBsIV?6XCa3X7+p*XHI!R^oiP0>5svsHjbUNYvucydlgTjn zkaBPkL~_si;@n?nF&wA4aKf}gu{utH9m}hFZyh>cMYX>U;{c>!Ar9-8di{-&P+h1t z)EM?w2mBZmS9rA-6DmQ}hAIPAX;QIVnM_k|FZa3$`FXmut`J@mHtW5;I#B181}@2X zud@j0x&mwb6%h=1c~D?po_1&!L@!z#BYQ`nA!Ly#wUej|_#3ML45?WD>=v`S`EilT#IbVvHM0r&Vi6|XLbqx*hdo^nz=VFc*`BMre6;7Qt z9Yph{$5@rUaqi+co%zS1Gv7fc|0)Na`JxKeda0KqM@;}c)YjJo5ct?T|IG6FbF}t# z`&0jO5b;^~wHV-oK#d`WF}lE(K(e~AZly+sfy<^Oa?y~if7!4MKD5nLHH2!t5Lv2gvO^O)*Ma&hXO+iI_!k}*`OOA-)OMQ0~kNzdWzNRuZkdg zixIP`Tkfxf_$t1PX*3vy>%C2maJo|1qgKlt>Qu|3>TU?s`k_rad5f?PaX~0tAF6|q zh69Ldt7`l!#DzLDcY1Ly0^i&@^A^sAUzjp2w_tkFl!ED$Eq`iZK_Q$QoM%x{@nsjt zF!=)1j1ZZzo)4B7z(@pd7K?Hs4UK_VaIMoBYEbOj#=2ky#$Wot8XyYk2QUy^>ea$n zo`L2ISt7yO0Ahp$#dH*5X>IL`S3WO za)?ml5+)r9%4$wzC2CwyL(7a<9sU)8OEKnhY^QqQV;kAuYy4sDF5$s*z4V@Sp@|%p zXt6A(L=H!S7=7U~r8(R2=*2OmF)%fj;*HZ7T{(%y8-z8`VjCH2#l4SFF{(sYsD=B& zgu=&W#sG&=p}rn)*n3mMO?9?;84PIYGH*?wZbhV;R}~?K5V27P6$W-k@7{=h8E9~iC%F{y$7k_;&!q(RD|Sj}~0A+48iV?_l=Xw#n1 zG%(vckSZsz@orDL-s4Yd9fj?4-y}2Isd?T42cDWCE3N`{{^jtdGz4?58^=)vFy^BG z++A$`+ph>SG15;hyF)A~y>7O}U%b@9MN1K=A?QS7RRvdgvlm{sz9!C+SA3{psk%*(#wv?xrkypUQ+3qoepM6+S&qmjc^Y*Umt2<|5&(S zcBwbg;IFC*R#@KF#8K3M)e!N*6&mCmBvi?yelvi%ID!MLGDx3d1^?*dlQFk|Kav4B z1GmOHD_*PQq{DzL{McX<35D1|;3^XGRIufE6Yv#tRNi1Ed`l2I zsT9mpnw8O%rM$TdRcI8OL+V0ka#^m@R-2ym#int3`lkxV>yFR#yqFmNyiL!`V0~DehZF17A{QqQ{-((*k&ZRcbm0X!Or&*Y2(cLHJmnj3^fh61 z;CWp!Sd13;C<<-o3D>RMWHMg3ZdxEj$x`8}yk3aN4Z?NwRw0Hh7p@TjAzlc8m9R+L zjSa{fBO>i`y!`zutA%^%?IJCGjd0IeBht#&3h~5R;ZDCph-F_DX&rZQqch-pMf%`- zg&6mBk@57`B_nB~L@}WFO8ulXkkUX(11SxpG?3CjN&_hkq%@GyKuQBC4Wu-X(m+ZB zDGj7FkkUX(11SxpG?3CjN&_hk{Qp@4!V(gSvi^#dzKZIVz7>uB z29!ZkU428aE>gu*dyy)C5LA7>+CXhM5V7*DvVv)vH0qZy%BZ@5wfv4iLntPt%O^hN zOB2#XcS{=nZd%X3pY*x#x8rVJxBUa6xXT0n%EiGtF>+~W#fq8$FVDTcAsCTYW7EZs zuR&93i{~x!iSdER(qP3(F*jY@vxyXrZc1~N2Py)=)d6vHx_B$f#NFQ^g1;dm8bbAA zO}f~=k;&btU!>{M_qmof`0K*8!HD>_OJvLn)cDtmp>xH8C5z|zVp$bS=PmFpzJ7sk zNkn}0+S2l+KJg$M4&*+0ltd5wfPXhX#=jqYpMM`lif{)ajrHOqSHvG_42z?#wRIKZ zuP)&Z)}g+4Tn&NR5IFw86&A-_>Eg2oiMZ*z{M-CJ`S%g>S_k#}>%{YEcZ5N}2VH~c z&(hMxepz%k3V{P4i1dKilNM@>`07Kq2O7j5(!#gNgwSi zK1r(&`Wny#;t{vvZ)=+3@5gCjvBfRYilq2v>?WGiW=<%?gZPZ6&n^--C+S*3oEUMN07>JFLu zwEWv9^9n>$##Hh343Xg%ZRx=&72*%+;rgIBnhyOGh`*>7QOO46)(l|fMP}=)d#%h0EMF8k9MHLwGp(0dwFA(=owHU3-%45U$}RmNNZT*6P*Jh_`6}C7y#t|&5(Mh zbkZcA8lc=npw7R%CQvD!8DL2cuAUnZ35s6~px%693#j?gaetZ-f~yff9td-moqpf9 z$zg4!>|XyE*l1nc<4G4U^pL%#mJF9KvbH`TzR$G3Gwp+JnbSrgK7$Yng?LS*rsL z!K$@z4uOi5;l^6gnkBMIXDyjtRFLOe5b%c^8v?#15U3_F8{MZ;WR{iA_lc)nzS?SE zU`?Q+F%s~xB6ixIMis{fYGE^w#w412(!hy0^P`q_<^sqr_{jw_LBue+S%eroEZA!}VI`LHuq` zyJtYFtIhpZ`orlTxQ}KWNZ;*Rx;VSdwRl-}{jw%ko9n!B_oUr)>u0WIH&q^U9Y||- z*R;47SK_#}rh0_u;k0H~Vacq^i;5zJ`&@+>Z|^|AI1R@28pOhnxKF{kXbr-f6#Ot= z^h5Xu3a%V(!P^vE1Uq2<^9t@5X~BDS`Oy~qrh-R}vEV-|_<({v@G|75$!q10Q*hx} z3ocUd2MWGM!4F?x<<}_K!*~Mxd_%$eFS6h#6x=-Cf?rZ_S&juC()klC_&o)`aES$f zuHa+27MwNE;@4AP!Q&L%GR=Z7Q}AokE%+J*KXI7_S1I_-85VrEf;}Y`{D^{cud?7a z1sBe;;9n{Dra2b;wt`#cS@5R{KJQBw+^gW$`4&9NWAT5}LJOXz;7thdsK4tKJZp&s zuTk&|OD*_81s}WCf_EtRAY(Y-zop=(ueabH1vf3T;L|d#`j_5d!MO^~{;~xxQSfIs zT5v$Y^KZ7`dlme|Efx$fCGF=Xp9R0H;Jiu;ep|s!0SoR?@S9Z@JPG}P_Se0_g6Apt z*liZPT)|JQwBXeWURrCx-%)TIB0$RjqJsCYvfxeyKOMH}# z!L4g8c%g!iDfmVO&%eXUU#Z}Tf>$ee+&U}&8#-UX-%;?!yR7_26PEqYn5Pz*XR_^UimJEJV~v_|pl$#Oq(C3o*`snKlk* z6EAS^XQ3mX_|@oV%v+)GHOw^P4@N-1gD~;UeBwu7m(06E;cJ*_#J`mnIQT<+GoSd{ zpZ^u|k$(-dJn_-}d=0Za@oUrz-3Sxk%qPAcFF1Y>U&Aa<`~wd8 z&3xkP@rC0J@inaRUjq#ugjv6tPkcQdaeN}ahFPBV590+6{t(~HCw|!(R^D^z7QTjA zp7@2lz`-BloB725$_OiOkiyq6%M-tn7dZGsd^4Z;di>;gO8zy>^2FbclLukqoB71w zbf%T}gsNY|8b2bjo@a>zZ4UGnWykI%rx@%Y<*7)_jz`-BZZ{`zU$DfQxiLYUnXZ^c*frCH9H}i?F<5kA5#Mdy( zC&D-LiLc{Z#=FGVa58)|pZGc+W_(P14Qu=oUf|#l`8V@r{S&M_#?!KX1#5h#|7-JO{p+Pkc{_B^&26#MiLKALqa~^NFwLJDmRzU&9*T=|9bU;_LYl=S#%b zu*T1J)Nke!U(csFzaqYdHGZK(|7Je%_56$TG2&}j<8R~z4*o23r#Mkpj&L@el zVU6GBz&G=WujiYbe-dBA8h;HhaPWuxoB71o^Ha`OiLYUnC;uh9z`-BloB71o^I6Vs ziLYUnC;n?Vc@QSPnNNH@|K)s`_!?$;;^UTvJO~rt%qPB{FLVA(d=0aFqWaBz;_LY} z=i9{Ba58)|pZIz{&iOg-1H8b&pM{Qm;_LZ7=l{glFw0Z^ zWxT+_AL5(&#MkQsTrVKLhFLxlzL`&ay`I4J1>$R1Rs@!NQT zgFg!$`NY@jIb7c%zJ^(z?RS&If0_Bj*XuuA4uFqHBff?; zel}?EAk6yBeB$f%H?GGKU&AcV`knI^GoSc+y^ia5#MiLKck*xM%leJ=K3TtlHU2X2 zz=JUPkEndE=Ut33qXaq3<9Z%pb3Ko+Ue9BhO8!wt20jWl)qhCgYgpqu?ZwO|{wE55kiyrn#>aAmJP0o|$`dBO=c`uz zzd^sI{x!^e>YpbM!o)Z8iJz z_+~!w_4+l}vx%=^mM8wLIC&5zzL`(_PgMOAkWYLKvpn%X!^wj%@y&eVcQjdfmm{C} z8fJOoJMG8JCw|f07Jh}o*RaNS%5UZqf0M!=qwqDX@hg$egE09w^NHVmx0Tn9eDbeh zTuT0r;g<(t;+y%z|Lkj4-Xdjx8rJyE^+GeB`1*bW??1494Qu>nUf|#l>o@a>zyDq< z?=n@thFPBauffSf@zZ{`!fY# zPKIyh6aNW?f02@3!y5lq(B(mRp;4YN@zd|O@?eHieho7}QTv1K8h?buj^ms8#Mk%Nc)yMHYgprZ9QZo_81&^;dHm@Ff(ajW zz<8*{mM_4sS)S`ECOpgmGj28W83&s15(j*R1D@@G{SG+jfV~d*%MO_L6B&<~_Y)$b?E0D2mDtDJ+AAS@+^12oetO~?D5Y}9r4aT9Pm&)N0BK0`Apf*l_1FW*D&eR zen;^F2Y+aPW-2rI`ynDv|a#IO05 zmDhuO)~{ifPt<;9KJhmz{E@gOzJ@jaKG5MonDv|a#IO9em3JYoiLYT?CamAgC;r0< ze~QA_a58)|pZEt9{s4uq;bizapU)e}`ONJ2^9F>?=M4y(&l?cd&l})TTj7O_`uIN% z_;v?Oek%D#9mp0#0qgOY@f%?spG{D(jyGw?%)x;K4iX*|Nbc9VfY)jKjv%uVtWwQ`lfvm*7ietA*}6z z?N3;@Fa055?eFNH2y6dCe?eIL1NL9Sx_{Ci5!U{O{gbfnfAklGwZCBhBdq%u$J3!$ zL#K4O#6!#$oUUMwr_A>#nByto!3yShN_d!pIi3<8p-doI zK4BftbN)eC&o4NBOa2yH^tryke7%0a@t*mE6@A9v%-8WX<9Wh5US~WZ>8bLZ?=xS| z=Q)2Ttmo%kPav$<3m890{ACtDT(4lhUXNfrHx&0K*X*|X6Q3VpzJ5N0&qEN_&pYt> z1j73H13s@oSU-=kP{I273qFs;eEqx;pD!Y;pC97$5`^{h5PW`wuzo&-&%+Sb&%69m z!TNcrcK{G#oQd#Sk$y6`)T~$dj`ysykIy<= zyE)|LTy7lETTJ39@x3PTwAiK-D@pA&k$`PeNWT=lr$lDNcZ_gHfg=g~QDlnTN@7Ek zDY1Pg*niXSQEi{UQf@1ddq^~(c4}x)ZaEM!$l87q1GymtfVB}pld+&U9Si1T{sFcB zB!(gr&AlkLocQ(=Te9AXVoNmkPQ+MN73=LN))o-IP+LLNF9eX!s$&T>MPI5B3KT!cQT7h*ud5g zYd45JO>QAElCU>~TSx3E{SZ+~ZZ)%Z4XDi?J_}MiKClr38y4g?j`*du@k7F~ogEV5 z<_>wm{T=ec+Tww&Z04p8pS3eVZkT*D~Ds}-O23K>$knn+J+a~t!M4z6F$9* z4_o*2jzQUKfMYub<+eWjiG-}JgprW7#n9Soh-UFsg&J!8kqEYq_$=M5Sb;ujT{hIB zds>%~>af0C9YGt`TdMHY1nZ!lNFdCuh1T{JwaX?^qEC{smk!oh+jJb|YlGo1n-$ss zYj%{n#u|v>NDKKYLp3$=!raN@tMNyI5tuBDw*lLX6plSB3`gh43e~N!&!w<7^1r7O05CbSev=(}uA<%nv^wt`F6PHMVv>(m;K;2P4(NI_dIZ zF-jC&L|L)VUxlu8f-HAgTJaOD0jq$u|*V{^{{jA4j2V>&NxK3kV29j4P78m z175JDwvu}pV=~B{d%j306_^#gICIH1Zz-G40rS&-Qu%ao%;EUPlqh^?T4wvXXp1@>0T z0lL0145uiEal{tk8agc*GI0l{WeJhS|?`|XGvN{LEMY# zi*N_38HqH&q3K{Y4BF7PGo>=H8tmzy%_w8-&t-xvGWpsty7c4~{<=W8y55f+rjr-X zpR>SMUOKC^oQzB^_RR@4)ZUKmx46vrEeKX%KnvAH8Zd?g8YWB5CkxpttVjb$lPbjI z)&7RbRiPSewG24j@oMk+uF79IrEq#t9*z}tlb1?DDl`Cv zi512E{OSHlA!x%k_Wr9Fw&E#<%4{n#{IAi3gKp?wMOVNODjTrdzu{lZu!Ao4u>Jj= z!Mm}Am&=5DPCo)^n5nwIA<{6JPveT0Sbdv^TS%6BhYw{GUZV}CmO*t;+NXz}#weOLVa;u~gu|5cV?s(PpqhEh#{m3)hAG!Ids+(&Te|FJrlmEV8%(b5e-x>Y+ zs=w9Ey|Vg-q19K6{9D7o1M}{E^2OGRhu-qspDuas;$N1Py*i}lNBa+4u;BTX&)oI& zPnLyVK2o(i{db2BtxQ|AETiu$+rM(hy?@xXq3pigr*8ZCfyXBP?A4cxTP8Msmj1$? znz}m|EE;v>xq?eS>mBc^&p8qPKbya7Q}g#SKb&>p?ycKyzwWPpf1~ji;n!||v2pYh zf%aec*PQ#`_T_h``NY6UGk&iyZ%vl#@bCs z-(2>C!k#}){lnK@9C7BmuKnM7