From ff23a435d692a13a90674ff8e3187adef4cbf6c8 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Fri, 18 Nov 2022 19:14:56 +0100 Subject: [PATCH 01/26] Preset for POCSAG --- .../subghz/assets/setting_user.pocsag | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 assets/resources/subghz/assets/setting_user.pocsag diff --git a/assets/resources/subghz/assets/setting_user.pocsag b/assets/resources/subghz/assets/setting_user.pocsag new file mode 100644 index 00000000000..41b94962c79 --- /dev/null +++ b/assets/resources/subghz/assets/setting_user.pocsag @@ -0,0 +1,36 @@ +# to use manual settings and prevent them from being deleted on upgrade, rename *_user.example files to *_user +Filetype: Flipper SubGhz Setting File +Version: 1 + +# Add Standard frequencies for your region +#Add_standard_frequencies: true + +# Default Frequency: used as default for "Read" and "Read Raw" +#Default_frequency: 433920000 + +# Frequencies used for "Read", "Read Raw" and "Frequency Analyzer" +# DAPNET frequency in most countries +Frequency: 439987500 +#Frequency: 300000000 +#Frequency: 310000000 +#Frequency: 320000000 + +# Frequencies used for hopping mode (keep this list small or flipper will miss signal) +#Hopper_frequency: 300000000 +#Hopper_frequency: 310000000 +#Hopper_frequency: 310000000 + +# Custom preset +# format for CC1101 "Custom_preset_data:" XX YY XX YY .. 00 00 ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ, where: XX-register, YY - register data, 00 00 - end load register, ZZ - 8 byte Pa table register + +Custom_preset_name: FM150 +Custom_preset_module: CC1101 +Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 83 10 67 15 31 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 + +#Custom_preset_name: AM_1 +#Custom_preset_module: CC1101 +#Custom_preset_data: 02 0D 03 07 08 32 0B 06 14 00 13 00 12 30 11 32 10 17 18 18 19 18 1D 91 1C 00 1B 07 20 FB 22 11 21 B6 00 00 00 C0 00 00 00 00 00 00 + +#Custom_preset_name: AM_2 +#Custom_preset_module: CC1101 +#Custom_preset_data: 02 0D 03 07 08 32 0B 06 14 00 13 00 12 30 11 32 10 17 18 18 19 18 1D 91 1C 00 1B 07 20 FB 22 11 21 B6 00 00 00 C0 00 00 00 00 00 00 From 4c092c8e6f25339471a9a40b271f7ec6b22482f0 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 19 Nov 2022 18:16:48 +0100 Subject: [PATCH 02/26] Basic sync --- lib/subghz/protocols/pocsag.c | 142 ++++++++++++++++++++++++++ lib/subghz/protocols/pocsag.h | 7 ++ lib/subghz/protocols/protocol_items.c | 2 +- lib/subghz/protocols/protocol_items.h | 1 + 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 lib/subghz/protocols/pocsag.c create mode 100644 lib/subghz/protocols/pocsag.h diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c new file mode 100644 index 00000000000..07716eccc31 --- /dev/null +++ b/lib/subghz/protocols/pocsag.c @@ -0,0 +1,142 @@ +#include "pocsag.h" + +#include +#include "../blocks/const.h" +#include "../blocks/decoder.h" +#include "../blocks/generic.h" +#include "../blocks/math.h" + + +#define TAG "POCSAG" + +static const SubGhzBlockConst pocsag_const = { + .te_short = 833, + .te_delta = 100, +}; + +// Minimal amount of sync bits (interleaving zeros and ones) +#define POCSAG_MIN_SYNC_BITS 32 + +struct SubGhzProtocolDecoderPocsag { + SubGhzProtocolDecoderBase base; + + SubGhzBlockDecoder decoder; + SubGhzBlockGeneric generic; + + bool debug; +}; + +typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; + +typedef enum { + PocsagDecoderStepReset = 0, + PocsagDecoderStepFoundSync, + PocsagDecoderStepFoundPreamble, +} PocsagDecoderStep; + + +void* subghz_protocol_decoder_pocsag_alloc(SubGhzEnvironment* environment) { + UNUSED(environment); + + SubGhzProtocolDecoderPocsag* instance = malloc(sizeof(SubGhzProtocolDecoderPocsag)); + instance->base.protocol = &subghz_protocol_pocsag; + instance->generic.protocol_name = instance->base.protocol->name; + return instance; +} + +void subghz_protocol_decoder_pocsag_free(void* context) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + free(instance); +} + +void subghz_protocol_decoder_pocsag_reset(void* context) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + + instance->decoder.parser_step = PocsagDecoderStepReset; + instance->decoder.decode_data = 0UL; + instance->decoder.decode_count_bit = 0; + instance->debug = false; +} + +void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + + // reset state - waiting for 32 bits of interleaving 1s and 0s + if (instance->decoder.parser_step == PocsagDecoderStepReset) { + if (DURATION_DIFF(duration, pocsag_const.te_short) < pocsag_const.te_delta) { + // POCSAG signals are inverted + subghz_protocol_blocks_add_bit(&instance->decoder, !level); + + if (instance->decoder.decode_count_bit == POCSAG_MIN_SYNC_BITS) { + instance->decoder.parser_step = PocsagDecoderStepFoundSync; + FURI_LOG_I(TAG, "Sync found"); + } + } + else { + subghz_protocol_decoder_pocsag_reset(context); + } + return; + } + + int bits_count = duration / pocsag_const.te_short; + uint32_t extra = duration - pocsag_const.te_short * bits_count; + + if (DURATION_DIFF(extra, pocsag_const.te_short) < pocsag_const.te_delta) + bits_count++; + else if (extra > pocsag_const.te_delta) { + subghz_protocol_decoder_pocsag_reset(context); + return; + } + + if (level) + FURI_LOG_I(TAG, "1 * %d", bits_count); + else + FURI_LOG_I(TAG, "0 * %d", bits_count); +// +// // as we found sync bits of 32 bits (in fact it is longer), we have to do proper decoding +// // of 1200-bod signal. As it could be any sequence of 1s and 0s, duration might be the +// // multiple of 833 us +// while (true) { +// // signal is too short, but not shorter than delta - something is wrong, reset +//// if (duration < pocsag_const.te_short && +//// DURATION_DIFF(duration, pocsag_const.te_short) > pocsag_const.te_delta) +//// { +//// subghz_protocol_decoder_pocsag_reset(context); +//// return; +//// } +// +// subghz_protocol_blocks_add_bit(&instance->decoder, !level); +// +// // new bit arrived, update the decoding state machine +// switch(instance->decoder.parser_step) { +// case PocsagDecoderStepFoundSync: +// if (instance->decoder.decode_count_bit == 64) { +// FURI_LOG_I(TAG, "%" PRIx64, instance->decoder.decode_data); +// instance->decoder.decode_count_bit = 0; +// } +// break; +// } +// +// if (duration < pocsag_const.te_short) +// break; +// duration -= pocsag_const.te_short; +// } +} + +const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { + .alloc = subghz_protocol_decoder_pocsag_alloc, + .free = subghz_protocol_decoder_pocsag_free, + .reset = subghz_protocol_decoder_pocsag_reset, + .feed = subghz_protocol_decoder_pocsag_feed, +}; + +const SubGhzProtocol subghz_protocol_pocsag = { + .name = SUBGHZ_PROTOCOL_POCSAG, + .type = SubGhzProtocolTypeStatic, + .flag = SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable, + + .decoder = &subghz_protocol_pocsag_decoder, +}; \ No newline at end of file diff --git a/lib/subghz/protocols/pocsag.h b/lib/subghz/protocols/pocsag.h new file mode 100644 index 00000000000..a33cc090fad --- /dev/null +++ b/lib/subghz/protocols/pocsag.h @@ -0,0 +1,7 @@ +#pragma once + +#include "base.h" + +#define SUBGHZ_PROTOCOL_POCSAG "POCSAG" + +extern const SubGhzProtocol subghz_protocol_pocsag; \ No newline at end of file diff --git a/lib/subghz/protocols/protocol_items.c b/lib/subghz/protocols/protocol_items.c index ebf9b93e422..2794a6ca5a6 100644 --- a/lib/subghz/protocols/protocol_items.c +++ b/lib/subghz/protocols/protocol_items.c @@ -12,7 +12,7 @@ const SubGhzProtocol* subghz_protocol_registry_items[] = { &subghz_protocol_chamb_code, &subghz_protocol_power_smart, &subghz_protocol_marantec, &subghz_protocol_bett, &subghz_protocol_doitrand, &subghz_protocol_phoenix_v2, &subghz_protocol_honeywell_wdb, &subghz_protocol_magellan, &subghz_protocol_intertechno_v3, - &subghz_protocol_clemsa, + &subghz_protocol_clemsa, &subghz_protocol_pocsag, }; const SubGhzProtocolRegistry subghz_protocol_registry = { diff --git a/lib/subghz/protocols/protocol_items.h b/lib/subghz/protocols/protocol_items.h index 23aa71be034..cacee3cff2c 100644 --- a/lib/subghz/protocols/protocol_items.h +++ b/lib/subghz/protocols/protocol_items.h @@ -35,5 +35,6 @@ #include "magellan.h" #include "intertechno_v3.h" #include "clemsa.h" +#include "pocsag.h" extern const SubGhzProtocolRegistry subghz_protocol_registry; From 0bc197baaed3b829e0e578cdb05b531a0edf3ac6 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 10:51:13 +0100 Subject: [PATCH 03/26] Message structure --- lib/subghz/protocols/pocsag.c | 73 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 07716eccc31..d0b4a8c6691 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -16,6 +16,11 @@ static const SubGhzBlockConst pocsag_const = { // Minimal amount of sync bits (interleaving zeros and ones) #define POCSAG_MIN_SYNC_BITS 32 +#define MASK_32_BITS 0xFFFFFFFF + +#define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 +#define POCSAG_IDLE_CODE_WORD 0x7A89C197 + struct SubGhzProtocolDecoderPocsag { SubGhzProtocolDecoderBase base; @@ -91,39 +96,41 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur return; } - if (level) - FURI_LOG_I(TAG, "1 * %d", bits_count); - else - FURI_LOG_I(TAG, "0 * %d", bits_count); -// -// // as we found sync bits of 32 bits (in fact it is longer), we have to do proper decoding -// // of 1200-bod signal. As it could be any sequence of 1s and 0s, duration might be the -// // multiple of 833 us -// while (true) { -// // signal is too short, but not shorter than delta - something is wrong, reset -//// if (duration < pocsag_const.te_short && -//// DURATION_DIFF(duration, pocsag_const.te_short) > pocsag_const.te_delta) -//// { -//// subghz_protocol_decoder_pocsag_reset(context); -//// return; -//// } -// -// subghz_protocol_blocks_add_bit(&instance->decoder, !level); -// -// // new bit arrived, update the decoding state machine -// switch(instance->decoder.parser_step) { -// case PocsagDecoderStepFoundSync: -// if (instance->decoder.decode_count_bit == 64) { -// FURI_LOG_I(TAG, "%" PRIx64, instance->decoder.decode_data); -// instance->decoder.decode_count_bit = 0; -// } -// break; -// } -// -// if (duration < pocsag_const.te_short) -// break; -// duration -= pocsag_const.te_short; -// } + // handle state machine for every incoming bit + while (bits_count-- > 0) { + subghz_protocol_blocks_add_bit(&instance->decoder, !level); + + switch(instance->decoder.parser_step) { + case PocsagDecoderStepFoundSync: + if ((instance->decoder.decode_data & MASK_32_BITS) == POCSAG_FRAME_SYNC_CODE) { + FURI_LOG_I(TAG, "Found preamble!"); + instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; + instance->decoder.decode_count_bit = 0; + instance->decoder.decode_data = 0UL; + } + break; + case PocsagDecoderStepFoundPreamble: + // handle codewords + if (instance->decoder.decode_count_bit == 32) { + switch (instance->decoder.decode_data & MASK_32_BITS) { + case POCSAG_IDLE_CODE_WORD: + case POCSAG_FRAME_SYNC_CODE: + break; + default: + if (instance->decoder.decode_data >> 31 == 0) { + FURI_LOG_I(TAG, "Address code word"); + } + else { + FURI_LOG_I(TAG, "Message code word"); + } + } + + instance->decoder.decode_count_bit = 0; + instance->decoder.decode_data = 0UL; + } + break; + } + } } const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { From 77225c59ad2c44aaabf16167a5573aff0ced8ec9 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 11:17:58 +0100 Subject: [PATCH 04/26] Drop debug --- lib/subghz/protocols/pocsag.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index d0b4a8c6691..76e584250a6 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -27,8 +27,6 @@ struct SubGhzProtocolDecoderPocsag { SubGhzBlockDecoder decoder; SubGhzBlockGeneric generic; - - bool debug; }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -62,7 +60,6 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { instance->decoder.parser_step = PocsagDecoderStepReset; instance->decoder.decode_data = 0UL; instance->decoder.decode_count_bit = 0; - instance->debug = false; } void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { From 4aeedb7b881fbba5c5d6e0b71ad2be127719967c Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 11:41:31 +0100 Subject: [PATCH 05/26] Receiver address decoding --- lib/subghz/protocols/pocsag.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 76e584250a6..d71dc328f36 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -27,6 +27,10 @@ struct SubGhzProtocolDecoderPocsag { SubGhzBlockDecoder decoder; SubGhzBlockGeneric generic; + + uint8_t codeword_idx; + uint32_t addr; + uint8_t func; }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -60,6 +64,7 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { instance->decoder.parser_step = PocsagDecoderStepReset; instance->decoder.decode_data = 0UL; instance->decoder.decode_count_bit = 0; + instance->codeword_idx = 0; } void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { @@ -111,15 +116,23 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur if (instance->decoder.decode_count_bit == 32) { switch (instance->decoder.decode_data & MASK_32_BITS) { case POCSAG_IDLE_CODE_WORD: + instance->codeword_idx++; + break; case POCSAG_FRAME_SYNC_CODE: + instance->codeword_idx = 0; break; default: if (instance->decoder.decode_data >> 31 == 0) { - FURI_LOG_I(TAG, "Address code word"); + instance->addr = ((instance->decoder.decode_data & MASK_32_BITS) >> 13); + instance->addr = (instance->addr << 3) | (instance->codeword_idx >> 1); + FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); + instance->func = ((instance->decoder.decode_data & MASK_32_BITS) >> 11) & 0b11; + FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { FURI_LOG_I(TAG, "Message code word"); } + instance->codeword_idx++; } instance->decoder.decode_count_bit = 0; From 07e0ffc7838146f24f7e8bd4a30f752049ee17dc Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 12:07:09 +0100 Subject: [PATCH 06/26] Prepare message decoding --- lib/subghz/protocols/pocsag.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index d71dc328f36..413508772b6 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -21,6 +21,7 @@ static const SubGhzBlockConst pocsag_const = { #define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 #define POCSAG_IDLE_CODE_WORD 0x7A89C197 +#define POCSAG_MAX_MSG_LEN 40 struct SubGhzProtocolDecoderPocsag { SubGhzProtocolDecoderBase base; @@ -31,6 +32,13 @@ struct SubGhzProtocolDecoderPocsag { uint8_t codeword_idx; uint32_t addr; uint8_t func; + + // partially decoded character + uint8_t char_bits; + uint8_t char_data; + + uint8_t msg_len; + char msg[POCSAG_MAX_MSG_LEN]; }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -65,8 +73,19 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { instance->decoder.decode_data = 0UL; instance->decoder.decode_count_bit = 0; instance->codeword_idx = 0; + instance->char_bits = 0; + instance->char_data = 0; + instance->msg_len = 0; +} + + +static void pocsag_decode_address_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { + instance->addr = (data >> 13); + instance->addr = (instance->addr << 3) | (instance->codeword_idx >> 1); + instance->func = (data >> 11) & 0b11; } + void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; @@ -123,10 +142,8 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur break; default: if (instance->decoder.decode_data >> 31 == 0) { - instance->addr = ((instance->decoder.decode_data & MASK_32_BITS) >> 13); - instance->addr = (instance->addr << 3) | (instance->codeword_idx >> 1); + pocsag_decode_address_word(instance, instance->decoder.decode_data & MASK_32_BITS); FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); - instance->func = ((instance->decoder.decode_data & MASK_32_BITS) >> 11) & 0b11; FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { From e29a64ffdbe7c814c6bd3438b30a83a82bd6a7e4 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 12:51:12 +0100 Subject: [PATCH 07/26] Fixed message decoding --- lib/subghz/protocols/pocsag.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 413508772b6..256382091d7 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -85,6 +85,28 @@ static void pocsag_decode_address_word(SubGhzProtocolDecoderPocsag* instance, ui instance->func = (data >> 11) & 0b11; } +// decode message word, maintaining instance state for partial decoding. Return true if more data +// might follow or false if end of message reached. +bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { + for (uint8_t i = 0; i < 20; i++) { + instance->char_data >>= 1; + if (data & (1 << 30)) { + instance->char_data |= 1<<6; + } + instance->char_bits++; + if (instance->char_bits == 7) { + if (instance->char_data == 0) + return false; + FURI_LOG_I(TAG, "Msg: %c", instance->char_data); + instance->msg[instance->msg_len++] = instance->char_data; + instance->char_data = 0; + instance->char_bits = 0; + } + data <<= 1; + } + return true; +} + void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { furi_assert(context); @@ -147,7 +169,9 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { - FURI_LOG_I(TAG, "Message code word"); + if (!pocsag_decode_message_word(instance, instance->decoder.decode_data & MASK_32_BITS)) { + // push decoded message + } } instance->codeword_idx++; } From 4313852ba3ee3ef1ab07d6bc42866bd448382fbb Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 14:51:00 +0100 Subject: [PATCH 08/26] Handle long messages --- lib/subghz/protocols/pocsag.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 256382091d7..e55b3267c14 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -15,13 +15,11 @@ static const SubGhzBlockConst pocsag_const = { }; // Minimal amount of sync bits (interleaving zeros and ones) -#define POCSAG_MIN_SYNC_BITS 32 -#define MASK_32_BITS 0xFFFFFFFF - +#define POCSAG_MIN_SYNC_BITS 32 +#define MASK_32_BITS 0xFFFFFFFF #define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 #define POCSAG_IDLE_CODE_WORD 0x7A89C197 - -#define POCSAG_MAX_MSG_LEN 40 +#define POCSAG_MAX_MSG_LEN 80 struct SubGhzProtocolDecoderPocsag { SubGhzProtocolDecoderBase base; @@ -38,7 +36,7 @@ struct SubGhzProtocolDecoderPocsag { uint8_t char_data; uint8_t msg_len; - char msg[POCSAG_MAX_MSG_LEN]; + char msg[POCSAG_MAX_MSG_LEN+1]; }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -47,6 +45,7 @@ typedef enum { PocsagDecoderStepReset = 0, PocsagDecoderStepFoundSync, PocsagDecoderStepFoundPreamble, + PocsagDecoderStepMessage, } PocsagDecoderStep; @@ -97,8 +96,10 @@ bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t if (instance->char_bits == 7) { if (instance->char_data == 0) return false; - FURI_LOG_I(TAG, "Msg: %c", instance->char_data); - instance->msg[instance->msg_len++] = instance->char_data; + FURI_LOG_I(TAG, "%c", instance->char_data); + if (instance->msg_len < POCSAG_MAX_MSG_LEN) { + instance->msg[instance->msg_len++] = instance->char_data; + } instance->char_data = 0; instance->char_bits = 0; } @@ -157,9 +158,11 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur if (instance->decoder.decode_count_bit == 32) { switch (instance->decoder.decode_data & MASK_32_BITS) { case POCSAG_IDLE_CODE_WORD: + FURI_LOG_I(TAG, "Idle"); instance->codeword_idx++; break; case POCSAG_FRAME_SYNC_CODE: + FURI_LOG_I(TAG, "Sync"); instance->codeword_idx = 0; break; default: @@ -169,8 +172,10 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { + FURI_LOG_I(TAG, "Msg"); if (!pocsag_decode_message_word(instance, instance->decoder.decode_data & MASK_32_BITS)) { // push decoded message + FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); } } instance->codeword_idx++; From 24b738a63937943cc8dccd1a739f0a014a020445 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 15:06:17 +0100 Subject: [PATCH 09/26] Masks simplification --- lib/subghz/protocols/pocsag.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index e55b3267c14..f63078090e4 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -16,7 +16,8 @@ static const SubGhzBlockConst pocsag_const = { // Minimal amount of sync bits (interleaving zeros and ones) #define POCSAG_MIN_SYNC_BITS 32 -#define MASK_32_BITS 0xFFFFFFFF +#define POCSAG_CW_BITS 32 +#define POCSAG_CW_MASK 0xFFFFFFFF #define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 #define POCSAG_IDLE_CODE_WORD 0x7A89C197 #define POCSAG_MAX_MSG_LEN 80 @@ -140,13 +141,15 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur return; } + uint32_t codeword; + // handle state machine for every incoming bit while (bits_count-- > 0) { subghz_protocol_blocks_add_bit(&instance->decoder, !level); switch(instance->decoder.parser_step) { case PocsagDecoderStepFoundSync: - if ((instance->decoder.decode_data & MASK_32_BITS) == POCSAG_FRAME_SYNC_CODE) { + if ((instance->decoder.decode_data & POCSAG_CW_MASK) == POCSAG_FRAME_SYNC_CODE) { FURI_LOG_I(TAG, "Found preamble!"); instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; instance->decoder.decode_count_bit = 0; @@ -155,8 +158,9 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur break; case PocsagDecoderStepFoundPreamble: // handle codewords - if (instance->decoder.decode_count_bit == 32) { - switch (instance->decoder.decode_data & MASK_32_BITS) { + if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { + codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); + switch (codeword) { case POCSAG_IDLE_CODE_WORD: FURI_LOG_I(TAG, "Idle"); instance->codeword_idx++; @@ -166,14 +170,14 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur instance->codeword_idx = 0; break; default: - if (instance->decoder.decode_data >> 31 == 0) { - pocsag_decode_address_word(instance, instance->decoder.decode_data & MASK_32_BITS); + if (codeword >> 31 == 0) { + pocsag_decode_address_word(instance, codeword); FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { FURI_LOG_I(TAG, "Msg"); - if (!pocsag_decode_message_word(instance, instance->decoder.decode_data & MASK_32_BITS)) { + if (!pocsag_decode_message_word(instance, codeword)) { // push decoded message FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); } From 937809b94bead57d22245f57e728f6cbece93997 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 15:25:36 +0100 Subject: [PATCH 10/26] Dedicated state for message --- lib/subghz/protocols/pocsag.c | 37 ++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index f63078090e4..cd92913d4cd 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -170,21 +170,52 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur instance->codeword_idx = 0; break; default: + // Here we expect only address messages if (codeword >> 31 == 0) { pocsag_decode_address_word(instance, codeword); FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); + instance->decoder.parser_step = PocsagDecoderStepMessage; } - else { + instance->codeword_idx++; + } + instance->decoder.decode_count_bit = 0; + instance->decoder.decode_data = 0UL; + } + break; + + case PocsagDecoderStepMessage: + if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { + codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); + switch (codeword) { + case POCSAG_IDLE_CODE_WORD: + // Idle during the message stops the message + FURI_LOG_I(TAG, "MIdle"); + instance->codeword_idx++; + instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; + FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); + break; + case POCSAG_FRAME_SYNC_CODE: + FURI_LOG_I(TAG, "MSync"); + instance->codeword_idx = 0; + break; + default: + // In this state, both address and message words can arrive + if (codeword >> 31 == 0) { + FURI_LOG_I(TAG, "MAddr"); + FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); + pocsag_decode_address_word(instance, codeword); + FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); + FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); + } else { FURI_LOG_I(TAG, "Msg"); if (!pocsag_decode_message_word(instance, codeword)) { - // push decoded message + instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); } } instance->codeword_idx++; } - instance->decoder.decode_count_bit = 0; instance->decoder.decode_data = 0UL; } From 0fe2c9901507308a6b66487aa5ca432543b76e7b Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 17:26:27 +0100 Subject: [PATCH 11/26] Basic serialize --- lib/subghz/protocols/pocsag.c | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index cd92913d4cd..905e0384f93 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -5,6 +5,7 @@ #include "../blocks/decoder.h" #include "../blocks/generic.h" #include "../blocks/math.h" +#include #define TAG "POCSAG" @@ -212,6 +213,8 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); } } instance->codeword_idx++; @@ -224,11 +227,52 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur } } +uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + uint8_t hash = 0; + uint8_t i; + + for(i = 0; i < instance->msg_len; i++) + hash ^= instance->msg[i]; + // address is 21 bit + hash ^= (instance->addr & 0xFF) ^ + ((instance->addr >> 8) & 0xFF) ^ + ((instance->addr >> 16) & 0xFF); + return hash; +} + +bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flipper_format, SubGhzRadioPreset* preset) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + + if (!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) + return false; + return true; +} + +bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* flipper_format) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + bool ret = false; + + do { + if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { + break; + } + ret = true; + } while(false); + return ret; +} + const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { .alloc = subghz_protocol_decoder_pocsag_alloc, .free = subghz_protocol_decoder_pocsag_free, .reset = subghz_protocol_decoder_pocsag_reset, .feed = subghz_protocol_decoder_pocsag_feed, + .get_hash_data = subghz_protocol_decoder_pocsag_get_hash_data, + .serialize = subghz_protocol_decoder_pocsag_serialize, + .deserialize = subghz_protocol_decoder_pocsag_deserialize, }; const SubGhzProtocol subghz_protocol_pocsag = { From cbbef9750ef1d9d7133cf49107581542fc419854 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 19:00:39 +0100 Subject: [PATCH 12/26] Basic serialize, cont --- lib/subghz/protocols/pocsag.c | 96 ++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 25 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 905e0384f93..a4a65ca07b3 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -7,7 +7,6 @@ #include "../blocks/math.h" #include - #define TAG "POCSAG" static const SubGhzBlockConst pocsag_const = { @@ -30,7 +29,7 @@ struct SubGhzProtocolDecoderPocsag { SubGhzBlockGeneric generic; uint8_t codeword_idx; - uint32_t addr; + uint32_t ric; uint8_t func; // partially decoded character @@ -81,8 +80,8 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { static void pocsag_decode_address_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { - instance->addr = (data >> 13); - instance->addr = (instance->addr << 3) | (instance->codeword_idx >> 1); + instance->ric = (data >> 13); + instance->ric = (instance->ric << 3) | (instance->codeword_idx >> 1); instance->func = (data >> 11) & 0b11; } @@ -98,7 +97,7 @@ bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t if (instance->char_bits == 7) { if (instance->char_data == 0) return false; - FURI_LOG_I(TAG, "%c", instance->char_data); +// FURI_LOG_I(TAG, "%c", instance->char_data); if (instance->msg_len < POCSAG_MAX_MSG_LEN) { instance->msg[instance->msg_len++] = instance->char_data; } @@ -123,7 +122,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur if (instance->decoder.decode_count_bit == POCSAG_MIN_SYNC_BITS) { instance->decoder.parser_step = PocsagDecoderStepFoundSync; - FURI_LOG_I(TAG, "Sync found"); +// FURI_LOG_I(TAG, "Sync found"); } } else { @@ -151,7 +150,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur switch(instance->decoder.parser_step) { case PocsagDecoderStepFoundSync: if ((instance->decoder.decode_data & POCSAG_CW_MASK) == POCSAG_FRAME_SYNC_CODE) { - FURI_LOG_I(TAG, "Found preamble!"); +// FURI_LOG_I(TAG, "Found preamble!"); instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; instance->decoder.decode_count_bit = 0; instance->decoder.decode_data = 0UL; @@ -163,19 +162,19 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); switch (codeword) { case POCSAG_IDLE_CODE_WORD: - FURI_LOG_I(TAG, "Idle"); +// FURI_LOG_I(TAG, "Idle"); instance->codeword_idx++; break; case POCSAG_FRAME_SYNC_CODE: - FURI_LOG_I(TAG, "Sync"); +// FURI_LOG_I(TAG, "Sync"); instance->codeword_idx = 0; break; default: // Here we expect only address messages if (codeword >> 31 == 0) { pocsag_decode_address_word(instance, codeword); - FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); - FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); +// FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); +// FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); instance->decoder.parser_step = PocsagDecoderStepMessage; } instance->codeword_idx++; @@ -191,28 +190,28 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur switch (codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message - FURI_LOG_I(TAG, "MIdle"); +// FURI_LOG_I(TAG, "MIdle"); instance->codeword_idx++; instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; - FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); +// FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); break; case POCSAG_FRAME_SYNC_CODE: - FURI_LOG_I(TAG, "MSync"); +// FURI_LOG_I(TAG, "MSync"); instance->codeword_idx = 0; break; default: // In this state, both address and message words can arrive if (codeword >> 31 == 0) { - FURI_LOG_I(TAG, "MAddr"); - FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); +// FURI_LOG_I(TAG, "MAddr"); +// FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); pocsag_decode_address_word(instance, codeword); - FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); - FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); +// FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); +// FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { - FURI_LOG_I(TAG, "Msg"); +// FURI_LOG_I(TAG, "Msg"); if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; - FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); +// FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); if(instance->base.callback) instance->base.callback(&instance->base, instance->base.context); } @@ -230,15 +229,15 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - uint8_t hash = 0; + uint8_t hash = 1; uint8_t i; for(i = 0; i < instance->msg_len; i++) hash ^= instance->msg[i]; // address is 21 bit - hash ^= (instance->addr & 0xFF) ^ - ((instance->addr >> 8) & 0xFF) ^ - ((instance->addr >> 16) & 0xFF); + hash ^= (instance->ric & 0xFF) ^ + ((instance->ric >> 8) & 0xFF) ^ + ((instance->ric >> 16) & 0xFF); return hash; } @@ -246,8 +245,24 @@ bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flip furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - if (!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) + if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) + return false; + + if(!flipper_format_write_uint32(flipper_format, "RIC", &instance->ric, 1)) { + FURI_LOG_E(TAG, "Error adding RIC"); + return false; + } + + uint32_t tmp = instance->msg_len; + if(!flipper_format_write_uint32(flipper_format, "MsgLen", &tmp, 1)) { + FURI_LOG_E(TAG, "Error adding MsgLen"); return false; + } + + if(!flipper_format_write_hex(flipper_format, "Msg", (uint8_t*)instance->msg, instance->msg_len)) { + FURI_LOG_E(TAG, "Error adding Msg"); + return false; + } return true; } @@ -255,16 +270,46 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; bool ret = false; + uint32_t tmp; do { if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { break; } + if(!flipper_format_read_uint32(flipper_format, "RIC", &instance->ric, 1)) { + FURI_LOG_E(TAG, "Missing RIC"); + break; + } + if(!flipper_format_read_uint32(flipper_format, "MsgLen", &tmp, 1)) { + FURI_LOG_E(TAG, "Missing MsgLen"); + break; + } + instance->msg_len = tmp; + if(!flipper_format_read_hex(flipper_format, "Msg", (uint8_t*)instance->msg, instance->msg_len)) { + FURI_LOG_E(TAG, "Missing Msg"); + break; + } ret = true; } while(false); return ret; } +void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) { + furi_assert(context); + SubGhzProtocolDecoderPocsag* instance = context; + instance->msg[instance->msg_len] = 0; + + furi_string_cat_printf( + output, + "%s\r\n" + "RIC: %" PRIu32 "\r\n" + "%s", + instance->generic.protocol_name, + instance->ric, + instance->msg + ); +} + const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { .alloc = subghz_protocol_decoder_pocsag_alloc, .free = subghz_protocol_decoder_pocsag_free, @@ -273,6 +318,7 @@ const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { .get_hash_data = subghz_protocol_decoder_pocsag_get_hash_data, .serialize = subghz_protocol_decoder_pocsag_serialize, .deserialize = subghz_protocol_decoder_pocsag_deserialize, + .get_string = subhz_protocol_decoder_pocsag_get_string, }; const SubGhzProtocol subghz_protocol_pocsag = { From 4b8b7c8ca7d83e66897e4b0a6300ce2d0010e674 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 20 Nov 2022 20:29:08 +0100 Subject: [PATCH 13/26] FuriString --- lib/subghz/protocols/pocsag.c | 64 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index a4a65ca07b3..4d9d7b483a0 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -6,6 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" #include +#include #define TAG "POCSAG" @@ -20,7 +21,8 @@ static const SubGhzBlockConst pocsag_const = { #define POCSAG_CW_MASK 0xFFFFFFFF #define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 #define POCSAG_IDLE_CODE_WORD 0x7A89C197 -#define POCSAG_MAX_MSG_LEN 80 +#define POCSAG_MAX_MSG 90 + struct SubGhzProtocolDecoderPocsag { SubGhzProtocolDecoderBase base; @@ -31,13 +33,11 @@ struct SubGhzProtocolDecoderPocsag { uint8_t codeword_idx; uint32_t ric; uint8_t func; + FuriString* msg; // partially decoded character uint8_t char_bits; uint8_t char_data; - - uint8_t msg_len; - char msg[POCSAG_MAX_MSG_LEN+1]; }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -56,12 +56,14 @@ void* subghz_protocol_decoder_pocsag_alloc(SubGhzEnvironment* environment) { SubGhzProtocolDecoderPocsag* instance = malloc(sizeof(SubGhzProtocolDecoderPocsag)); instance->base.protocol = &subghz_protocol_pocsag; instance->generic.protocol_name = instance->base.protocol->name; + instance->msg = furi_string_alloc(); return instance; } void subghz_protocol_decoder_pocsag_free(void* context) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; + furi_string_free(instance->msg); free(instance); } @@ -75,7 +77,8 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { instance->codeword_idx = 0; instance->char_bits = 0; instance->char_data = 0; - instance->msg_len = 0; + furi_string_reset(instance->msg); + furi_string_reserve(instance->msg, POCSAG_MAX_MSG); } @@ -87,7 +90,7 @@ static void pocsag_decode_address_word(SubGhzProtocolDecoderPocsag* instance, ui // decode message word, maintaining instance state for partial decoding. Return true if more data // might follow or false if end of message reached. -bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { +static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { for (uint8_t i = 0; i < 20; i++) { instance->char_data >>= 1; if (data & (1 << 30)) { @@ -98,9 +101,7 @@ bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t if (instance->char_data == 0) return false; // FURI_LOG_I(TAG, "%c", instance->char_data); - if (instance->msg_len < POCSAG_MAX_MSG_LEN) { - instance->msg[instance->msg_len++] = instance->char_data; - } + furi_string_push_back(instance->msg, instance->char_data); instance->char_data = 0; instance->char_bits = 0; } @@ -110,6 +111,17 @@ bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t } +static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { + FURI_LOG_I(TAG, "%s", furi_string_get_cstr(instance->msg)); + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); + instance->char_bits = 0; + instance->char_data = 0; + furi_string_reset(instance->msg); + furi_string_reserve(instance->msg, POCSAG_MAX_MSG); +} + + void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; @@ -193,6 +205,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur // FURI_LOG_I(TAG, "MIdle"); instance->codeword_idx++; instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; + pocsag_message_done(instance); // FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); break; case POCSAG_FRAME_SYNC_CODE: @@ -208,12 +221,11 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur // FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); // FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { -// FURI_LOG_I(TAG, "Msg"); + FURI_LOG_I(TAG, "Msg"); if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; // FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); - if(instance->base.callback) - instance->base.callback(&instance->base, instance->base.context); + pocsag_message_done(instance); } } instance->codeword_idx++; @@ -229,11 +241,10 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - uint8_t hash = 1; - uint8_t i; + uint8_t hash = 0; - for(i = 0; i < instance->msg_len; i++) - hash ^= instance->msg[i]; + for(size_t i = 0; i < furi_string_size(instance->msg); i++) + hash ^= furi_string_get_char(instance->msg, i); // address is 21 bit hash ^= (instance->ric & 0xFF) ^ ((instance->ric >> 8) & 0xFF) ^ @@ -253,13 +264,7 @@ bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flip return false; } - uint32_t tmp = instance->msg_len; - if(!flipper_format_write_uint32(flipper_format, "MsgLen", &tmp, 1)) { - FURI_LOG_E(TAG, "Error adding MsgLen"); - return false; - } - - if(!flipper_format_write_hex(flipper_format, "Msg", (uint8_t*)instance->msg, instance->msg_len)) { + if(!flipper_format_write_string(flipper_format, "Msg", instance->msg)) { FURI_LOG_E(TAG, "Error adding Msg"); return false; } @@ -270,7 +275,6 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; bool ret = false; - uint32_t tmp; do { if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { @@ -280,12 +284,7 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl FURI_LOG_E(TAG, "Missing RIC"); break; } - if(!flipper_format_read_uint32(flipper_format, "MsgLen", &tmp, 1)) { - FURI_LOG_E(TAG, "Missing MsgLen"); - break; - } - instance->msg_len = tmp; - if(!flipper_format_read_hex(flipper_format, "Msg", (uint8_t*)instance->msg, instance->msg_len)) { + if(!flipper_format_read_string(flipper_format, "Msg", instance->msg)) { FURI_LOG_E(TAG, "Missing Msg"); break; } @@ -297,16 +296,15 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - instance->msg[instance->msg_len] = 0; furi_string_cat_printf( output, "%s\r\n" "RIC: %" PRIu32 "\r\n" - "%s", + "%s\r\n", instance->generic.protocol_name, instance->ric, - instance->msg + furi_string_get_cstr(instance->msg) ); } From 6b191945fba339547fec16cf2d0945cbf417da6e Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Mon, 21 Nov 2022 19:27:56 +0100 Subject: [PATCH 14/26] Extra debug --- lib/subghz/protocols/pocsag.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 4d9d7b483a0..31a51970afb 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -112,7 +112,9 @@ static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, ui static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { - FURI_LOG_I(TAG, "%s", furi_string_get_cstr(instance->msg)); +// FURI_LOG_I(TAG, "%s", furi_string_get_cstr(instance->msg)); + FURI_LOG_I(TAG, "done: %d", furi_string_size(instance->msg)); + FURI_LOG_I(TAG, "bits: %d", instance->generic.data_count_bit); if(instance->base.callback) instance->base.callback(&instance->base, instance->base.context); instance->char_bits = 0; @@ -221,7 +223,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur // FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); // FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { - FURI_LOG_I(TAG, "Msg"); +// FURI_LOG_I(TAG, "Msg"); if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; // FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); @@ -255,6 +257,7 @@ uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flipper_format, SubGhzRadioPreset* preset) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; + FURI_LOG_I(TAG, "ser: %d", furi_string_size(instance->msg)); if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; @@ -288,6 +291,8 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl FURI_LOG_E(TAG, "Missing Msg"); break; } + FURI_LOG_I(TAG, "deser: %d", furi_string_size(instance->msg)); + FURI_LOG_I(TAG, "deser: %s", furi_string_get_cstr(instance->msg)); ret = true; } while(false); return ret; @@ -300,12 +305,12 @@ void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) furi_string_cat_printf( output, "%s\r\n" - "RIC: %" PRIu32 "\r\n" - "%s\r\n", + "RIC: %" PRIu32 "\r\n", instance->generic.protocol_name, - instance->ric, - furi_string_get_cstr(instance->msg) + instance->ric ); + furi_string_cat(output, instance->msg); + FURI_LOG_I(TAG, "str: %s", furi_string_get_cstr(output)); } const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { @@ -322,7 +327,7 @@ const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { const SubGhzProtocol subghz_protocol_pocsag = { .name = SUBGHZ_PROTOCOL_POCSAG, .type = SubGhzProtocolTypeStatic, - .flag = SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable, + .flag = SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Load, .decoder = &subghz_protocol_pocsag_decoder, }; \ No newline at end of file From 78bbba88d2f43d5f433727243fb1214d1c37a64b Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Mon, 21 Nov 2022 20:29:33 +0100 Subject: [PATCH 15/26] Fix race condition --- lib/subghz/protocols/pocsag.c | 66 +++++++++++++++-------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 31a51970afb..18a3dd5380e 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -21,7 +21,6 @@ static const SubGhzBlockConst pocsag_const = { #define POCSAG_CW_MASK 0xFFFFFFFF #define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 #define POCSAG_IDLE_CODE_WORD 0x7A89C197 -#define POCSAG_MAX_MSG 90 struct SubGhzProtocolDecoderPocsag { @@ -33,11 +32,18 @@ struct SubGhzProtocolDecoderPocsag { uint8_t codeword_idx; uint32_t ric; uint8_t func; - FuriString* msg; // partially decoded character uint8_t char_bits; uint8_t char_data; + + // message being decoded + FuriString* msg; + + // Done message, ready to be serialized/deserialized + uint32_t done_ric; + FuriString* done_msg; + }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -57,6 +63,7 @@ void* subghz_protocol_decoder_pocsag_alloc(SubGhzEnvironment* environment) { instance->base.protocol = &subghz_protocol_pocsag; instance->generic.protocol_name = instance->base.protocol->name; instance->msg = furi_string_alloc(); + instance->done_msg = furi_string_alloc(); return instance; } @@ -64,6 +71,7 @@ void subghz_protocol_decoder_pocsag_free(void* context) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; furi_string_free(instance->msg); + furi_string_free(instance->done_msg); free(instance); } @@ -78,7 +86,6 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { instance->char_bits = 0; instance->char_data = 0; furi_string_reset(instance->msg); - furi_string_reserve(instance->msg, POCSAG_MAX_MSG); } @@ -100,7 +107,6 @@ static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, ui if (instance->char_bits == 7) { if (instance->char_data == 0) return false; -// FURI_LOG_I(TAG, "%c", instance->char_data); furi_string_push_back(instance->msg, instance->char_data); instance->char_data = 0; instance->char_bits = 0; @@ -112,15 +118,15 @@ static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, ui static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { -// FURI_LOG_I(TAG, "%s", furi_string_get_cstr(instance->msg)); - FURI_LOG_I(TAG, "done: %d", furi_string_size(instance->msg)); - FURI_LOG_I(TAG, "bits: %d", instance->generic.data_count_bit); - if(instance->base.callback) - instance->base.callback(&instance->base, instance->base.context); + furi_string_set(instance->done_msg, instance->msg); + instance->done_ric = instance->ric; + instance->char_bits = 0; instance->char_data = 0; furi_string_reset(instance->msg); - furi_string_reserve(instance->msg, POCSAG_MAX_MSG); + + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); } @@ -136,7 +142,6 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur if (instance->decoder.decode_count_bit == POCSAG_MIN_SYNC_BITS) { instance->decoder.parser_step = PocsagDecoderStepFoundSync; -// FURI_LOG_I(TAG, "Sync found"); } } else { @@ -164,7 +169,6 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur switch(instance->decoder.parser_step) { case PocsagDecoderStepFoundSync: if ((instance->decoder.decode_data & POCSAG_CW_MASK) == POCSAG_FRAME_SYNC_CODE) { -// FURI_LOG_I(TAG, "Found preamble!"); instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; instance->decoder.decode_count_bit = 0; instance->decoder.decode_data = 0UL; @@ -176,19 +180,15 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); switch (codeword) { case POCSAG_IDLE_CODE_WORD: -// FURI_LOG_I(TAG, "Idle"); instance->codeword_idx++; break; case POCSAG_FRAME_SYNC_CODE: -// FURI_LOG_I(TAG, "Sync"); instance->codeword_idx = 0; break; default: // Here we expect only address messages if (codeword >> 31 == 0) { pocsag_decode_address_word(instance, codeword); -// FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); -// FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); instance->decoder.parser_step = PocsagDecoderStepMessage; } instance->codeword_idx++; @@ -204,29 +204,21 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur switch (codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message -// FURI_LOG_I(TAG, "MIdle"); instance->codeword_idx++; instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; pocsag_message_done(instance); -// FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); break; case POCSAG_FRAME_SYNC_CODE: -// FURI_LOG_I(TAG, "MSync"); instance->codeword_idx = 0; break; default: // In this state, both address and message words can arrive if (codeword >> 31 == 0) { -// FURI_LOG_I(TAG, "MAddr"); -// FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); + pocsag_message_done(instance); pocsag_decode_address_word(instance, codeword); -// FURI_LOG_I(TAG, "Address: %" PRIu32 , instance->addr); -// FURI_LOG_I(TAG, "Function: %" PRIu8, instance->func); } else { -// FURI_LOG_I(TAG, "Msg"); if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; -// FURI_LOG_I(TAG, "Msg done %d", instance->msg_len); pocsag_message_done(instance); } } @@ -245,29 +237,29 @@ uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { SubGhzProtocolDecoderPocsag* instance = context; uint8_t hash = 0; - for(size_t i = 0; i < furi_string_size(instance->msg); i++) - hash ^= furi_string_get_char(instance->msg, i); + for(size_t i = 0; i < furi_string_size(instance->done_msg); i++) + hash ^= furi_string_get_char(instance->done_msg, i); // address is 21 bit - hash ^= (instance->ric & 0xFF) ^ - ((instance->ric >> 8) & 0xFF) ^ - ((instance->ric >> 16) & 0xFF); + hash ^= (instance->done_ric & 0xFF) ^ + ((instance->done_ric >> 8) & 0xFF) ^ + ((instance->done_ric >> 16) & 0xFF); return hash; } bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flipper_format, SubGhzRadioPreset* preset) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - FURI_LOG_I(TAG, "ser: %d", furi_string_size(instance->msg)); + FURI_LOG_I(TAG, "ser: %s", furi_string_get_cstr(instance->done_msg)); if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; - if(!flipper_format_write_uint32(flipper_format, "RIC", &instance->ric, 1)) { + if(!flipper_format_write_uint32(flipper_format, "RIC", &instance->done_ric, 1)) { FURI_LOG_E(TAG, "Error adding RIC"); return false; } - if(!flipper_format_write_string(flipper_format, "Msg", instance->msg)) { + if(!flipper_format_write_string(flipper_format, "Msg", instance->done_msg)) { FURI_LOG_E(TAG, "Error adding Msg"); return false; } @@ -287,12 +279,12 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl FURI_LOG_E(TAG, "Missing RIC"); break; } - if(!flipper_format_read_string(flipper_format, "Msg", instance->msg)) { + if(!flipper_format_read_string(flipper_format, "Msg", instance->done_msg)) { FURI_LOG_E(TAG, "Missing Msg"); break; } - FURI_LOG_I(TAG, "deser: %d", furi_string_size(instance->msg)); - FURI_LOG_I(TAG, "deser: %s", furi_string_get_cstr(instance->msg)); + FURI_LOG_I(TAG, "deser: %d", furi_string_size(instance->done_msg)); + FURI_LOG_I(TAG, "deser: %s", furi_string_get_cstr(instance->done_msg)); ret = true; } while(false); return ret; @@ -309,7 +301,7 @@ void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) instance->generic.protocol_name, instance->ric ); - furi_string_cat(output, instance->msg); + furi_string_cat(output, instance->done_msg); FURI_LOG_I(TAG, "str: %s", furi_string_get_cstr(output)); } From b211806251ca475095d39dd2fdc294e0eb1563ba Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Mon, 21 Nov 2022 20:44:14 +0100 Subject: [PATCH 16/26] Clean logging --- lib/subghz/protocols/pocsag.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 18a3dd5380e..0a257698672 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -249,7 +249,6 @@ uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flipper_format, SubGhzRadioPreset* preset) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - FURI_LOG_I(TAG, "ser: %s", furi_string_get_cstr(instance->done_msg)); if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; @@ -283,8 +282,6 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl FURI_LOG_E(TAG, "Missing Msg"); break; } - FURI_LOG_I(TAG, "deser: %d", furi_string_size(instance->done_msg)); - FURI_LOG_I(TAG, "deser: %s", furi_string_get_cstr(instance->done_msg)); ret = true; } while(false); return ret; @@ -302,7 +299,6 @@ void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) instance->ric ); furi_string_cat(output, instance->done_msg); - FURI_LOG_I(TAG, "str: %s", furi_string_get_cstr(output)); } const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { From d96240482252eaa429f8c4610e67e9889d0221d7 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Tue, 22 Nov 2022 18:52:52 +0100 Subject: [PATCH 17/26] Debugging double msg --- lib/subghz/protocols/pocsag.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 0a257698672..d24a0c35235 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -124,9 +124,10 @@ static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { instance->char_bits = 0; instance->char_data = 0; furi_string_reset(instance->msg); + FURI_LOG_I(TAG, "d"); - if(instance->base.callback) - instance->base.callback(&instance->base, instance->base.context); +// if(instance->base.callback) +// instance->base.callback(&instance->base, instance->base.context); } @@ -144,7 +145,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur instance->decoder.parser_step = PocsagDecoderStepFoundSync; } } - else { + else if (instance->decoder.decode_count_bit > 0) { subghz_protocol_decoder_pocsag_reset(context); } return; @@ -172,22 +173,27 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; instance->decoder.decode_count_bit = 0; instance->decoder.decode_data = 0UL; + FURI_LOG_I(TAG, "s0"); } break; case PocsagDecoderStepFoundPreamble: // handle codewords if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); + FURI_LOG_I(TAG, "cw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: + FURI_LOG_I(TAG, "idle"); instance->codeword_idx++; break; case POCSAG_FRAME_SYNC_CODE: + FURI_LOG_I(TAG, "sync"); instance->codeword_idx = 0; break; default: // Here we expect only address messages if (codeword >> 31 == 0) { + FURI_LOG_I(TAG, "addr"); pocsag_decode_address_word(instance, codeword); instance->decoder.parser_step = PocsagDecoderStepMessage; } @@ -201,22 +207,27 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur case PocsagDecoderStepMessage: if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); + FURI_LOG_I(TAG, "mcw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message + FURI_LOG_I(TAG, "midle"); instance->codeword_idx++; instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; pocsag_message_done(instance); break; case POCSAG_FRAME_SYNC_CODE: + FURI_LOG_I(TAG, "msync"); instance->codeword_idx = 0; break; default: // In this state, both address and message words can arrive if (codeword >> 31 == 0) { + FURI_LOG_I(TAG, "maddr"); pocsag_message_done(instance); pocsag_decode_address_word(instance, codeword); } else { + FURI_LOG_I(TAG, "msg"); if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; pocsag_message_done(instance); From 21f375c90090f41d58bc0309814b355bb00ce4b0 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Tue, 22 Nov 2022 20:08:57 +0100 Subject: [PATCH 18/26] Fix multi-messages decoding --- lib/subghz/protocols/pocsag.c | 75 +++++++++++++++++------------------ 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index d24a0c35235..50f5c6725b5 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -40,10 +40,8 @@ struct SubGhzProtocolDecoderPocsag { // message being decoded FuriString* msg; - // Done message, ready to be serialized/deserialized - uint32_t done_ric; + // Done messages, ready to be serialized/deserialized FuriString* done_msg; - }; typedef struct SubGhzProtocolDecoderPocsag SubGhzProtocolDecoderPocsag; @@ -86,6 +84,7 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { instance->char_bits = 0; instance->char_data = 0; furi_string_reset(instance->msg); + furi_string_reset(instance->done_msg); } @@ -117,17 +116,20 @@ static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, ui } +// Function called when current message got decoded, but other messages might follow static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { - furi_string_set(instance->done_msg, instance->msg); - instance->done_ric = instance->ric; + // append the message to the long-term storage string + furi_string_cat_printf( + instance->done_msg, + "RIC: %" PRIu32 ", msg: %s\r\n", + instance->ric, + furi_string_get_cstr(instance->msg) + ); + // reset the state instance->char_bits = 0; instance->char_data = 0; furi_string_reset(instance->msg); - FURI_LOG_I(TAG, "d"); - -// if(instance->base.callback) -// instance->base.callback(&instance->base, instance->base.context); } @@ -145,7 +147,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur instance->decoder.parser_step = PocsagDecoderStepFoundSync; } } - else if (instance->decoder.decode_count_bit > 0) { + else if (instance->decoder.decode_count_bit > 0 ) { subghz_protocol_decoder_pocsag_reset(context); } return; @@ -157,6 +159,11 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur if (DURATION_DIFF(extra, pocsag_const.te_short) < pocsag_const.te_delta) bits_count++; else if (extra > pocsag_const.te_delta) { + // in non-reset state we faced the error signal - we reached the end of the packet, flush data + if (furi_string_size(instance->done_msg) > 0) { + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); + } subghz_protocol_decoder_pocsag_reset(context); return; } @@ -173,27 +180,22 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; instance->decoder.decode_count_bit = 0; instance->decoder.decode_data = 0UL; - FURI_LOG_I(TAG, "s0"); } break; case PocsagDecoderStepFoundPreamble: // handle codewords if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); - FURI_LOG_I(TAG, "cw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: - FURI_LOG_I(TAG, "idle"); instance->codeword_idx++; break; case POCSAG_FRAME_SYNC_CODE: - FURI_LOG_I(TAG, "sync"); instance->codeword_idx = 0; break; default: // Here we expect only address messages if (codeword >> 31 == 0) { - FURI_LOG_I(TAG, "addr"); pocsag_decode_address_word(instance, codeword); instance->decoder.parser_step = PocsagDecoderStepMessage; } @@ -207,27 +209,22 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur case PocsagDecoderStepMessage: if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); - FURI_LOG_I(TAG, "mcw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message - FURI_LOG_I(TAG, "midle"); instance->codeword_idx++; instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; pocsag_message_done(instance); break; case POCSAG_FRAME_SYNC_CODE: - FURI_LOG_I(TAG, "msync"); instance->codeword_idx = 0; break; default: // In this state, both address and message words can arrive if (codeword >> 31 == 0) { - FURI_LOG_I(TAG, "maddr"); pocsag_message_done(instance); pocsag_decode_address_word(instance, codeword); } else { - FURI_LOG_I(TAG, "msg"); if (!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; pocsag_message_done(instance); @@ -247,29 +244,28 @@ uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; uint8_t hash = 0; - for(size_t i = 0; i < furi_string_size(instance->done_msg); i++) hash ^= furi_string_get_char(instance->done_msg, i); - // address is 21 bit - hash ^= (instance->done_ric & 0xFF) ^ - ((instance->done_ric >> 8) & 0xFF) ^ - ((instance->done_ric >> 16) & 0xFF); return hash; } bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flipper_format, SubGhzRadioPreset* preset) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; + uint32_t msg_len; if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; - if(!flipper_format_write_uint32(flipper_format, "RIC", &instance->done_ric, 1)) { - FURI_LOG_E(TAG, "Error adding RIC"); + msg_len = furi_string_size(instance->done_msg); + if(!flipper_format_write_uint32(flipper_format, "MsgLen", &msg_len, 1)) { + FURI_LOG_E(TAG, "Error adding MsgLen"); return false; } - if(!flipper_format_write_string(flipper_format, "Msg", instance->done_msg)) { + if(!flipper_format_write_hex(flipper_format, "Msg", (uint8_t*)furi_string_get_cstr(instance->done_msg), + msg_len)) + { FURI_LOG_E(TAG, "Error adding Msg"); return false; } @@ -280,19 +276,28 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; bool ret = false; + uint32_t msg_len; + uint8_t* buf; do { if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { break; } - if(!flipper_format_read_uint32(flipper_format, "RIC", &instance->ric, 1)) { - FURI_LOG_E(TAG, "Missing RIC"); + + if(!flipper_format_read_uint32(flipper_format, "MsgLen", &msg_len, 1)) { + FURI_LOG_E(TAG, "Missing MsgLen"); break; } - if(!flipper_format_read_string(flipper_format, "Msg", instance->done_msg)) { + + buf = malloc(msg_len); + if(!flipper_format_read_hex(flipper_format, "Msg", buf, msg_len)) { FURI_LOG_E(TAG, "Missing Msg"); + free(buf); break; } + furi_string_set_strn(instance->done_msg, (const char*)buf, msg_len); + free(buf); + ret = true; } while(false); return ret; @@ -301,14 +306,6 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - - furi_string_cat_printf( - output, - "%s\r\n" - "RIC: %" PRIu32 "\r\n", - instance->generic.protocol_name, - instance->ric - ); furi_string_cat(output, instance->done_msg); } From e294e036182f458292ab0f22683a6914a052fe7a Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Fri, 25 Nov 2022 19:46:02 +0100 Subject: [PATCH 19/26] Decoding of BCD messages --- lib/subghz/protocols/pocsag.c | 54 +++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 50f5c6725b5..dd9aa64b2bc 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -22,6 +22,12 @@ static const SubGhzBlockConst pocsag_const = { #define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 #define POCSAG_IDLE_CODE_WORD 0x7A89C197 +#define POCSAG_FUNC_NUM 0 +#define POCSAG_FUNC_ALERT1 1 +#define POCSAG_FUNC_ALERT2 2 +#define POCSAG_FUNC_ALPHANUM 3 + +static const char* bcd_chars = "*U -)("; struct SubGhzProtocolDecoderPocsag { SubGhzProtocolDecoderBase base; @@ -94,9 +100,8 @@ static void pocsag_decode_address_word(SubGhzProtocolDecoderPocsag* instance, ui instance->func = (data >> 11) & 0b11; } -// decode message word, maintaining instance state for partial decoding. Return true if more data -// might follow or false if end of message reached. -static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { + +static bool decode_message_alphanumeric(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { for (uint8_t i = 0; i < 20; i++) { instance->char_data >>= 1; if (data & (1 << 30)) { @@ -116,6 +121,47 @@ static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, ui } +static void decode_message_numeric(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { + // 5 groups with 4 bits each + uint8_t val; + for (uint8_t i = 0; i < 5; i++) { + val = (data >> (27 - i*4)) & 0b1111; + // reverse the order of 4 bits + val = (val & 0x5) << 1 | (val & 0xA) >> 1; + val = (val & 0x3) << 2 | (val & 0xC) >> 2; + + if (val <= 9) + val += '0'; + else + val = bcd_chars[val-10]; + furi_string_push_back(instance->msg, val); + } +} + + +// decode message word, maintaining instance state for partial decoding. Return true if more data +// might follow or false if end of message reached. +static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { + switch (instance->func) { + case POCSAG_FUNC_ALPHANUM: + return decode_message_alphanumeric(instance, data); + + case POCSAG_FUNC_NUM: + decode_message_numeric(instance, data); + return true; + + case POCSAG_FUNC_ALERT1: + FURI_LOG_I(TAG, "Alert1"); + return true; + + case POCSAG_FUNC_ALERT2: + FURI_LOG_I(TAG, "Alert2"); + return true; + } + return false; +} + + // Function called when current message got decoded, but other messages might follow static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { // append the message to the long-term storage string @@ -186,6 +232,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur // handle codewords if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); + FURI_LOG_I(TAG, "cw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: instance->codeword_idx++; @@ -209,6 +256,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur case PocsagDecoderStepMessage: if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); + FURI_LOG_I(TAG, "mw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message From 7d3a39be65766954ce96cf7fdc089d92b0b2f95b Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Fri, 25 Nov 2022 21:00:33 +0100 Subject: [PATCH 20/26] Bring back protocol name --- lib/subghz/protocols/pocsag.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index dd9aa64b2bc..446acd51979 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -354,6 +354,11 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; + furi_string_cat_printf( + output, + "%s\r\n", + instance->generic.protocol_name + ); furi_string_cat(output, instance->done_msg); } From 2609e982a87885b4dde2934a9d3bd0917f36a654 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 26 Nov 2022 16:32:08 +0100 Subject: [PATCH 21/26] Decoding of alert messages --- lib/subghz/protocols/pocsag.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 446acd51979..e39117914ae 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -27,6 +27,13 @@ static const SubGhzBlockConst pocsag_const = { #define POCSAG_FUNC_ALERT2 2 #define POCSAG_FUNC_ALPHANUM 3 +static const char* func_msg[] = { + "num: ", + "alert", + "alert: ", + "msg: ", +}; + static const char* bcd_chars = "*U -)("; struct SubGhzProtocolDecoderPocsag { @@ -143,20 +150,13 @@ static void decode_message_numeric(SubGhzProtocolDecoderPocsag* instance, uint32 // might follow or false if end of message reached. static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { switch (instance->func) { + case POCSAG_FUNC_ALERT2: case POCSAG_FUNC_ALPHANUM: return decode_message_alphanumeric(instance, data); case POCSAG_FUNC_NUM: decode_message_numeric(instance, data); return true; - - case POCSAG_FUNC_ALERT1: - FURI_LOG_I(TAG, "Alert1"); - return true; - - case POCSAG_FUNC_ALERT2: - FURI_LOG_I(TAG, "Alert2"); - return true; } return false; } @@ -167,11 +167,15 @@ static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { // append the message to the long-term storage string furi_string_cat_printf( instance->done_msg, - "RIC: %" PRIu32 ", msg: %s\r\n", - instance->ric, - furi_string_get_cstr(instance->msg) + "RIC: %" PRIu32 ", ", + instance->ric ); + furi_string_cat_str(instance->done_msg, func_msg[instance->func]); + if (instance->func != POCSAG_FUNC_ALERT1) + furi_string_cat(instance->done_msg, instance->msg); + furi_string_cat_str(instance->done_msg, "\r\n"); + // reset the state instance->char_bits = 0; instance->char_data = 0; From 6734659e0d536aba0e3468aa6be348d132a0a701 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 26 Nov 2022 16:33:17 +0100 Subject: [PATCH 22/26] Drop logging --- lib/subghz/protocols/pocsag.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index e39117914ae..756acfcd42e 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -236,7 +236,6 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur // handle codewords if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); - FURI_LOG_I(TAG, "cw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: instance->codeword_idx++; @@ -260,7 +259,6 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur case PocsagDecoderStepMessage: if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); - FURI_LOG_I(TAG, "mw: %" PRIx32, codeword); switch (codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message From 12132fbbe73f5b5d0d7ba7f9691bbf93aeb0c5b9 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 26 Nov 2022 17:05:37 +0100 Subject: [PATCH 23/26] Unit tests --- .../debug/unit_tests/subghz/subghz_test.c | 10 +++++- assets/unit_tests/subghz/pocsag.sub | 35 +++++++++++++++++++ assets/unit_tests/subghz/test_random_raw.sub | 28 +++++++++++++++ lib/subghz/protocols/pocsag.c | 2 +- lib/subghz/protocols/pocsag.h | 2 +- 5 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 assets/unit_tests/subghz/pocsag.sub diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index dbe03d88c33..742a4854c82 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -13,7 +13,7 @@ #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") -#define TEST_RANDOM_COUNT_PARSE 232 +#define TEST_RANDOM_COUNT_PARSE 236 #define TEST_TIMEOUT 10000 static SubGhzEnvironment* environment_handler; @@ -437,6 +437,13 @@ MU_TEST(subghz_decoder_clemsa_test) { "Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); } +MU_TEST(subghz_decoder_pocsag_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/pocsag.sub"), SUBGHZ_PROTOCOL_POCSAG_NAME), + "Test decoder " SUBGHZ_PROTOCOL_POCSAG_NAME " error\r\n"); +} + //test encoders MU_TEST(subghz_encoder_princeton_test) { mu_assert( @@ -598,6 +605,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_magellan_test); MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_clemsa_test); + MU_RUN_TEST(subghz_decoder_pocsag_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); diff --git a/assets/unit_tests/subghz/pocsag.sub b/assets/unit_tests/subghz/pocsag.sub new file mode 100644 index 00000000000..52f2ee0c3f2 --- /dev/null +++ b/assets/unit_tests/subghz/pocsag.sub @@ -0,0 +1,35 @@ +Filetype: Flipper SubGhz RAW File +Version: 1 +Frequency: 439988500 +Preset: FuriHalSubGhzPresetCustom +Custom_preset_module: CC1101 +Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 83 10 67 15 31 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 +Protocol: RAW +RAW_Data: -3490 143 -230 115 -1140 55 -2348 79 -3316 287 -228 95 -344 561 -286 105 -1026 137 -1108 81 -1090 71 -2211 57 -1010 55 -1276 113 -346 85 -706 169 -628 57 -2928 129 -2574 109 -1400 57 -1444 87 -824 95 -240 53 -3650 55 -202 143 -528 229 -216 57 -144 113 -2682 55 -1422 57 -1619 57 -1332 111 -402 57 -968 57 -500 55 -3277 71 -856 79 -1009 77 -2136 53 -550 71 -986 85 -1403 55 -244 53 -763 85 -2413 173 -1410 51 -114 85 -594 77 -584 191 -1102 95 -7897 125 -1584 77 -442 73 -384 95 -1774 55 -2588 69 -264 55 -3624 95 -6776 51 -102 99 -344 143 -716 55 -174 57 -1440 143 -312 97 -312 143 -1891 85 -194 99 -1696 55 -1188 95 -192 69 -102 75 -2378 95 -646 119 -828 85 -1766 163 -1440 55 -82 111 -56 55 -567 83 -3209 81 -1140 115 -5439 105 -82 113 -1308 55 -6938 71 -122 73 -520 79 -490 73 -922 81 -1250 229 -374 83 -614 57 -458 81 -1300 131 -668 139 -116 55 -414 55 -2304 51 -2456 85 -922 109 -490 141 -58 55 -376 55 -998 191 -1294 57 -1693 159 -678 55 -416 57 -344 141 -4490 75 -122 167 -1774 143 -1152 101 -3062 57 -1351 85 -402 111 -814 83 -1321 97 -406 71 -384 121 -670 55 -1892 221 -2230 51 -1713 143 -1525 55 -340 107 -1332 57 -2671 55 -576 85 -202 57 -338 115 -768 79 -1112 71 -1070 51 -538 113 -488 109 -162 77 -980 57 -1915 87 -2141 95 -2272 171 -5042 53 -3974 55 -902 85 -274 81 -160 55 -58 57 -448 77 -1394 51 -316 119 -2322 115 -1996 51 -3265 85 -634 57 -2308 51 -250 137 -8089 57 -3623 77 -268 282 -782 225 -506 77 -280 57 -468 107 -2886 55 -1378 135 -760 75 -3226 53 -154 51 -86 143 -1810 141 -943 111 -503 113 -1226 83 -144 57 -876 253 -292 77 -832 113 -316 143 -580 57 -1121 81 -2010 201 -326 186 -508 167 -1156 167 -644 85 -895 53 -1525 71 -2115 55 -844 95 -168 167 -406 97 -168 119 -266 165 -2264 57 -4167 115 -2244 53 -2009 115 -3916 143 -598 143 -1500 243 -1302 197 -1161 75 -359 153 -1117 71 -1622 159 -222 71 -70 119 -2112 163 -2066 107 -1291 113 -5859 57 -3327 71 -688 197 -3065 171 -344 171 -200 143 -1398 55 -1143 77 -214 81 -2840 143 -2109 199 -1229 99 -1354 190 -1710 73 -254 81 -874 85 -54 135 -220 115 -2313 81 -964 159 -1802 131 -284 53 -786 71 -482 135 -114 115 -814 53 -3491 51 -378 143 -2783 113 -572 85 -288 105 -1975 53 -1412 223 -144 71 -616 83 -2279 57 -456 83 -1340 51 -1635 127 -472 57 -1694 57 -1264 55 -966 53 -1601 71 -2584 57 +RAW_Data: -1052 225 -162 83 -2002 57 -2246 75 -2092 119 -2672 101 -897 113 -116 85 -1560 75 -2231 51 -896 73 -146 95 -1028 107 -1309 101 -1154 103 -1168 201 -114 57 -1050 55 -742 81 -1238 113 -1196 53 -700 75 -5446 79 -1340 51 -106 53 -160 71 -144 97 -3165 69 -192 85 -1526 69 -1010 71 -516 143 -2207 57 -1529 85 -1710 57 -288 57 -514 57 -1056 147 -156 143 -114 77 -828 57 -676 95 -1076 71 -1620 53 -532 101 -2202 129 -2282 143 -432 85 -836 85 -3336 51 -220 71 -250 79 -936 81 -270 111 -1981 71 -1910 251 -392 139 -58 57 -687 151 -764 113 -1012 79 -258 85 -144 85 -995 83 -2472 55 -508 57 -2619 171 -334 51 -604 53 -3071 71 -200 51 -128 199 -460 113 -556 83 -2625 51 -1290 51 -438 95 -144 119 -262 73 -122 71 -1368 75 -634 253 -1314 95 -2198 53 -844 85 -288 114 -112 109 -86 143 -878 141 -1058 57 -86 57 -826 85 -172 171 -490 57 -2034 155 -430 103 -334 87 -344 53 -1494 169 -276 57 -340 51 -3721 77 -172 51 -1163 85 -644 75 -2714 99 -290 147 -150 51 -1722 55 -644 85 -2486 167 -558 85 -586 57 -2266 171 -852 53 -672 79 -1480 95 -2830 237 -268 111 -576 95 -240 73 -256 101 -200 93 -612 53 -2921 57 -608 51 -82 57 -894 71 -270 53 -1584 75 -868 85 -607 53 -874 151 -1701 55 -1616 85 -2660 57 -2182 71 -390 51 -1392 169 -1503 85 -144 55 -656 51 -156 97 -194 117 -781 71 -292 51 -1036 75 -973 55 -2634 81 -106 103 -1802 129 -406 71 -964 53 -1933 79 -1157 55 -174 57 -1697 75 -204 119 -5124 75 -556 57 -174 113 -1098 229 -116 57 -102 97 -378 57 -144 57 -562 107 -682 55 -1079 121 -1050 51 -560 201 -138 55 -84 113 -2505 71 -144 69 -1764 121 -312 97 -1140 111 -1344 107 -1406 71 -405 51 -1736 55 -1672 103 -100 38491 -672 989 -704 937 -730 935 -756 911 -754 885 -780 911 -754 883 -780 885 -808 857 -808 859 -806 861 -808 859 -806 859 -784 885 -782 883 -808 857 -806 859 -806 859 -806 861 -806 857 -808 857 -808 859 -806 857 -808 857 -808 857 -808 861 -808 859 -806 861 -806 859 -808 859 -806 857 -808 857 -806 859 -808 859 -806 833 -832 859 -808 833 -832 835 -832 833 -832 859 -808 831 -836 831 -834 833 -832 831 -832 833 -832 835 -836 831 -834 833 -832 857 -808 833 -832 833 -832 835 -832 835 -832 831 -832 857 -810 831 -832 859 -808 857 -808 835 -836 833 -832 831 -832 831 -834 833 -832 859 -808 835 -836 831 -832 833 -832 831 -834 833 -832 831 -834 857 -808 859 +RAW_Data: -808 831 -832 833 -832 859 -808 857 -810 831 -834 859 -806 833 -834 857 -806 833 -832 859 -806 859 -808 859 -810 833 -832 831 -834 859 -806 833 -834 857 -808 831 -834 833 -834 833 -832 833 -836 833 -834 829 -832 859 -806 859 -808 833 -832 859 -808 831 -834 857 -806 835 -832 833 -834 859 -806 857 -810 833 -832 857 -808 833 -834 831 -834 833 -834 831 -832 833 -834 857 -808 857 -808 833 -834 835 -834 833 -832 831 -834 857 -806 833 -832 835 -832 833 -834 833 -832 835 -834 831 -834 831 -834 831 -832 833 -832 833 -834 835 -834 831 -832 833 -832 833 -834 833 -832 833 -832 831 -834 857 -808 859 -808 831 -834 831 -834 859 -808 831 -834 857 -808 859 -806 859 -808 857 -810 857 -808 857 -808 835 -834 835 -832 831 -832 835 -832 835 -834 833 -832 831 -830 833 -832 857 -808 859 -808 833 -832 833 -832 833 -834 831 -834 859 -808 831 -834 833 -832 859 -810 833 -832 831 -832 859 -806 859 -808 833 -832 833 -834 833 -832 833 -832 833 -832 857 -808 859 -808 833 -832 857 -808 859 -810 857 -808 831 -832 835 -834 831 -834 833 -832 833 -832 833 -834 857 -808 859 -806 859 -808 835 -834 831 -836 833 -834 831 -834 831 -832 831 -832 831 -834 835 -832 857 -806 859 -806 835 -834 857 -808 857 -808 857 -808 859 -806 859 -808 835 -832 831 -832 859 -808 833 -832 833 -834 833 -832 835 -834 833 -832 833 -834 831 -832 833 -834 831 -832 835 -832 835 -832 831 -832 857 -808 859 -808 859 -806 859 -808 835 -832 833 -832 831 -834 857 -808 833 -832 833 -834 833 -832 833 -832 859 -808 831 -834 859 -806 835 -834 835 -832 831 -836 831 -832 831 -832 859 -806 835 -832 859 -808 831 -834 831 -834 857 -808 833 -832 835 -834 831 -832 859 -808 831 -834 859 -808 833 -832 857 -808 857 -810 833 -834 833 -832 831 -832 859 -808 831 -834 833 -832 859 -808 857 -808 833 -836 831 -834 831 -832 833 -832 859 -808 831 -832 837 -834 833 -832 833 -834 831 -832 831 -834 857 -808 833 -832 859 -808 831 -834 859 -806 833 -834 833 -836 831 -832 833 -832 833 -834 859 -808 831 -832 831 -834 859 -806 859 -808 857 -808 859 -806 833 -834 857 -808 859 -806 835 -832 859 -808 857 -808 857 -808 857 -808 857 -808 859 -808 859 -812 831 -832 831 -832 833 -834 833 -832 857 -808 833 -836 831 -832 857 -808 835 -836 833 -832 831 -832 831 -836 835 -832 831 -834 831 -836 831 -832 857 -808 833 -832 835 -834 831 -832 833 -832 835 -832 1665 -4168 1665 -1668 831 +RAW_Data: -834 1669 -832 3333 -832 833 -832 831 -2500 833 -1666 3347 -3332 829 -830 831 -830 2501 -834 1665 -2502 4171 -1664 1667 -830 831 -2498 831 -3332 831 -836 835 -832 2499 -830 1671 -2510 4155 -1664 1687 -802 853 -2498 829 -3318 857 -828 829 -830 2503 -834 1667 -2502 4163 -1664 1665 -832 829 -2500 857 -3308 831 -836 835 -832 2497 -834 1667 -2504 4171 -1664 1663 -830 833 -2502 13329 -826 851 -3328 825 -826 853 -828 833 -2500 1669 -830 2503 -832 829 -2500 829 -830 1665 -1668 1665 -1668 829 -832 833 -4160 4175 -1668 1665 -1666 853 -4970 853 -1664 5847 -1634 2521 -828 1663 -832 831 -3334 829 -832 831 -836 2499 -832 1671 -2484 4193 -1638 1689 -832 829 -2500 829 -3338 829 -832 833 -832 2499 -832 1669 -2502 4173 -1664 1663 -832 829 -2508 833 -3332 831 -832 831 -832 2505 -832 1665 -2502 4163 -1664 1669 -830 831 -2502 833 -3340 827 -832 829 -834 2503 -832 1665 -2500 4177 -1662 1665 -830 831 -2482 857 -3312 857 -830 829 -830 2501 -834 1663 -2504 4173 -1638 1687 -832 831 -2502 829 -3332 833 -830 831 -832 2505 -832 1663 -2508 4167 -1664 1669 -832 833 -2502 831 -3334 829 -830 829 -832 2501 -832 1667 -2504 4169 -1670 1663 -832 831 -2500 831 -3332 833 -832 831 -832 2497 -834 1663 -2500 4175 -1664 1665 -832 831 -2508 829 -3338 831 -832 831 -830 2501 -832 1665 -2502 4165 -1666 1667 -832 831 -780 53 -1368 57 -86 143 -200 57 -374 57 -130 165 -374 85 -808 85 -196 127 -1010 51 -138 85 -58 77 -174 85 -228 113 -716 95 -520 71 -2831 53 -618 53 -188 83 -82 111 -114 55 -5464 71 -966 95 -1168 71 -824 71 -480 97 -72 101 -612 55 -3330 73 -1995 85 -832 53 -1016 57 -1462 71 -256 75 -776 143 -2066 77 -1748 71 -4832 81 -602 55 -3866 131 -1824 57 -1836 113 -1234 85 -836 73 -560 253 -1606 143 -286 351 -1008 87 -528 107 -1357 256 -1538 233 -1018 71 -264 77 -304 71 -1832 57 -144 85 -858 83 -511 131 -1220 107 -1318 85 -1782 81 -72 73 -7838 51 -696 55 -3805 125 -930 103 -292 95 -382 115 -3256 85 -859 57 -787 220 -1207 143 -2068 143 -2322 97 -548 53 -386 57 -130 51 -1673 57 -3004 71 -783 71 -1560 99 -102 51 -1068 81 -348 83 -2003 51 -2860 77 -2680 57 -4432 81 -936 95 -400 73 -583 71 -2842 97 -1656 81 -146 73 -286 105 -714 141 -2236 53 -1503 81 -200 85 -836 71 -356 109 -1310 75 -616 57 -690 87 -566 79 -727 73 -1604 97 -1438 57 -2641 77 -1650 217 -873 71 -890 109 -2042 163 -3562 107 -3098 111 -904 79 -238 51 -2699 71 -736 53 -488 233 -400 103 -340 81 -2933 53 -1508 51 -1886 53 -388 125 -3336 143 +RAW_Data: -390 99 -1386 71 -1092 97 -1150 51 -506 111 -2575 87 -114 143 -662 57 -644 53 -550 119 -274 85 -1267 55 -1278 71 -1622 117 -2082 77 -1316 73 -1882 55 -1575 71 -424 85 -1031 133 -2367 85 -542 115 -166 113 -2671 149 -256 113 -260 83 -1966 141 -430 71 -1844 127 -4269 57 -840 111 -1598 85 -3530 55 -2263 57 -1302 57 -346 85 -516 83 -2989 51 -334 83 -1811 85 -230 57 -836 55 -678 55 -7081 55 -288 115 -2062 55 -300 189 -738 57 -814 119 -1438 53 -2077 115 -631 145 -206 57 -645 79 -4121 115 -490 53 -186 71 -144 69 -2537 105 -932 53 -1136 55 -3124 57 -1873 125 -4551 77 -3337 57 -1122 57 -622 103 -2437 51 -120 71 -3629 129 -2139 77 -104 99 -1057 95 -416 71 -72 95 -312 95 -1052 115 -342 111 -2452 71 -746 221 -1418 57 -3125 119 -724 55 -950 57 -618 57 -259 107 -210 95 -1046 71 -454 71 -1651 71 -442 71 -312 79 -1169 55 -202 85 -632 57 -144 115 -412 69 -304 85 -2125 53 -998 125 -200 105 -1126 115 -1116 71 -604 85 -174 171 -260 171 -308 71 -120 95 -354 53 -1461 69 -863 121 -1696 55 -3336 79 -2306 83 -754 97 -160 171 -1612 139 -417 79 -2792 73 -498 85 -2112 57 -1370 57 -460 85 -482 55 -1946 113 -682 101 -136 85 -574 77 -838 53 -657 71 -3562 71 -588 97 -252 71 -366 57 -658 85 -1378 53 -168 85 -2896 167 -1412 87 -1684 53 -2008 97 -1861 83 -1251 71 -678 95 -192 71 -930 81 -1380 51 -572 81 -2795 105 -122 95 -1038 85 -1116 117 -1799 129 -356 83 -712 133 -1584 119 -1892 81 -672 143 -116 85 -996 57 -501 57 -450 85 -216 57 -2182 57 -1100 73 -456 85 -260 85 -144 167 -300 57 -202 55 -448 81 -764 143 -1707 79 -3204 53 -108 53 -54 190 -682 87 -1070 53 -1230 55 -112 87 -1014 141 -1659 57 -230 115 -230 57 -750 55 -686 57 -216 87 -4642 51 -4416 95 -2575 111 -1607 53 -368 107 -4757 51 -521 75 -1682 255 -2346 115 -1762 83 -3457 71 -1470 77 -246 157 -1678 55 -418 99 -922 113 -218 123 -260 55 -1384 105 -240 53 -848 53 -1810 79 -648 77 -664 85 -298 109 -86 55 -552 55 -260 57 -913 115 -504 77 -537 53 -3159 105 -3371 51 -138 53 -2668 71 -368 51 -674 55 -280 51 -1048 51 -963 85 -1000 57 -954 113 -1190 53 -1456 57 -200 115 -172 57 -864 57 -288 85 -442 127 -72 145 -584 71 -2799 143 -324 95 -120 121 -1873 51 -658 57 -1285 57 -1516 330 -172 143 -316 87 -200 115 -700 197 -4960 57 -1358 53 -2324 55 -2864 179 -1799 73 -3669 57 -316 85 +RAW_Data: -935 57 -864 115 -740 79 -220 87 -400 81 -1238 242 -1720 169 -176 125 -2132 57 -1227 119 -2810 107 -420 95 -192 75 -74 107 -3191 171 -914 81 -2426 57 -860 157 -618 115 -1462 107 -146 51 -1007 115 -1080 71 -803 75 -1619 55 -1492 57 -1171 53 -1050 57 -538 113 -2006 85 -2537 83 -1490 55 -598 109 -670 139 -166 55 -154 71 -1215 85 -1630 167 -390 127 -840 115 -288 57 -614 97 -397 71 -494 55 -74 73 -74 71 -806 71 -78 247 -656 105 -1176 73 -144 95 -1100 191 -190 135 -114 87 -1290 119 -506 191 -860 115 -3636 141 -6062 83 -2120 55 -392 77 -2020 55 -1316 51 -424 183 -448 225 -474 97 -1068 75 -294 81 -1090 85 -196 57 -2221 113 -458 115 -3219 141 -2086 85 -374 87 -834 105 -470 51 -1338 53 -1401 85 -604 142 -170 109 -848 55 -200 53 -1480 77 -326 51 -9597 57 -341 107 -959 57 -272 51 -4922 75 -78 195 -249 53 -1368 53 -236 127 -3235 105 -174 113 -2854 55 -1140 85 -374 55 -2335 57 -1164 55 -314 55 -368 51 -2454 57 -5231 55 -1868 103 -868 93 -498 71 -2701 119 -851 85 -810 131 -1466 111 -714 57 -1588 113 -846 53 -2596 105 -200 87 -772 75 -128 75 -1739 191 -4925 79 -144 139 -208 71 -348 79 -538 131 -880 143 -1048 155 -1850 109 -170 57 -1014 133 -906 85 -774 57 -1400 103 -1881 53 -2970 147 -554 95 -178 107 -622 85 -674 113 -1442 55 -3090 127 -488 51 -164 85 -4087 113 -1427 77 -6221 57 -3815 81 -488 109 -992 57 -1423 71 -434 51 -2449 95 -542 57 -594 53 -1282 133 -5219 71 -1574 87 -1658 53 -198 85 -628 105 -120 129 -804 137 -5041 171 -1264 125 -1245 129 -168 97 -146 71 -1196 55 -1194 57 -58 137 -86 85 -1885 101 -328 51 -5524 143 -2082 85 -2325 85 -1225 109 -784 55 -200 55 -562 55 -1644 77 -598 85 -1495 51 -882 161 -2568 105 +RAW_Data: -1288 57 -2688 205 -698 57 -434 51 -632 225 -188 109 -1032 129 -636 285 -1055 77 -204 95 -240 79 -462 169 -2442 57 -202 85 -478 57 -1511 55 -114 113 -444 169 -216 79 -124 73 -1030 141 -418 143 -3631 55 -836 129 -506 79 -954 139 -1470 85 -536 139 -416 53 -944 111 -1544 73 -562 55 -3102 71 -2248 85 -836 57 -3044 77 -562 53 -52 75 -480 53 -1200 71 -216 95 -974 71 -2312 83 -1609 51 -848 55 -174 143 -826 107 -4127 57 -1667 57 -498 77 -1660 55 -751 149 -152 193 -1474 99 -608 115 -2312 57 -1586 85 -144 57 -3152 105 -1225 71 -1321 75 -1732 57 -506 189 -1177 71 -1548 87 -1396 109 -3225 55 -1102 223 -114 85 -2537 143 -58 55 -1511 53 -780 57 -2098 71 -96 71 -1180 95 -144 97 -2283 55 -3182 143 -238 55 -2374 57 -792 55 -2931 75 -2015 119 -860 51 -358 173 -1256 165 -3319 141 -316 53 -1390 161 -4297 141 -3288 81 -977 57 -4351 57 -2804 71 -170 141 -2466 167 -1854 57 -260 113 -3224 83 -342 85 -58 79 -486 85 -446 87 -446 55 -1745 55 -366 51 -82 167 -1927 157 -2892 85 -86 85 -1712 83 -4854 83 -1790 109 -104 163 -784 101 -604 119 -888 159 -3756 143 -936 53 -2312 53 -1625 99 -3039 71 -1648 103 -520 57 -1024 57 -1404 57 -690 135 -410 57 -1228 201 -1932 77 -130 51 -688 101 -346 51 -198 87 -568 113 -828 87 -674 53 -684 87 -230 113 -670 143 -250 283 -488 97 -470 103 -122 79 -224 103 -386 71 -1160 55 -276 109 -1046 145 -2978 73 -1230 75 -8593 55 -298 87 -1980 55 -1970 139 -974 143 -446 57 -338 77 -1094 95 -840 77 -1066 55 -485 171 -292 95 -1434 152 -116 113 -658 55 -144 57 -836 85 -144 57 -86 53 -448 75 -2054 95 -240 71 -1638 53 -1000 53 -196 195 -2026 71 -939 51 -930 71 -799 57 -820 51 -968 57 -704 53 -356 173 -3870 57 -368 217 -574 69 -192 103 -764 95 -2853 55 -2042 103 -218 53 -260 69 -1754 97 -356 301 -116 55 -2265 87 -1452 95 -118 71 -1226 143 -638 51 -1195 115 -468 75 -1784 101 -152 51 -1222 71 -1619 113 -508 133 -1168 53 -394 71 -806 85 -600 85 -974 161 -386 73 -370 77 -3390 171 -276 77 -1595 95 -220 171 -3647 53 -772 55 -462 57 -832 71 -2348 119 -1478 51 -80 85 -909 79 -338 71 -2833 99 -274 77 -554 125 -1822 53 -108 83 -371 85 -172 57 -478 75 -1424 53 -680 55 -288 73 -1290 109 -3129 131 -958 131 -898 53 -1836 87 -418 53 -2138 119 -1003 101 -270 115 -1194 79 -2138 115 -2351 55 -1511 115 -1697 105 -1278 115 -198 183 +RAW_Data: -1450 57 -330 51 -894 57 -1926 55 -1552 83 -624 81 -3174 75 -270 107 -1111 85 -686 103 -4595 119 -96 286 -1021 71 -850 143 -606 85 -2639 81 -192 77 -1574 81 -468 55 -2484 137 -476 55 -314 85 -1139 53 -1418 79 -2247 111 -874 77 -120 71 -2082 99 -644 107 -288 115 -344 163 -5007 53 -102 121 -876 87 -244 115 -390 57 -144 85 -856 109 -510 103 -506 73 -3754 79 -2838 165 -1569 139 -2268 75 -2086 121 -2102 170 -634 71 -1294 191 -3428 75 -1719 99 -3194 75 -1630 71 -866 51 -644 171 -1416 97 -1687 57 -634 85 -96 71 -366 85 -745 53 -1418 57 -494 85 -1072 73 -122 73 -178 81 -2848 103 -1186 95 -286 71 -144 51 -1366 256 -1440 85 -1184 211 -2798 83 -140 57 -1516 55 -980 85 -86 141 -1316 55 -758 57 -3040 79 -928 99 -4315 181 -492 103 -400 73 -2040 81 -416 75 -388 171 -4212 53 -2250 85 -144 57 -144 85 -821 167 -192 117 -312 71 -3722 51 -248 83 -588 115 -2378 79 -594 79 -364 97 -408 167 -1382 53 -392 109 -1418 83 -2868 127 -120 71 -2244 71 -287 121 -672 85 -764 53 -260 57 -428 53 -1385 57 -3200 57 -3074 83 -114 55 -2185 77 -252 83 -1130 57 -1965 75 -2128 85 -3293 51 -1258 73 -934 97 -832 73 -432 95 -968 75 -692 93 -888 53 -560 77 -484 77 -954 81 -3098 85 -116 85 -506 85 -1618 141 -442 55 -938 73 -478 123 -944 215 -5486 57 -1530 77 -526 57 -1064 77 -342 83 -1814 75 -3042 85 -2245 85 -1223 79 -2229 83 -1538 71 -4608 103 -316 85 -58 185 -1588 71 -3626 85 -2112 253 -1060 57 -562 183 -3805 206 -674 71 -705 71 -2820 105 -468 95 -3669 213 -877 73 -118 121 -204 135 -2468 113 -232 85 -4493 57 -945 55 -672 113 -652 113 -734 53 -424 83 -510 83 -3710 83 -683 97 -2373 85 -2361 259 -995 51 -452 115 -486 81 -5736 57 -1278 51 -4423 111 -1306 163 -248 95 -844 57 -1317 115 -2350 75 -366 99 -1458 57 -444 57 -3824 87 -54 83 -388 249 -2503 101 -192 95 -910 135 -386 105 -2702 85 -1208 85 -250 85 -200 141 -1450 75 -485 57 -662 85 -3323 107 -622 36813 -362 51 -259 963 -732 937 -728 935 -756 909 -756 883 -780 885 -780 883 -784 883 -806 859 -782 883 -808 863 -806 859 -806 857 -808 857 -806 859 -808 857 -808 861 -808 857 -806 861 -806 859 -808 857 -806 861 -808 859 -808 833 -832 833 -834 831 -832 859 -806 857 -806 859 -808 859 -810 857 -806 859 -806 861 -808 833 -832 833 -832 831 -832 833 -834 857 -808 833 -834 831 -834 835 -834 833 -832 833 -832 831 +RAW_Data: -832 833 -834 857 -806 859 -808 857 -812 833 -834 857 -806 833 -832 833 -832 857 -808 835 -834 831 -834 831 -834 835 -834 831 -832 835 -832 831 -836 831 -832 857 -810 833 -832 831 -834 831 -834 857 -808 831 -836 833 -832 831 -834 831 -834 833 -834 831 -834 857 -808 859 -806 859 -810 831 -834 857 -808 857 -808 859 -810 831 -832 833 -832 833 -832 833 -832 859 -808 833 -832 857 -808 833 -832 859 -806 859 -808 833 -834 859 -808 831 -834 835 -832 833 -832 831 -834 857 -806 859 -808 859 -808 857 -810 831 -836 833 -832 831 -832 833 -832 857 -808 859 -806 835 -834 831 -834 835 -832 857 -808 833 -834 831 -832 833 -834 833 -834 833 -832 831 -834 833 -834 835 -830 833 -832 831 -834 833 -832 833 -832 859 -808 857 -808 833 -834 833 -832 833 -834 831 -834 857 -808 835 -832 831 -834 857 -808 857 -808 835 -834 831 -834 831 -834 833 -836 831 -832 833 -834 831 -834 831 -834 833 -834 835 -832 831 -832 833 -832 857 -810 833 -834 833 -836 829 -832 831 -832 835 -834 831 -832 835 -834 831 -834 833 -832 833 -832 831 -832 835 -832 833 -832 833 -832 833 -834 857 -808 859 -808 833 -834 833 -832 833 -834 831 -834 831 -832 835 -834 831 -832 833 -832 859 -810 831 -832 833 -834 857 -808 833 -832 833 -832 833 -832 833 -834 859 -806 859 -810 831 -834 831 -832 859 -806 835 -836 831 -832 831 -832 859 -808 833 -832 859 -808 857 -808 835 -832 831 -834 833 -834 831 -834 833 -832 857 -810 833 -832 833 -832 859 -808 831 -832 859 -808 831 -832 859 -808 859 -806 859 -806 859 -810 833 -834 835 -832 833 -832 831 -832 857 -808 857 -808 859 -806 835 -834 831 -836 835 -834 831 -832 831 -832 859 -808 831 -836 833 -834 833 -832 833 -832 831 -832 859 -806 835 -836 833 -832 831 -834 831 -836 831 -834 833 -832 835 -834 833 -834 831 -832 831 -832 835 -834 833 -832 831 -832 833 -834 831 -834 831 -832 857 -808 857 -808 833 -834 835 -832 831 -834 831 -834 857 -808 859 -808 833 -832 831 -834 833 -832 859 -808 857 -808 835 -832 835 -832 831 -832 835 -834 831 -834 831 -834 833 -834 831 -832 833 -832 833 -832 835 -834 831 -834 831 -832 835 -832 831 -834 859 -806 859 -808 859 -806 837 -832 831 -832 833 -834 857 -808 833 -832 859 -808 857 -808 831 -834 835 -832 833 -832 857 -808 833 -832 861 -810 831 -832 831 -834 857 -810 831 -834 831 -832 859 -808 833 -832 857 -808 859 -806 835 -834 831 -834 833 -832 859 -806 859 -808 857 +RAW_Data: -808 835 -832 831 -834 857 -808 857 -808 859 -808 859 -808 831 -832 833 -834 831 -836 833 -832 831 -832 859 -808 833 -834 833 -832 859 -806 859 -808 857 -808 833 -834 833 -832 831 -834 833 -834 857 -808 831 -832 859 -808 859 -806 835 -832 1665 -4178 1667 -1662 833 -832 1663 -832 3335 -832 835 -832 831 -2500 831 -1666 3339 -3338 829 -830 831 -832 2499 -832 1665 -2500 4173 -1664 1665 -832 831 -2500 833 -3344 831 -830 833 -830 2499 -832 1669 -2506 4177 -1640 1693 -802 853 -2476 853 -3332 831 -830 831 -830 2501 -836 1665 -2506 4169 -1664 1663 -832 829 -2506 831 -3338 827 -832 831 -830 2505 -830 1665 -2504 4167 -1664 1665 -832 831 -2498 13331 -828 853 -830 4165 -4166 1663 -2506 3333 -830 1665 -1664 1663 -1668 831 -832 1665 -3336 831 -1668 831 -832 831 -832 2499 -3342 829 -832 829 -834 2501 -832 1667 -2502 4169 -1672 1663 -830 831 -2502 829 -3338 829 -834 831 -832 2497 -832 1667 -2500 4169 -1666 1663 -836 831 -2500 831 -3342 833 -832 829 -832 2497 -832 1667 -2510 4179 -1638 1689 -804 855 -2476 855 -3330 831 -830 831 -832 2499 -832 1669 -2506 4173 -1662 1663 -832 829 -2504 831 -3336 829 -832 831 -834 2497 -832 1665 -2500 4177 -1668 1663 -832 831 -2504 829 -3336 829 -832 829 -832 2499 -832 1667 -2500 4169 -1668 1667 -834 831 -2500 833 -3338 827 -832 831 -832 2499 -832 1671 -2508 4169 -1662 1663 -830 829 -2500 831 -3332 833 -832 833 -834 2499 -834 1669 -2500 4167 -1664 1671 -832 829 -2500 831 -3334 829 -836 831 -832 2499 -834 1665 -2500 4185 -1642 1689 -828 831 -2500 829 -3334 831 -834 831 -830 2507 -830 1665 -2500 4167 -1668 1665 -830 831 -778 77 -502 75 -427 224 -242 167 -1264 57 -334 105 -5932 115 -2566 79 -514 55 -459 57 -1564 75 -296 95 -4925 111 -202 85 -3492 99 -4327 55 -582 57 -1520 197 -708 53 -1666 53 -1005 85 -3861 139 -858 73 -276 147 -1406 113 -5864 95 -1253 93 -2699 85 -575 93 -3012 57 -774 71 -1662 55 -926 77 -138 55 -744 97 -6232 79 -1435 109 -799 73 -1018 95 -982 79 -664 85 -192 171 -202 57 -198 83 -832 117 -96 53 -734 119 -780 79 -1394 197 -488 55 -371 83 -144 85 -1816 145 -2451 57 -114 115 -1158 69 -168 71 -868 87 -3907 51 -2788 123 -1454 55 -492 53 -510 85 -144 57 -857 53 -1214 85 -140 51 -899 103 -1318 55 -2793 73 -142 71 -1067 109 -5247 55 -172 113 -341 85 -2553 57 -682 217 -170 77 -1216 161 -1844 53 -2747 87 -538 111 -843 53 -1197 109 -2973 53 -1314 111 -514 95 -864 81 -1671 53 -1812 57 -1419 71 -636 83 -3998 75 -1285 135 -578 51 -2754 179 -1194 71 -7260 51 +RAW_Data: -1003 75 -1988 57 -764 57 -5820 85 -474 69 -655 81 -136 103 -1594 53 -1120 51 -520 101 -487 159 -5829 77 -784 103 -440 139 -432 57 -786 79 -506 95 -1982 53 -3728 71 -2506 77 -983 57 -922 135 -3584 57 -1088 57 -142 115 -424 55 -1435 103 -954 113 -286 99 -948 79 -417 133 -398 85 -260 143 -3084 55 -940 195 -758 71 -288 71 -216 95 -1490 77 -1902 85 -3592 53 -796 55 -1351 53 -1538 55 -778 75 -5106 85 -144 57 -1104 95 -452 51 -3006 83 -316 85 -3131 69 -1243 53 -2591 73 -192 71 -462 71 -2566 81 -706 85 -446 51 -1226 81 -656 57 -622 55 -1302 115 -428 55 -1165 171 -1767 111 -1888 85 -1362 55 -562 79 -698 71 -100 191 -192 57 -150 73 -342 97 -342 71 -534 125 -1558 81 -348 77 -232 55 -434 81 -2934 55 -2374 392 -774 53 -3880 71 -4408 105 -230 55 -888 57 -1014 133 -1074 51 -440 173 -314 111 -2931 105 -2165 53 -1654 51 -5547 109 -1688 163 -398 103 -1727 51 -958 139 -1370 87 -144 85 -316 143 -3860 51 -682 163 -2472 107 -1116 125 -896 51 -366 73 -1198 75 -647 143 -2628 53 -1663 85 -984 103 -882 115 -960 71 -2405 81 -1010 53 -510 79 -3410 135 -2502 139 -1552 53 -2004 55 -628 115 -404 55 -570 113 -688 113 -1817 131 -1240 51 -414 135 -538 109 -1233 201 -214 57 -274 73 -1428 85 -434 57 -2570 53 -340 57 -2775 51 -2914 71 -828 79 -740 57 -3780 137 -386 75 -1304 57 -641 53 -668 85 -480 53 -284 85 -764 85 -358 53 -6176 127 -442 95 -192 95 -2628 109 -722 83 -1068 95 -144 145 -404 57 -1762 51 -2612 171 -230 87 -632 171 -146 55 -196 79 -324 51 -224 57 -1318 81 -1345 85 -136 53 -410 83 -80 81 -930 143 -172 57 -2253 53 -216 71 -282 79 -788 212 -706 87 -3134 71 -498 87 -2968 77 -1186 83 -1189 57 -656 83 -424 53 -1410 71 -1554 55 -1004 55 -2736 83 -3182 83 -318 69 -456 95 -926 85 -1232 51 -138 55 -2078 111 -708 142 -268 79 -4582 53 -1152 55 -160 95 -144 161 -330 71 -2236 133 -324 51 -1134 119 -144 139 -718 85 -272 75 -694 55 -318 57 -1710 75 -330 55 -202 115 -1642 163 -56 113 -256 85 -398 73 -1378 95 -94 71 -168 71 -1748 111 -744 85 -2261 73 -336 85 -4614 57 -2696 79 -54 277 -2278 85 -716 71 -2765 85 -1852 77 -622 95 -913 157 -1542 105 -284 57 -3042 77 -1418 85 -900 51 -658 83 -1122 115 -452 81 -100 75 -1400 57 -700 105 -380 99 -332 55 -573 75 -2416 75 -294 107 -316 161 -957 113 -730 51 -998 71 -384 53 -488 209 +RAW_Data: -222 57 -364 53 -1099 57 -570 301 -4112 71 -2730 53 -917 85 -519 85 -1030 55 -2335 85 -374 143 -791 169 -786 57 -998 85 -404 85 -323 81 -1443 55 -1861 199 -88 85 -1991 57 -6675 95 -811 131 -1474 85 -202 229 -1528 85 -912 87 -1233 53 -484 123 -1245 53 -2714 83 -1715 51 -2626 77 -1429 57 -2401 85 -420 51 -669 55 -986 143 -1509 95 -1362 71 -530 79 -762 51 -1226 95 -5703 143 -138 71 -738 83 -912 55 -1582 55 -1200 55 -1106 55 -1289 95 -558 95 -206 143 -2372 109 -748 51 -1584 57 -172 115 -662 135 -156 207 -1464 55 -1732 125 -218 135 -2488 57 -312 55 -2344 79 -412 85 -610 53 -170 55 -1890 57 -3146 57 -924 167 -1127 145 -1284 51 -436 55 -458 115 -340 179 -640 121 -1297 184 -1106 55 -716 113 -2115 71 -240 95 -120 53 -190 57 -266 125 -158 57 -1042 203 -3645 101 -196 101 -138 85 -912 159 -2064 85 -536 83 -3063 55 -170 85 -510 53 -1224 81 -128 51 -1143 101 -4358 95 -947 53 -1402 85 -1894 51 -160 81 -3344 250 -718 103 -184 185 -280 51 -372 113 -820 57 -1154 105 -100 75 -462 71 -1681 53 -1395 79 -670 121 -2820 57 -1014 79 -1628 87 -498 57 -288 143 -740 57 -584 77 -676 85 -1106 57 -2601 103 -1062 83 -3676 75 -1387 171 -138 53 -164 83 -746 57 -316 172 -144 57 -1987 99 -1416 143 -2058 85 -1872 57 -1538 171 -1630 171 -2542 137 -1102 117 -1824 135 -292 163 -462 125 -1226 57 -622 57 -345 85 -1499 53 -910 53 -3758 77 -960 143 -216 167 -912 53 -160 75 -354 57 -831 71 -168 73 -1026 81 -1778 85 -250 51 -1472 57 -466 51 -916 119 -992 73 -980 55 -1039 139 -424 57 -1118 141 -534 85 -486 85 -906 119 -144 71 -1481 109 -1822 79 -2745 57 -3291 137 -2190 95 -1865 133 -1580 55 -628 57 -1683 87 -350 55 -1363 115 -220 87 -56 113 -1068 85 -1642 71 -1727 57 -1398 95 -2382 79 -416 53 -2231 57 -86 143 -984 77 -809 95 -2508 73 -5249 57 -1408 115 -1401 115 -974 143 -1392 57 -818 51 -472 83 -340 83 -533 57 -144 55 -1447 146 -2054 167 -116 55 -3623 51 -1221 75 -314 129 -1122 79 -1146 53 -1695 55 -772 165 -899 57 -454 53 -110 139 -1158 85 -1138 95 -318 55 -1394 75 -1302 85 -1774 81 -851 109 -1620 79 -1598 101 -1417 81 -1038 143 -376 201 -86 85 -2134 83 -2553 131 -431 71 -714 51 -1226 85 -565 254 -307 143 -72 75 -2096 51 -426 57 -1246 185 -972 51 -104 121 -422 51 -746 55 -174 85 -1839 75 -468 193 -952 55 -5596 53 -902 85 -932 77 -244 93 -797 71 +RAW_Data: -120 95 -1172 127 -1658 127 -336 115 -3786 81 -1645 175 -664 71 -1213 119 -538 81 -486 83 -1056 139 -502 81 -136 57 -1016 55 -4015 79 -983 83 -3019 162 -872 55 -1206 51 -668 69 -1794 71 -72 71 -1110 85 -260 109 -1256 77 -1689 77 -220 85 -1356 85 -1444 57 -1574 113 -748 85 -2763 111 -1122 97 -200 71 -180 163 -652 99 -406 221 -1464 57 -2674 152 -1056 111 -1950 95 -246 51 -564 57 -1968 143 -2935 125 -72 51 -3471 147 -1538 75 -2358 143 -998 55 -56 81 -1742 71 -614 71 -510 115 -1230 51 -592 85 -5279 71 -1456 143 -546 97 -2283 115 -768 135 -2157 53 -1126 125 -1852 85 -172 115 -288 135 -3593 55 -82 81 -418 79 -2092 75 -2337 75 -862 123 -1512 51 -196 57 -2481 81 -282 85 -272 71 -96 71 -468 75 -200 99 -1080 55 -1080 79 -80 81 -146 241 -1940 57 -172 85 -232 221 -166 111 -720 111 -1020 201 -202 57 -438 113 -3193 105 -432 95 -382 53 -254 85 +RAW_Data: -576 57 -428 71 -1124 85 -756 77 -160 81 -747 57 -720 53 -1277 75 -1634 143 -120 119 -72 85 -682 287 -156 71 -72 71 -828 155 -144 95 -238 145 -893 133 -784 55 -530 305 -346 85 -86 357 -690 95 -144 97 -606 95 -590 99 -748 51 -954 55 -786 77 -878 131 -834 141 -770 105 -718 53 -86 143 -958 75 -2848 101 -1184 57 -392 81 -202 55 -592 53 -854 57 -2498 71 -3492 217 -2608 55 -1050 215 -94 53 -230 115 -1046 85 -890 81 -464 57 -350 149 -178 57 -1463 71 -2903 113 -283 53 -1820 83 -2193 55 -3771 51 -2286 53 -132 109 -1115 97 -1400 57 -892 105 -670 81 -634 107 -400 53 -662 107 -172 55 -8569 95 -1160 113 -172 57 -376 119 -360 57 -4359 55 -5612 85 -903 107 -2561 217 -1696 53 -328 99 -222 69 -628 53 -190 75 -296 51 -100 95 -238 190 -463 255 -664 79 -2058 57 -840 55 -1408 71 -774 53 -84 93 -582 51 -8306 55 -1909 129 -4008 135 -3409 77 -106 77 -664 95 -1304 123 -308 79 -1343 77 -680 79 -3844 119 -1222 75 -1388 125 -3826 57 -870 73 -744 53 -2282 140 -500 81 -192 87 -2144 143 -892 55 -950 71 -614 187 -174 85 -402 51 -288 131 -494 111 -124 165 -1326 57 -202 55 -346 57 -918 181 -896 57 -380 105 -484 191 -670 85 -2323 55 -3243 133 -390 97 -3123 105 -1292 71 -722 105 -426 75 -172 93 -880 71 -96 81 -544 79 -122 79 -2570 53 -782 57 -2544 53 -438 143 -988 113 -490 57 -144 113 -1980 115 -1540 51 -1974 452 -1540 57 -1507 115 -1440 85 -1485 55 -1309 109 -4194 107 -826 53 -84 109 -4176 109 -1699 111 -1789 199 -1891 119 -1162 55 -1282 105 -1320 189 -200 115 -1004 83 -500 95 -3674 215 -1672 57 -396 55 -1992 71 -191 71 -4032 83 -238 57 -1076 139 -1018 55 -2031 73 -3503 77 -2106 51 -268 173 -1106 101 -160 57 -2695 53 -412 71 -971 143 -512 143 -1142 219 -314 57 -2280 141 -1352 53 -142 115 -1261 53 -3901 85 -1568 53 -1030 165 -1322 51 -1320 137 -859 95 -419 95 -1546 85 -431 195 -4704 55 -174 115 -86 55 -3617 81 -1847 57 -1075 55 -258 57 -512 55 -842 55 -144 95 -648 79 -1022 55 -2452 71 -400 95 -1854 57 -316 85 -3789 57 -1923 57 -56 51 -586 51 -558 81 -280 81 -144 71 -406 51 -5014 71 -386 127 -138 229 -270 75 -144 141 -511 123 -268 57 -1619 101 -2900 113 -426 85 -114 57 -1092 173 -690 57 -6610 85 -6804 57 -314 119 -382 71 -484 115 -2236 143 -1202 79 -584 105 -724 71 -948 115 -214 75 -5453 51 -952 145 -572 107 -2334 103 -338 55 +RAW_Data: -838 79 -4725 69 -298 95 -1760 81 -795 55 -480 179 -1534 133 -457 51 -970 51 -2324 81 -844 57 -1780 119 -550 145 -1218 57 -268 55 -573 115 -2077 71 -1476 57 -86 97 -4518 71 -526 51 -272 139 -3348 85 -1338 53 -780 53 -1548 77 -582 81 -881 55 -1422 105 -1636 77 -1617 71 -924 201 -260 85 -1092 83 -914 51 -2326 111 -382 109 -2328 77 -750 95 -1342 71 -120 51 -280 57 -918 73 -784 53 -4704 79 -1094 85 -624 57 -2733 85 -710 77 -346 57 -716 143 -1489 165 -792 173 -688 73 -102 97 -1139 75 -76 51 -164 81 -762 109 -296 77 -5079 113 -500 83 -304 139 -1080 51 -4167 75 -998 85 -367 85 -3404 71 -1460 95 -1588 111 -1510 95 -939 111 -2271 57 -694 135 -1592 85 -256 163 -708 95 -770 81 -164 113 -1608 95 -672 83 -470 79 -1810 55 -82 79 -144 51 -188 113 -58 115 -1338 55 -4046 119 -970 38481 -128 51 -496 935 -728 937 -754 911 -756 911 -754 911 -754 911 -756 883 -784 885 -780 883 -782 885 -808 857 -806 859 -806 859 -808 859 -806 859 -806 859 -808 857 -808 859 -806 861 -808 857 -808 859 -810 859 -806 857 -808 857 -806 859 -806 859 -808 859 -806 859 -806 859 -808 857 -810 857 -806 859 -810 835 -832 831 -834 831 -832 833 -832 859 -810 831 -832 833 -834 857 -808 833 -834 833 -832 831 -834 833 -834 831 -834 833 -834 831 -834 831 -832 859 -808 857 -806 859 -808 833 -832 833 -832 859 -810 831 -832 859 -808 857 -808 859 -808 831 -836 831 -834 833 -832 833 -834 857 -808 857 -810 831 -832 833 -834 857 -808 857 -808 833 -832 859 -810 831 -832 859 -808 831 -832 859 -808 835 -832 831 -834 857 -808 833 -832 859 -810 833 -836 831 -834 831 -832 831 -834 857 -808 859 -808 835 -834 831 -832 831 -834 831 -834 833 -832 857 -808 833 -832 859 -810 831 -834 831 -832 859 -808 857 -808 833 -834 831 -834 833 -832 859 -808 831 -834 833 -834 833 -834 831 -834 831 -834 857 -808 857 -808 833 -834 833 -834 833 -832 833 -832 835 -834 831 -834 833 -832 831 -832 831 -834 859 -808 857 -808 831 -834 857 -808 859 -806 835 -834 831 -834 831 -834 835 -832 833 -832 857 -810 831 -832 833 -832 833 -832 859 -808 861 -808 833 -834 831 -832 833 -832 857 -810 831 -834 831 -838 833 -830 833 -832 831 -832 859 -808 833 -832 833 -832 859 -808 857 -808 835 -832 833 -832 831 -836 831 -832 859 -806 859 -808 859 -808 857 -808 859 -808 833 -832 833 -834 833 -832 831 -834 857 -808 859 -806 835 -834 831 -832 833 +RAW_Data: -834 833 -834 831 -832 857 -808 835 -832 833 -834 857 -808 859 -806 859 -808 857 -808 831 -832 859 -808 859 -808 831 -834 857 -808 859 -810 833 -832 831 -838 831 -834 835 -830 833 -832 831 -832 835 -832 833 -834 835 -832 831 -832 831 -834 831 -834 857 -808 859 -806 859 -808 857 -808 833 -834 833 -832 831 -836 831 -832 859 -810 833 -834 833 -832 831 -832 833 -834 831 -832 859 -808 857 -808 857 -808 859 -808 859 -806 859 -808 857 -808 859 -808 831 -834 857 -810 857 -806 835 -834 831 -834 831 -834 833 -832 833 -834 831 -834 833 -832 857 -808 859 -808 857 -810 833 -834 833 -832 831 -832 833 -832 857 -812 831 -836 835 -830 831 -832 831 -836 831 -834 833 -836 831 -832 831 -834 831 -832 859 -808 859 -808 831 -836 835 -834 831 -832 831 -834 831 -832 859 -808 831 -836 835 -832 831 -832 831 -834 857 -808 857 -810 831 -834 833 -834 835 -832 831 -832 831 -836 831 -834 859 -808 833 -832 831 -834 857 -808 859 -806 833 -834 857 -810 835 -832 831 -834 831 -832 833 -832 833 -834 833 -834 831 -834 831 -832 859 -808 857 -808 833 -832 859 -808 857 -808 859 -808 835 -832 833 -832 831 -832 859 -808 857 -808 859 -808 833 -832 833 -834 835 -832 831 -834 831 -834 831 -834 857 -810 831 -832 857 -808 859 -808 859 -808 857 -808 831 -834 859 -806 859 -808 857 -808 857 -810 857 -808 859 -810 831 -834 831 -832 833 -834 857 -808 857 -808 835 -834 831 -832 833 -832 859 -808 857 -808 833 -834 831 -832 833 -834 857 -810 835 -834 831 -832 831 -832 859 -806 1691 -4134 1691 -1640 855 -830 1663 -832 3333 -832 831 -832 831 -2502 831 -1668 3337 -3336 829 -832 831 -832 2505 -830 1665 -2506 4169 -1642 1689 -830 829 -2500 831 -3342 829 -832 831 -832 2501 -832 1665 -2506 4157 -1664 1691 -804 853 -2478 857 -3306 853 -832 833 -834 2505 -830 1663 -2502 4153 -1660 1687 -828 829 -2500 833 -3340 829 -830 829 -832 2499 -832 1667 -2500 4171 -1668 1667 -832 829 -2500 829 -3318 859 -830 831 -832 2499 -832 1667 -2498 4171 -1664 1663 -832 831 -2502 829 -3338 831 -832 831 -832 2501 -832 1667 -2504 4167 -1670 1669 -828 831 -2500 12491 -3334 853 -4972 853 -1660 827 -1660 853 -3308 855 -830 829 -830 2499 -834 1665 -2508 4169 -1664 1663 -830 831 -2506 829 -3336 831 -830 833 -832 2499 -832 1667 -2508 4165 -1664 1663 -832 833 -2500 833 -3338 829 -832 831 -832 2501 -830 1665 -2502 4171 -1666 1663 -832 831 -2500 831 -3342 829 -832 831 -832 2501 -836 1663 -2500 4173 -1670 1663 -830 831 -2504 829 -3332 831 -832 831 -832 2507 +RAW_Data: -830 1667 -2502 4173 -1642 1695 -804 855 -2498 829 -3332 831 -830 831 -832 2499 -834 1669 -2506 4175 -1636 1689 -832 831 -2480 853 -3332 833 -830 831 -832 2509 -830 1663 -2502 4165 -1666 1667 -832 831 -2500 831 -3340 831 -830 831 -832 2503 -832 1665 -2504 4169 -1662 1663 -832 831 -2506 831 -3340 829 -830 831 -830 2503 -832 1669 -2502 4169 -1664 1665 -830 831 -1350 81 -266 177 -269 57 -490 143 -2812 85 -2206 57 -72 73 -689 200 -726 149 -598 143 -1554 85 -792 143 -336 123 -548 95 -996 109 -424 55 -140 143 -520 123 -744 81 -730 51 -2840 73 -2716 103 -490 129 -1354 51 -2207 85 -2683 55 -288 173 -895 85 -4697 55 -530 97 -1837 131 -946 73 -660 103 -2022 119 -1039 95 -454 143 -1098 109 -1004 219 -78 312 -778 53 -364 51 -666 113 -376 85 -1059 73 -802 55 -700 75 -1554 171 -1446 107 -168 85 -1278 111 -2564 97 -1578 71 -94 75 -1124 57 -202 171 -2954 79 -3597 191 -326 57 -922 51 -2730 53 -6135 55 -2020 225 -230 87 -1212 53 -1216 149 -1208 53 -502 57 -985 57 -2636 51 -2358 85 -926 143 -1490 57 -114 85 -634 87 -258 57 -1351 75 -1086 95 -192 71 -2150 73 -2060 137 -2159 95 -1362 73 -336 71 -953 77 -220 53 -1989 83 -172 57 -1969 107 -2257 140 -886 71 -1026 123 -372 73 -934 99 -522 139 -651 257 -1566 77 -5069 201 -4802 55 -142 57 -1396 79 -2716 55 -2050 79 -604 111 -1040 85 -1534 109 -544 83 -342 107 -1459 85 -86 57 -3009 99 -322 51 -2178 119 -1485 73 -694 95 -2832 85 -628 81 -1824 222 -1313 85 -918 71 -864 139 -872 79 -218 51 -468 81 -400 85 -1794 83 -742 227 -504 79 -1632 95 -1193 173 -316 85 -2780 51 -1454 103 -246 95 -1885 53 -2051 125 -1186 71 -1708 73 -719 83 -896 73 -524 81 -1082 141 -1076 77 -982 95 -1493 55 -1760 57 -1092 125 -2082 51 -120 83 -2372 77 -1458 75 -1212 75 -412 125 -504 109 -1937 57 -1176 161 -532 71 -224 75 -170 53 -2455 83 -1448 85 -520 55 -1582 143 -1199 115 -172 57 -3324 113 -968 115 -936 109 -3588 71 -1038 57 -1284 245 -674 125 -3396 105 -11139 57 -112 107 -1070 81 -424 115 -2333 131 -1048 115 -874 81 -1754 57 -1300 115 -776 109 -1778 83 -58 85 -2295 55 -5975 115 -6613 55 -2096 51 -394 113 -976 51 -856 53 -950 85 -896 57 -1021 83 -2526 71 -914 53 -1867 121 -376 85 -144 115 -1340 51 -544 143 -1367 71 -252 105 -3156 85 -1170 53 -82 55 -3404 107 -4580 81 -284 83 -2419 57 -1649 123 -714 51 -315 85 -452 105 -562 51 -2883 339 -284 105 -4443 79 -772 145 -700 71 +RAW_Data: -2030 57 -506 57 -2361 135 -4288 71 -240 95 -5117 81 -1952 85 -78 51 -268 131 -336 187 -256 103 -480 115 -200 57 -1072 51 -1488 169 -601 85 -344 51 -527 83 -316 105 -2755 81 -1151 55 -515 119 -1884 115 -86 57 -198 107 -572 75 -1890 87 -344 53 -3983 53 -1831 143 -1036 115 -776 73 -1976 83 -526 57 -244 71 -2232 53 -658 55 -2022 111 -1187 55 -1060 143 -790 113 -448 85 -1146 171 -360 77 -326 55 -1430 55 -1196 57 -2278 57 -58 85 -472 99 -144 153 -76 73 -3314 71 -336 127 -1364 85 -2548 161 -2241 83 -1835 173 -1282 105 -598 109 -1635 85 -1584 131 -936 57 -202 57 -316 87 -2655 57 -2056 83 -1442 51 -2730 51 -1225 73 -1618 85 -1316 73 -1938 75 -144 57 -466 75 -542 81 -666 135 -76 51 -2683 57 -2176 171 -1803 73 -1938 55 -116 85 -674 71 -144 73 -1015 71 -348 139 -114 87 -804 57 -876 81 -3570 103 -2494 115 -4706 97 -836 167 -3400 109 -159 109 -422 143 -1118 81 -1652 53 -1064 85 -2080 125 -942 51 -536 109 -596 57 -2403 101 -1859 51 -456 51 -4086 53 -944 57 -510 135 -1405 87 -1710 85 -2595 81 -654 71 -366 179 -2085 79 -1852 55 -1312 77 -1568 73 -230 201 -612 77 -2530 107 -834 53 -2593 71 -720 69 -956 51 -1000 71 -2016 73 -1062 53 -288 85 -1816 51 -1080 105 -4427 57 -502 57 -246 57 -172 85 -522 111 -1109 55 -1322 85 -3728 53 -726 77 -342 169 -548 85 -144 85 -4389 95 -168 111 -1119 107 -170 55 -482 55 -1877 115 -224 55 -1441 115 -1658 55 -260 115 -2828 57 -292 141 -588 77 -366 113 -1268 113 -2047 57 -2529 95 -96 95 -2418 51 -606 55 -7091 199 -232 55 -542 185 -503 115 -4766 71 -1646 81 -364 57 -842 57 -1202 77 -1835 173 -606 75 -1815 95 -2219 115 -1155 105 -1413 55 -624 55 -1132 73 -3094 107 -228 115 -2893 85 -410 77 -390 53 -876 71 -1922 95 -238 213 -102 71 -3646 57 -144 57 -790 83 -258 57 -534 55 -1262 55 -442 57 -922 55 -394 81 -2235 85 -432 115 -1230 55 -2571 167 -2298 57 -364 173 -114 115 -2858 55 -380 55 -1758 113 -140 137 -679 53 -486 57 -492 107 -470 79 -344 107 -708 55 -438 201 -647 85 -318 125 -1030 119 -216 115 -1186 190 -456 111 -830 85 -324 75 -204 73 -1540 55 -1106 51 -824 87 -1648 51 -236 51 -894 113 -758 57 -246 73 -2861 163 -368 107 -2106 85 -172 85 -230 57 -732 81 -1398 55 -1004 187 -1516 55 -1230 105 -1356 51 -134 169 -188 51 -3247 85 -346 115 -1154 71 -288 83 -1114 129 -294 75 -52 51 -1298 55 -2941 55 +RAW_Data: -214 75 -196 111 -2485 75 -126 95 -312 143 -72 71 -190 81 -804 57 -174 55 -1083 55 -368 51 -108 85 -288 171 -314 85 -508 57 -1214 53 -642 73 -1274 75 -2906 85 -994 53 -196 55 -516 57 -1062 71 -168 95 -230 73 -220 111 -1678 175 -885 79 -392 135 -780 75 -1414 101 -226 115 -1356 75 -1103 107 -166 55 -374 201 -1658 79 -2138 83 -2953 51 -3438 57 -1496 139 -706 55 -86 113 -550 79 -290 69 -886 75 -1810 85 -2014 57 -7729 85 -346 143 -320 71 -370 109 -630 171 -832 57 -230 85 -2047 57 -2083 55 -1038 53 -307 143 -3795 85 -224 51 -76 75 -734 51 -110 139 -1386 51 -1956 143 -804 87 -2378 51 -266 95 -479 71 -74 153 -3470 57 -1820 195 -2516 191 -2735 51 -298 95 -382 55 -142 85 -484 143 -422 139 -240 145 -224 71 -614 51 -5422 53 -284 57 -2086 79 -457 143 -792 69 -1877 57 -370 53 -1174 57 -202 201 -444 143 -2668 77 -499 95 -336 71 -168 99 -601 55 -1254 113 -342 107 -572 57 -2087 55 -140 55 -1613 103 -226 187 -516 87 -984 55 -1292 139 -2796 53 -104 83 -548 83 -58 115 -566 103 -2006 57 -399 167 -716 143 -924 105 -226 57 -756 127 -366 81 -7232 53 -3058 71 -3351 57 -316 77 -689 99 -1099 75 -1238 142 +RAW_Data: -338 85 -404 115 -1320 165 -86 113 -280 133 -1238 133 -838 137 -2438 233 -1339 77 -326 285 -684 85 -542 405 -144 117 -74 133 -488 161 -256 154 -204 219 -292 79 -234 131 -58 143 -386 381 -108 211 -370 143 -240 71 -510 177 -511 191 -238 163 -428 115 -784 105 -698 57 -774 141 -1686 85 -88 53 -504 53 -138 83 -3074 229 -2636 105 -344 57 -1200 85 -431 85 -368 131 -592 79 -108 57 -144 85 -2860 83 -1708 77 -5452 145 -130 111 -514 75 -214 97 -194 53 -1610 139 -968 51 -456 71 -1228 79 -831 115 -4064 103 -2760 57 -1613 57 -1198 55 -1513 85 -825 69 -72 87 -6472 143 -202 57 -2092 113 -764 111 -1016 85 -1328 321 -2368 57 -288 83 -948 107 -1250 111 -606 79 -392 87 -1048 81 -1190 57 -3359 131 -612 133 -4205 81 -244 71 -72 143 -1263 85 -230 115 -414 107 -209 125 -172 57 -718 133 -282 75 -1116 81 -1250 57 -200 231 -684 57 -568 75 -2242 81 -1015 85 -2736 141 -96 239 -574 119 -1188 95 -72 119 -1968 77 -364 57 -1090 75 -2203 125 -4261 171 -72 71 -432 71 -3192 87 -418 55 -646 79 -519 57 -3108 181 -1844 53 -576 111 -980 53 -498 95 -1398 57 -3554 81 -2111 157 -222 137 -156 85 -58 315 -180 55 -1576 115 -2007 75 -178 113 -1660 57 -2160 71 -942 51 -264 55 -470 77 -174 105 -1352 71 -528 71 -200 101 -1054 81 -672 57 -116 141 -168 57 -502 51 -3472 71 -96 71 -698 95 -557 139 -392 55 -572 57 -2121 75 -849 57 -757 191 -58 55 -835 51 -516 53 -1395 79 -230 51 -392 95 -1216 85 -540 81 -441 235 -2225 351 -84 111 -1198 57 -260 55 -86 113 -600 55 -1224 75 -104 51 -735 71 -2128 217 -2296 53 -174 125 -154 71 -96 71 -432 109 -1114 129 -2309 185 -760 93 -1597 119 -1341 53 -558 199 -1754 107 -80 53 -262 143 -2375 105 -530 127 -1875 77 -1161 55 -220 95 -1106 71 -427 213 -2730 71 -835 83 -1084 55 -958 113 -1938 55 -3530 99 -100 71 -1898 143 -1378 57 -1091 57 -872 85 -144 57 -1924 73 -1016 93 -72 95 -1056 97 -1922 79 -408 85 -1863 77 -908 57 -292 53 -816 79 -108 55 -918 95 -262 87 -1573 71 -384 105 -522 105 -5164 57 -2268 113 -1595 143 -1210 115 -1250 115 -1072 85 -392 55 -88 113 -392 83 -716 53 -2979 77 -945 173 -554 71 -3442 55 -1746 113 -144 287 -82 57 -604 157 -1221 115 -374 57 -1718 77 -432 57 -1504 57 -1140 83 -228 57 -202 85 -712 77 -934 57 -1234 129 -168 71 -800 77 -790 79 -2738 137 -1610 51 -610 55 -590 53 -2878 57 -1028 53 +RAW_Data: -2146 51 -722 113 -1007 85 -2775 71 -96 143 -168 71 -560 53 -80 81 -2334 81 -658 137 -220 51 -124 71 -6008 81 -776 71 -350 123 -168 71 -448 71 -454 109 -318 85 -3378 71 -490 109 -5580 127 -3651 73 -912 71 -1372 87 -1122 83 -144 57 -2868 53 -370 51 -1582 55 -266 157 -300 75 -1232 53 -662 199 -202 139 -1772 190 -294 81 -3744 53 -1156 79 -2455 55 -242 71 -408 57 -2073 99 -140 57 -1305 83 -455 57 -260 85 -720 75 -298 81 -975 259 -534 127 -352 57 -522 71 -1633 85 -843 57 -316 87 -1169 81 -566 75 -226 83 -196 115 -2258 173 -489 83 -136 55 -1445 81 -1108 71 -2362 97 -728 95 -1581 57 -432 57 -1344 133 -112 57 -910 55 -84 83 -954 83 -1375 155 -1141 195 -144 95 -1495 71 -829 111 -142 85 -2702 111 -1576 159 -1990 97 -640 75 -344 171 -86 85 -3409 71 -386 101 -912 143 -168 71 -1313 95 -1223 57 -288 85 -86 115 -230 57 -100 71 -910 71 -792 57 -254 85 -2755 137 -1395 69 -3515 87 -2440 55 -1038 137 -72 73 -448 105 -142 83 -1408 105 -2444 105 -492 97 -918 169 -86 81 -1721 57 -482 55 -5453 113 -3386 71 -128 173 -956 51 -1106 53 -1028 143 -168 81 -300 73 -1383 79 -3180 51 -3667 51 -480 57 -2206 53 -532 135 -2097 75 -440 53 -1294 85 -116 113 -484 105 -1614 55 -1106 53 -2197 105 -2796 113 -1504 71 -1038 75 -3274 165 -1598 97 -338 73 -1071 57 -230 115 -2267 331 -1306 85 -648 85 -492 81 -1232 55 -3281 55 -376 97 -3073 83 -3046 143 -978 85 -803 75 -720 107 -988 95 -758 51 -1076 109 -1359 85 -2750 95 -1355 79 -230 71 -312 71 -144 143 -1520 55 -1126 75 -641 77 -632 57 -76 73 -122 119 -1056 95 -1748 51 -918 113 -1070 85 -642 75 -1402 55 -58 159 -482 109 -2875 115 -388 101 -698 55 -554 53 -898 71 -622 95 -472 75 -272 109 -336 189 -1702 123 -184 57 -1217 79 -682 83 -372 137 -430 113 -674 57 -661 75 -1102 81 -1438 115 -976 83 -898 137 -808 53 -2065 151 -3742 55 -3758 55 -414 55 -5521 141 -988 53 -446 131 -142 87 -614 77 -1107 113 -1110 51 -602 85 -1184 75 -654 53 -1724 97 -528 77 -630 85 -58 113 -538 115 -1078 53 -284 55 -576 165 -224 71 -1224 55 -342 55 -462 113 -426 85 -364 171 -1258 107 -837 143 -2620 115 -2844 53 -2348 75 -544 115 -288 85 -898 75 -414 81 -1014 101 -1062 77 -1408 81 -158 113 -908 131 -496 187 -979 51 -484 71 -530 191 -2927 109 -3701 57 -86 85 -1132 57 -892 85 -1671 75 -1040 79 -106 51 -946 71 +RAW_Data: -1552 129 -4484 225 -2645 133 -482 71 -1211 163 -136 143 -144 55 -404 115 -1574 141 -2378 53 -726 75 -102 125 -246 97 -797 53 -624 71 -421 71 -1338 77 -1094 73 -1504 103 -340 51 -256 51 -418 191 -804 55 -368 53 -1197 51 -1778 77 -1496 57 -278 105 -340 111 -2992 141 -1000 221 -1470 79 -2306 57 -1330 81 -3216 77 -282 71 -120 69 -1884 85 -578 55 -775 57 -576 57 -1634 109 -1098 133 -926 113 -1887 85 -58 169 -3933 51 -4166 57 -2099 53 -1490 143 -2902 53 -622 85 -776 75 -412 57 -483 55 -2698 51 -1354 95 -664 53 -1022 57 -1886 53 -3041 85 -1478 55 -2702 299 -312 77 -817 99 -1344 53 -1290 167 -1844 133 -746 103 -313 93 -470 167 -182 79 -892 167 -162 57 -174 55 -836 97 -1160 73 -1863 55 -404 115 -6023 95 -646 53 -2812 53 -864 55 -1194 133 -486 57 -1476 87 -342 101 -1442 119 -178 163 -698 51 -2886 71 -484 71 -378 35173 -52 51 -78 51 -156 77 -106 1092 -702 937 -730 937 -754 913 -754 901 -756 911 -756 911 -758 889 -784 883 -782 887 -780 883 -780 885 -780 885 -780 881 -806 859 -784 887 -782 881 -802 857 -808 859 -806 787 -760 983 -806 855 -802 853 -830 831 -834 829 -830 777 -880 839 -828 857 -806 859 -728 679 -80 161 -834 1073 -590 851 -378 53 -258 71 -818 847 -796 869 -808 861 -790 863 -812 867 -808 857 -812 835 -830 857 -806 859 -806 857 -812 837 -182 51 -606 841 -814 837 -830 833 -834 859 -808 857 -806 857 -806 859 -806 839 -832 859 -806 831 -832 857 -808 857 -808 855 -806 861 -810 863 -806 835 -832 831 -830 857 -808 857 -812 835 -836 831 -834 831 -832 829 -838 829 -832 831 -836 835 -832 831 -832 833 -832 859 -808 831 -834 833 -834 835 -832 833 -832 831 -834 831 -836 831 -832 835 -832 831 -834 831 -836 831 -832 857 -808 859 -808 833 -834 833 -832 831 -834 833 -832 859 -808 833 -836 831 -836 831 -832 831 -836 831 -834 831 -832 833 -834 833 -836 833 -832 833 -830 833 -832 833 -832 831 -832 835 -832 833 -834 857 -812 831 -830 833 -832 833 -834 833 -836 835 -832 829 -834 833 -832 831 -834 857 -808 857 -808 859 -808 833 -832 831 -834 859 -808 833 -834 831 -834 831 -832 859 -808 859 -806 833 -832 859 -808 859 -806 835 -834 831 -832 833 -832 833 -834 857 -808 857 -808 859 -808 857 -808 833 -832 859 -808 833 -836 831 -834 831 -832 833 -836 835 -832 831 -834 831 -834 833 -832 831 -834 857 -806 833 -832 859 -808 833 -832 857 -808 859 -808 831 -834 857 -808 861 +RAW_Data: -808 857 -808 831 -832 859 -806 859 -810 833 -834 857 -806 833 -834 859 -808 831 -834 833 -834 831 -834 831 -836 831 -832 859 -808 833 -832 831 -832 833 -834 857 -810 831 -832 859 -808 857 -808 833 -832 857 -808 859 -806 859 -808 859 -810 833 -832 833 -832 833 -834 831 -834 833 -832 833 -834 833 -832 831 -834 859 -808 857 -808 857 -808 857 -808 833 -834 833 -832 831 -834 857 -808 833 -834 833 -832 833 -832 833 -832 837 -832 833 -836 831 -832 831 -832 857 -810 831 -832 835 -834 857 -808 835 -836 831 -832 831 -836 833 -830 835 -830 835 -834 831 -832 831 -834 831 -834 831 -834 833 -834 857 -808 833 -832 833 -832 835 -834 831 -832 833 -832 859 -806 859 -808 831 -834 859 -806 859 -808 831 -834 859 -806 835 -834 831 -834 831 -832 833 -836 831 -834 833 -832 833 -836 831 -834 831 -832 859 -808 831 -834 857 -812 831 -832 833 -832 857 -808 831 -834 833 -834 857 -810 831 -832 859 -808 857 -808 833 -834 833 -832 833 -832 859 -808 831 -832 833 -834 857 -808 859 -806 859 -806 859 -808 833 -832 861 -808 857 -808 831 -834 833 -832 833 -834 831 -834 857 -808 859 -808 833 -832 831 -832 859 -806 859 -808 859 -808 833 -832 859 -808 857 -808 859 -808 833 -832 857 -808 833 -834 833 -832 833 -832 835 -832 833 -832 833 -832 859 -808 857 -808 859 -806 833 -832 859 -806 859 -808 859 -808 833 -832 857 -808 859 -808 857 -808 857 -808 861 -808 831 -832 833 -832 859 -808 857 -808 859 -806 833 -834 833 -832 859 -806 859 -808 857 -810 831 -832 859 -810 831 -834 857 -808 833 -832 831 -834 859 -806 859 -808 831 -834 859 -806 833 -834 835 -832 1665 -4178 1667 -1644 853 -830 1665 -830 3343 -830 829 -832 833 -2502 831 -1666 3333 -3340 831 -830 829 -834 2499 -832 1665 -2508 4175 -1638 1695 -802 853 -2502 829 -3332 831 -832 829 -832 2499 -832 1669 -2508 4177 -1642 1687 -830 827 -2500 829 -3336 829 -830 831 -832 2503 -834 1671 -2480 4195 -1642 1687 -830 829 -2504 829 -3332 831 -832 829 -832 2501 -832 1669 -2500 4173 -1668 1667 -830 833 -2500 829 -3314 855 -830 829 -832 2499 -832 1665 -2500 4173 -1666 1663 -832 831 -2498 831 -3346 829 -830 829 -832 2505 -832 1665 -2504 4167 -1664 1665 -830 831 -2508 9999 -826 2519 -802 853 -1664 829 -2500 1667 -832 831 -834 1665 -2502 3333 -3334 2503 -1644 2531 -806 853 -832 831 -830 829 -832 831 -832 831 -2504 831 -1666 1673 -830 831 -3340 831 -832 831 -2498 831 -2500 1669 -832 831 -832 835 -830 1671 -7504 1665 -1666 10007 -2472 855 -830 829 -1668 2497 +RAW_Data: -3342 829 -830 831 -832 2503 -830 1667 -2506 4169 -1666 1661 -832 831 -2502 831 -3336 829 -832 829 -832 2505 -830 1671 -2500 4167 -1666 1665 -832 831 -2502 831 -3332 831 -832 831 -834 2507 -834 1663 -2498 4171 -1668 1667 -830 829 -2506 831 -3316 853 -830 829 -832 2503 -830 1665 -2498 4173 -1668 1667 -832 829 -2502 829 -3316 855 -828 829 -836 2501 -832 1665 -2504 4155 -1666 1667 -828 853 -2480 855 -3306 853 -828 831 -832 2503 -830 1669 -2500 4165 -1666 1665 -832 831 -884 239 -84 57 -86 139 -595 115 -58 171 -488 171 -196 109 -560 233 -354 85 -628 83 -170 87 -172 57 -114 201 -936 83 -440 51 -140 257 -1331 73 -1130 143 -850 107 -84 55 -2862 301 -392 57 -3352 109 -518 113 -1454 71 -309 113 -400 55 -1551 81 -3980 51 -2334 77 -2336 81 -818 79 -1622 57 -545 111 -368 57 -2790 141 -230 113 -1418 109 -3084 57 -1836 191 -1407 71 -1556 85 -3456 119 -1138 53 -1830 51 -6980 95 -1186 73 -246 95 -1590 53 -112 55 -1262 85 -1164 53 -1229 190 -1226 71 -314 73 -1102 55 -154 51 -202 111 -2555 55 -1915 85 -1214 85 -174 85 -58 57 -2466 71 -70 55 -1752 95 -1326 237 -1038 165 -74 57 -678 51 -2062 85 -1532 143 -1898 55 -232 55 -1478 93 -1740 85 -196 143 -765 71 -96 71 -780 53 -1918 357 -1807 51 -1054 173 -1584 57 -2294 79 -790 53 -424 71 -1492 69 -3693 85 -710 143 -202 57 -1562 71 -168 71 -1020 147 -1276 85 -2227 97 -192 95 -2028 73 -216 71 -72 95 -230 79 -2310 57 -1124 85 -2510 71 -1798 105 -1173 111 -560 73 -1120 73 -342 71 -144 166 -1704 73 -72 95 -304 57 -3130 85 -9625 119 -2383 113 -486 83 -190 83 -2192 95 -1553 51 -1986 119 -202 135 -1096 81 -2311 201 -2079 97 -894 95 -1782 83 -820 83 -1465 55 -1138 85 -2786 143 -3226 204 -1358 71 -2544 53 -56 105 -934 115 -284 53 -80 71 -896 163 -736 73 -1538 105 -184 101 -686 53 -642 103 -1330 75 -3897 85 -556 51 -602 225 -1666 53 -1428 85 -1193 83 -298 97 -1507 109 -2383 79 -1805 77 -2877 119 -1233 137 -968 55 -1210 85 -196 153 -264 103 -1470 85 -3017 113 -218 73 -2133 57 -1948 109 -594 83 -2816 157 -539 55 -558 55 -112 81 -952 51 -272 57 -444 85 -570 83 -1175 53 -1760 57 -4421 53 -168 111 -232 55 -2752 53 -366 79 -1238 73 -1228 85 -2416 57 -3523 85 -1566 103 -820 113 -765 173 -1354 53 -2122 85 -346 57 -4443 79 -408 53 -290 95 -1484 75 -1052 73 -278 145 -454 77 -164 167 -430 81 -5196 115 -2725 53 -2715 83 -136 119 -457 79 -364 105 -728 175 -1528 57 +RAW_Data: -728 53 -176 163 -2120 71 -1394 71 -488 107 -1404 221 -422 95 -96 201 -356 71 -7701 85 -3729 77 -3237 95 -846 71 -888 51 -322 123 -784 79 -276 105 -1064 77 -652 85 -776 83 -664 77 -3171 107 -112 57 -1733 77 -898 85 -2118 57 -1423 81 -616 73 -2090 55 -2730 85 -6676 85 -317 85 -632 79 -526 101 -1637 192 -700 107 -314 55 -608 109 -388 217 -2209 85 -116 143 -1837 143 -4598 79 -1406 87 -972 71 -1750 85 -882 167 -1105 75 -5685 57 -672 55 -2931 113 -730 109 -196 87 -86 85 -1168 51 -1041 57 -404 71 -2115 155 -880 85 -719 51 -216 53 -660 113 -1412 73 -2408 97 -2971 57 -2495 170 -2786 87 -2076 55 -2939 53 -1032 111 -258 115 -500 81 -1947 113 -580 85 -1656 75 -1528 79 -324 143 -1110 79 -274 143 -796 53 -460 83 -1480 53 -1874 119 -192 97 -676 71 -1558 55 -3100 79 -1702 53 -618 57 -1091 71 -854 119 -1086 53 -2373 57 -1252 77 -136 87 -4334 133 -1292 85 -304 53 -556 71 -668 157 -1981 109 -792 77 -446 57 -226 77 -296 51 -202 101 -1104 81 -1782 99 -414 95 -1043 121 -2439 109 -1296 103 -3848 55 -116 85 -690 85 -1092 105 -1873 83 -966 75 -140 87 -944 53 -2992 81 -755 101 -376 79 -2732 113 -422 53 -964 51 -396 57 -7268 75 -314 95 -826 105 -1332 71 -460 195 -740 53 -434 51 -104 85 -2272 135 -1858 57 -172 201 -200 113 -4127 129 -176 69 -712 79 -6216 57 -2069 73 -1370 51 -3561 143 -1895 95 -566 51 -1440 95 -1062 57 -791 57 -116 85 -1240 107 -1216 57 -3492 105 -3270 57 -548 57 -250 97 -2722 79 -1640 115 -1928 57 -425 85 -1278 85 -698 53 -534 85 -685 85 -3646 141 -1378 57 -562 192 -400 111 -622 133 -208 51 -1396 111 -924 143 -1442 95 -1145 95 -72 81 -803 107 -112 55 -692 57 -2961 107 -1823 83 -3286 51 -372 97 -1180 71 -192 167 -96 95 -862 79 -1030 77 -394 176 -1455 55 -1594 53 -400 157 -334 57 -678 77 -522 217 -254 77 -315 137 -116 85 -172 57 -198 171 -378 71 -743 55 -860 79 -483 57 -230 201 -1650 71 -326 53 -2747 95 -576 165 -1854 57 -2763 57 -440 53 -348 57 -772 135 -198 55 -2280 51 -1903 85 -1666 143 -1120 55 -1507 75 -166 115 -248 87 -142 53 -2238 147 -332 53 -1842 55 -670 201 -1078 53 -112 57 -1012 167 -336 51 -522 51 -1330 115 -1824 55 -776 85 -806 139 -216 95 -1318 85 -548 85 -1647 83 -398 51 -1452 95 -1982 143 -1146 267 -2308 107 -656 57 -757 83 -742 77 -414 107 -312 77 -864 53 -112 85 -564 85 -2234 113 -5404 95 +RAW_Data: -1490 57 -374 83 -1644 115 -110 71 -478 71 -72 71 -1140 135 -2792 95 -2703 129 -168 85 -1668 133 -1521 53 -914 51 -4717 79 -1724 57 -172 115 -746 127 -394 83 -674 169 -564 71 -2250 119 -1603 51 -464 77 -2220 85 -566 55 -144 143 -116 115 -487 115 -282 129 -1690 111 -706 129 -1429 55 -223 113 -1228 53 -544 57 -114 57 -698 77 -2874 55 -232 113 -254 57 -1523 159 -72 101 -2285 51 -166 85 -315 57 -2125 53 -758 55 -478 107 -1725 53 -5851 83 -1616 101 -339 55 -230 109 -188 77 -652 51 -478 113 -3742 55 -230 57 -144 173 -754 143 -480 71 -2526 179 -4037 57 -1720 75 -432 133 -1464 165 -1268 215 -154 107 -398 87 -3083 85 -144 87 -512 71 -222 113 -487 85 -2428 81 -1648 119 -1226 95 -1213 103 -1275 57 -702 81 -1908 55 -542 55 -1838 109 -148 71 -1286 95 -3248 55 -639 71 -144 71 -598 119 -3930 171 -2344 55 -2623 87 -168 79 -2264 141 -1018 83 -344 115 -426 109 -518 85 -756 55 -2340 55 -1679 85 -200 85 -6170 51 -590 224 -1233 85 -260 107 -6039 57 -2192 113 -1496 109 -1146 55 -174 85 -848 75 -1242 111 -1068 85 -2111 81 -542 95 -1350 75 -144 95 -96 105 -362 105 -340 57 -864 115 -1568 73 -722 71 -2762 249 -382 113 -1979 75 -1233 143 -342 81 -3036 51 -226 87 -572 55 -282 57 -288 103 -3244 83 -242 99 -1748 55 -1206 172 -276 79 -2060 167 -904 123 -770 79 -1816 115 -202 113 -1526 137 -604 85 -2234 73 -300 113 -1504 95 -1114 55 -590 75 -410 103 -1314 83 -590 77 -3440 167 -3132 55 -224 75 -2107 57 -144 123 -842 155 -813 75 -602 71 -3652 141 -2380 57 -224 249 -164 189 -530 75 -493 51 -130 51 -126 95 -670 51 -340 81 -1084 97 -216 115 -1284 57 -1200 85 -310 55 -1002 71 -1455 79 -720 85 -1140 119 -288 95 -944 119 -554 53 -2450 73 -324 79 -836 105 -1087 73 -418 105 -528 139 -468 121 -582 167 -4205 71 -1858 183 -2318 143 -780 101 -98 187 -136 55 -2239 57 -434 103 -1946 113 -86 57 -428 53 -222 57 -86 143 -1036 107 -1232 77 -606 113 -1394 115 -86 57 -2204 75 -456 57 -1623 173 -2832 53 -2464 228 -609 141 -58 95 -847 77 -488 95 -734 51 -882 95 -4004 143 -1242 97 -322 77 -218 109 -2283 85 -116 85 -1281 55 -228 173 -820 77 -2298 71 -2057 115 -116 85 -760 143 -489 57 -2702 139 -1380 143 -583 143 -658 99 -918 141 -1033 55 -262 85 -1408 143 -1979 75 -872 57 -268 219 -594 107 -172 105 -222 71 -448 51 -806 101 -540 51 -108 115 -1558 147 -418 79 -206 71 +RAW_Data: -514 107 -1090 125 -928 77 -172 153 -382 71 -742 73 -1060 133 -3547 71 -992 85 -890 119 -72 81 -1154 145 -122 51 -198 57 -1288 173 -2424 83 -260 55 -278 105 -926 55 -274 75 -1555 57 -538 137 -2713 71 -1082 57 -1110 57 -670 83 -494 105 -1504 77 -750 81 -1226 57 -2030 79 -258 57 -140 101 -858 57 -400 55 -2286 55 -3390 55 -542 103 -404 181 -316 57 -174 85 -3657 51 -162 81 -735 105 -518 87 -2452 51 -252 165 -1942 73 -74 73 -1386 113 -3530 181 -1312 57 -1262 115 -314 133 -2418 57 -4028 71 -182 121 -747 83 -2793 167 -686 85 -1814 171 -1984 109 -1592 101 -1250 57 -346 113 -1370 99 -2761 53 -1930 51 -280 57 -1590 71 -1105 79 -702 143 -1216 235 -3208 57 -1998 77 -859 119 -608 51 -1084 143 -709 81 -1286 85 -144 265 -1274 53 -2068 75 -3092 77 -232 55 -144 57 -1836 57 -258 115 -1507 85 -2022 109 -1121 71 -893 93 -696 119 -951 57 -710 75 -844 95 -396 109 -1323 83 -1878 85 -272 51 -1108 179 -584 147 -196 71 -4320 57 -904 81 -776 55 -1857 55 -712 111 -54 81 -1338 121 -510 57 -698 85 -396 55 -1239 57 -892 75 -146 71 -358 71 -278 113 -2876 105 -671 85 -316 269 -1362 81 -342 57 -2932 55 -1391 111 -202 57 -576 55 -910 113 -318 57 -586 55 -719 143 -256 113 -2136 81 -802 71 -1190 95 -144 71 -2156 71 -730 55 -2380 87 -977 83 -172 95 -1322 57 -1160 71 -144 147 -1028 83 -898 53 -878 87 -114 115 -1296 75 -476 171 -1442 53 -1705 103 -2318 57 -3989 73 -414 73 -1012 51 -1492 55 -1992 87 -2711 83 -484 77 -760 105 -1338 53 -56 81 -590 57 -316 169 -4225 105 -1172 109 -744 115 -394 51 -4057 107 -531 87 -734 83 -1522 55 -1895 55 -2121 83 -1574 265 -1181 83 -2434 71 -1888 105 -734 167 -2886 57 -114 135 -2099 79 -854 71 -3982 51 -440 229 -654 57 -2316 57 -266 97 -536 75 -2106 53 -937 149 -2691 85 -838 57 -506 51 -108 57 -1044 85 -760 57 -2398 73 -2428 75 -1016 81 -138 85 -88 57 -1134 235 -1612 113 -2849 71 -1517 77 -434 127 -192 57 -1992 95 -232 107 -3254 53 -1442 57 -86 107 -1024 95 -854 53 -534 85 -2618 81 -2344 115 -2866 111 -998 71 -3113 53 -1341 55 -1216 103 -246 85 -3100 260 -450 85 -3023 55 -372 167 -86 57 -1094 51 -1499 85 -1252 57 -546 51 -2099 191 -172 85 -1829 71 -1259 97 -1506 85 -1928 143 -900 143 -858 115 -942 81 -2027 53 -1292 115 -1010 119 -852 55 -342 51 -80 81 -470 101 -636 55 -1046 85 -576 81 -976 79 -188 95 -947 81 +RAW_Data: -1480 55 -1430 55 -596 171 -1583 95 -884 51 -1116 121 -276 143 -2098 51 -1172 73 -1918 111 -112 51 -220 57 -230 163 -740 51 -1074 57 -1608 55 -3299 57 -2876 77 -1268 85 -771 79 -386 77 -1618 71 -1308 55 -863 121 -938 75 -110 83 -1176 187 -1807 57 -2894 55 -344 285 -994 55 -836 51 -963 85 -202 263 -686 55 -853 57 -144 115 -658 127 -955 57 -116 85 -944 111 -1891 57 -460 311 -1531 129 -146 121 -1301 71 -312 75 -600 77 -1760 71 -1264 85 -2345 51 -294 111 -772 51 -78 75 -292 71 -542 113 -690 85 -1164 79 -1368 57 -1284 53 -130 182 -240 53 -114 57 -287 143 -304 75 -754 169 -130 83 -54 85 -527 71 -1657 71 -462 383 -560 115 -638 131 -3943 285 -264 75 -168 85 -3999 83 -996 73 -644 71 -1205 71 -1108 85 -172 87 -1139 139 -518 167 -1278 123 -1125 75 diff --git a/assets/unit_tests/subghz/test_random_raw.sub b/assets/unit_tests/subghz/test_random_raw.sub index 928838d3c8f..11a413ff202 100644 --- a/assets/unit_tests/subghz/test_random_raw.sub +++ b/assets/unit_tests/subghz/test_random_raw.sub @@ -145,3 +145,31 @@ RAW_Data: -66 133 -66 97 -166 561 -100 895 -132 1323 -66 10873 -3752 99 -722 229 RAW_Data: -5434 65 -298 133 -132 131 -68 231 -200 661 -132 9517 -424 97 -1456 99 -1694 393 -100 131 -560 131 -196 197 -298 65 -428 229 -196 297 -266 131 -166 2435 -66 10161 -11230 65 -1320 131 -298 265 -532 231 -200 1291 -68 631 -66 12645 -4048 133 -66 67 -132 167 -266 163 -66 397 -132 197 -132 299 -98 197 -198 2903 -66 2361 -66 9627 -3588 197 -332 165 -68 331 -68 197 -132 99 -100 663 -66 363 -230 231 -166 131 -100 201 -298 163 -132 133 -202 363 -300 397 -102 263 -100 165 -66 1221 -66 1479 -132 165 -98 229 -12976 263 -66 363 -134 231 -66 629 -132 327 -100 97 -130 99 -164 227 -64 297 -132 397 -164 425 -198 97 -198 99 -66 365 -164 199 -102 97 -66 1817 -13524 231 -134 16907 -4086 233 -630 65 -396 201 -66 165 -198 67 -198 99 -664 2117 -166 12473 -446 2649 -440 2661 -420 2651 -422 2681 -418 2703 -400 365 -2724 387 -2696 2695 -414 357 -2704 2707 -386 389 -2700 2687 -392 405 -2706 2695 -402 363 -21268 2707 -388 377 -2706 2691 -404 2699 -382 2717 -382 2707 -378 2693 -416 2687 -396 363 -2736 355 -2748 2659 -416 365 -2708 2715 -388 377 -2708 2697 -404 363 -2730 2673 -420 355 -21268 2655 -460 319 -2766 2663 -448 2631 -436 2665 -418 2683 -410 2681 -416 2701 -386 383 -2700 375 -2744 2669 -416 353 -2730 2685 -416 357 -2708 2721 -380 369 -2724 2697 -382 385 -21260 2701 -418 353 -2720 2673 -418 2675 -408 2693 -384 2715 -386 2717 -386 2691 -404 363 -2732 387 -2702 2669 -412 359 -2736 2699 -380 381 -2728 2675 -416 381 -2720 2675 -414 347 -21280 2685 -390 377 -2724 2689 -416 2673 -408 2705 -382 2695 -410 2689 -414 2661 -418 385 -2704 369 -2704 2693 -416 375 -2726 2661 -420 355 -2728 2711 -388 375 -2702 2691 -410 363 -21252 2659 -488 287 -2794 2651 -448 2629 -436 2671 -416 2695 -416 2663 -406 2699 -384 383 -2730 367 -2702 2695 -418 385 -2702 2685 -412 349 -2744 2693 -366 389 -2714 2693 -394 381 -21266 2685 -418 363 -2730 2683 -382 2693 -418 2675 -410 2699 -384 2719 -382 2707 -380 359 -2734 387 -2704 2709 -380 361 -2732 2699 -418 357 -2728 2667 -416 383 -2696 2709 -380 391 -21228 2685 -458 307 -2800 2647 -412 2659 -432 2667 -416 2695 -416 2675 -406 2675 -416 383 -2700 361 -2730 2687 -414 375 -2696 2701 -420 353 -2720 2711 -382 367 -2728 2675 -416 385 -21222 2735 -386 355 -2744 2687 -396 2679 -418 2701 -386 2705 -382 2681 -410 2697 -384 385 -2736 365 -2704 2715 -384 377 -2696 2697 -416 349 -2722 2707 -386 379 -2732 2671 -410 361 -21258 2681 -464 297 -2796 2629 -456 2655 -420 2661 -448 2663 -404 2695 -382 2715 -380 371 -2740 355 -2744 2679 -384 391 -2728 2675 -388 379 RAW_Data: -2728 2695 -414 357 -2704 2705 -418 357 -21262 2673 -416 383 -2696 2709 -380 2703 -384 2699 -418 2671 -408 2695 -382 2713 -386 379 -2730 357 -2732 2695 -384 383 -2730 2679 -416 357 -2708 2701 -410 349 -2736 2697 -382 385 -21252 2669 -478 289 -2790 2647 -426 2651 -444 2653 -430 2659 -418 2695 -414 2681 -402 349 -2738 383 -2722 2677 -414 347 -2744 2691 -382 369 -2730 2691 -384 383 -2734 2679 -414 347 -21264 2705 -386 379 -2736 2667 -410 2695 -382 2715 -380 2709 -420 2665 -392 2713 -382 383 -2730 365 -2728 2665 -418 383 -2696 2693 -418 357 -2710 2711 -380 375 -2718 2701 -416 357 -21238 2677 -484 311 -2766 2635 -444 2657 -420 2663 -422 2695 -416 2667 -428 2675 -396 363 -73890 133 -98 131 -132 129 -658 99 -66 853 -100 63 -100 361 -98 1589 -66 1231 -132 65 -100 297 -198 65 -132 265 -66 9857 -4672 165 -1030 97 -1394 65 -200 2687 -68 6873 -8336 99 -1156 97 -66 163 -232 163 -262 197 -132 295 -132 263 -166 953 -100 263 -130 393 -164 295 -64 329 -66 393 -164 823 -130 165 -66 6133 -8436 165 -164 265 -266 65 -362 197 -696 3181 -132 363 -98 65 -166 131 -66 399 -132 663 -396 329 -66 7335 -7578 497 -230 627 -264 99 -366 99 -132 131 -134 265 -498 163 -100 1323 -66 265 -66 1129 -100 399 -132 365 -100 795 -68 397 -98 597 -364 297 -132 361 -132 265 -132 8591 -4740 65 -100 131 -166 199 -1088 97 -296 99 -528 131 -98 661 -66 401 -198 1157 -166 361 -164 495 -100 165 -66 297 -100 1423 -66 3067 -5658 67 -6406 197 -1092 65 -530 659 -68 265 -100 991 -68 231 -230 297 -66 327 -66 131 -132 659 -134 131 -100 1183 -132 263 -98 621 -66 2075 -6976 65 -5138 67 -132 129 -664 67 -132 165 -100 331 -466 231 -68 467 -98 563 -66 231 -100 531 -66 465 -66 1023 -166 297 -134 3409 -12290 67 -164 99 -532 133 -166 263 -66 231 -66 721 -64 131 -68 959 -134 495 -100 299 -98 497 -98 365 -100 397 -232 297 -98 531 -66 3029 -12216 265 -132 99 -364 199 -234 131 -66 431 -166 333 -166 397 -132 327 -100 395 -66 197 -132 395 -66 527 -98 295 -100 97 -98 789 -132 363 -132 297 -200 2815 -4914 65 -6620 65 -462 65 -134 297 -66 497 -264 231 -198 2773 -134 365 -100 831 -166 131 -100 297 -132 861 -132 299 -100 561 -66 1381 -6946 65 -5516 231 -266 97 -1362 1093 -68 1621 -134 165 -332 297 -98 361 -228 97 -132 797 -98 3487 -13224 229 -164 65 -132 913 -66 1123 -98 527 -134 929 -98 723 -100 12259 -270 165 -132 67 -132 165 -1326 99 -98 65 -1194 431 -66 695 -66 733 -134 197 RAW_Data: -134 10801 -166 67 -6130 133 -198 231 -334 365 -98 229 -132 165 -68 231 -166 14501 -524 65 -328 131 -498 129 -1288 65 -494 163 -64 165 -66 527 -132 131 -132 1019 -198 129 -166 393 -198 65 -164 6411 -66 3255 -10642 65 -1320 165 -164 493 -492 559 -264 2555 -66 695 -66 1657 -164 855 -66 4001 -10526 97 -596 133 -298 67 -264 65 -300 65 -100 263 -166 231 -134 99 -100 2703 -68 13643 -4922 297 -100 65 -232 133 -198 331 -300 231 -66 331 -100 12047 -3872 97 -196 65 -494 329 -66 65 -890 97 -98 229 -164 195 -596 797 -66 861 -132 65 -66 231 -100 565 -66 65 -66 1297 -132 265 -66 363 -134 265 -364 297 -164 299 -134 297 -134 495 -98 11309 -3790 131 -1380 65 -758 65 -164 129 -460 65 -360 199 -100 563 -68 497 -198 363 -266 263 -100 165 -66 697 -66 1933 -13594 65 -762 1223 -132 1119 -196 361 -134 131 -100 793 -166 695 -68 231 -68 463 -66 11727 -4204 363 -264 131 -132 133 -1124 97 -100 163 -100 327 -100 331 -198 397 -66 397 -100 395 -100 163 -66 197 -564 1059 -7962 65 -100 65 -198 129 -362 99 -394 197 -296 495 -100 1357 -68 459 -66 593 -66 265 -68 301 -132 465 -66 231 -200 397 -66 397 -232 199 -298 12077 -4350 231 -796 363 -198 133 -264 65 -1132 597 -332 3295 -100 755 -98 231 -164 97 -264 459 -166 759 -164 3265 -12138 99 -232 99 -1228 1025 -100 393 -66 531 -132 693 -132 1063 -66 427 -64 297 -294 229 -98 9723 -5404 67 -466 99 -796 267 -98 201 -100 167 -264 461 -98 1415 -66 861 -66 267 -66 331 -134 1663 -66 2089 -7012 65 -100 101 -4804 431 -728 99 -100 65 -100 995 -134 165 -66 929 -100 65 -66 927 -100 1093 -168 99 -100 497 -66 665 -200 6517 -8312 165 -66 129 -66 559 -166 99 -430 65 -398 67 -66 593 -198 459 -132 261 -132 263 -130 723 -66 459 -100 325 -166 67 -198 559 -66 493 -66 11475 -3896 99 -266 99 -66 197 -1092 129 -198 361 -166 163 -98 263 -196 759 -100 265 -100 365 -630 4635 -12748 65 -1712 461 -100 497 -66 395 -98 265 -98 229 -164 529 -132 297 -66 565 -132 987 -132 8665 -2820 2265 -450 313 -2774 2643 -442 325 -2772 2665 -416 359 -2734 2667 -386 379 -21274 2657 -474 293 -2810 2619 -466 2613 -476 2629 -452 2663 -388 2683 -418 2705 -400 365 -2722 387 -2700 2697 -380 361 -2732 2691 -418 361 -2732 2667 -416 383 -2698 2697 -416 357 -21238 2715 -384 383 -2732 2685 -416 2667 -416 2695 -398 2671 -418 2687 -390 2713 -382 383 -2730 365 -2728 2661 -416 379 -2716 2685 -384 379 -2720 2703 -378 401 -2718 2671 +RAW_Data: -3490 143 -230 115 -1140 55 -2348 79 -3316 287 -228 95 -344 561 -286 105 -1026 137 -1108 81 -1090 71 -2211 57 -1010 55 -1276 113 -346 85 -706 169 -628 57 -2928 129 -2574 109 -1400 57 -1444 87 -824 95 -240 53 -3650 55 -202 143 -528 229 -216 57 -144 113 -2682 55 -1422 57 -1619 57 -1332 111 -402 57 -968 57 -500 55 -3277 71 -856 79 -1009 77 -2136 53 -550 71 -986 85 -1403 55 -244 53 -763 85 -2413 173 -1410 51 -114 85 -594 77 -584 191 -1102 95 -7897 125 -1584 77 -442 73 -384 95 -1774 55 -2588 69 -264 55 -3624 95 -6776 51 -102 99 -344 143 -716 55 -174 57 -1440 143 -312 97 -312 143 -1891 85 -194 99 -1696 55 -1188 95 -192 69 -102 75 -2378 95 -646 119 -828 85 -1766 163 -1440 55 -82 111 -56 55 -567 83 -3209 81 -1140 115 -5439 105 -82 113 -1308 55 -6938 71 -122 73 -520 79 -490 73 -922 81 -1250 229 -374 83 -614 57 -458 81 -1300 131 -668 139 -116 55 -414 55 -2304 51 -2456 85 -922 109 -490 141 -58 55 -376 55 -998 191 -1294 57 -1693 159 -678 55 -416 57 -344 141 -4490 75 -122 167 -1774 143 -1152 101 -3062 57 -1351 85 -402 111 -814 83 -1321 97 -406 71 -384 121 -670 55 -1892 221 -2230 51 -1713 143 -1525 55 -340 107 -1332 57 -2671 55 -576 85 -202 57 -338 115 -768 79 -1112 71 -1070 51 -538 113 -488 109 -162 77 -980 57 -1915 87 -2141 95 -2272 171 -5042 53 -3974 55 -902 85 -274 81 -160 55 -58 57 -448 77 -1394 51 -316 119 -2322 115 -1996 51 -3265 85 -634 57 -2308 51 -250 137 -8089 57 -3623 77 -268 282 -782 225 -506 77 -280 57 -468 107 -2886 55 -1378 135 -760 75 -3226 53 -154 51 -86 143 -1810 141 -943 111 -503 113 -1226 83 -144 57 -876 253 -292 77 -832 113 -316 143 -580 57 -1121 81 -2010 201 -326 186 -508 167 -1156 167 -644 85 -895 53 -1525 71 -2115 55 -844 95 -168 167 -406 97 -168 119 -266 165 -2264 57 -4167 115 -2244 53 -2009 115 -3916 143 -598 143 -1500 243 -1302 197 -1161 75 -359 153 -1117 71 -1622 159 -222 71 -70 119 -2112 163 -2066 107 -1291 113 -5859 57 -3327 71 -688 197 -3065 171 -344 171 -200 143 -1398 55 -1143 77 -214 81 -2840 143 -2109 199 -1229 99 -1354 190 -1710 73 -254 81 -874 85 -54 135 -220 115 -2313 81 -964 159 -1802 131 -284 53 -786 71 -482 135 -114 115 -814 53 -3491 51 -378 143 -2783 113 -572 85 -288 105 -1975 53 -1412 223 -144 71 -616 83 -2279 57 -456 83 -1340 51 -1635 127 -472 57 -1694 57 -1264 55 -966 53 -1601 71 -2584 57 +RAW_Data: -1052 225 -162 83 -2002 57 -2246 75 -2092 119 -2672 101 -897 113 -116 85 -1560 75 -2231 51 -896 73 -146 95 -1028 107 -1309 101 -1154 103 -1168 201 -114 57 -1050 55 -742 81 -1238 113 -1196 53 -700 75 -5446 79 -1340 51 -106 53 -160 71 -144 97 -3165 69 -192 85 -1526 69 -1010 71 -516 143 -2207 57 -1529 85 -1710 57 -288 57 -514 57 -1056 147 -156 143 -114 77 -828 57 -676 95 -1076 71 -1620 53 -532 101 -2202 129 -2282 143 -432 85 -836 85 -3336 51 -220 71 -250 79 -936 81 -270 111 -1981 71 -1910 251 -392 139 -58 57 -687 151 -764 113 -1012 79 -258 85 -144 85 -995 83 -2472 55 -508 57 -2619 171 -334 51 -604 53 -3071 71 -200 51 -128 199 -460 113 -556 83 -2625 51 -1290 51 -438 95 -144 119 -262 73 -122 71 -1368 75 -634 253 -1314 95 -2198 53 -844 85 -288 114 -112 109 -86 143 -878 141 -1058 57 -86 57 -826 85 -172 171 -490 57 -2034 155 -430 103 -334 87 -344 53 -1494 169 -276 57 -340 51 -3721 77 -172 51 -1163 85 -644 75 -2714 99 -290 147 -150 51 -1722 55 -644 85 -2486 167 -558 85 -586 57 -2266 171 -852 53 -672 79 -1480 95 -2830 237 -268 111 -576 95 -240 73 -256 101 -200 93 -612 53 -2921 57 -608 51 -82 57 -894 71 -270 53 -1584 75 -868 85 -607 53 -874 151 -1701 55 -1616 85 -2660 57 -2182 71 -390 51 -1392 169 -1503 85 -144 55 -656 51 -156 97 -194 117 -781 71 -292 51 -1036 75 -973 55 -2634 81 -106 103 -1802 129 -406 71 -964 53 -1933 79 -1157 55 -174 57 -1697 75 -204 119 -5124 75 -556 57 -174 113 -1098 229 -116 57 -102 97 -378 57 -144 57 -562 107 -682 55 -1079 121 -1050 51 -560 201 -138 55 -84 113 -2505 71 -144 69 -1764 121 -312 97 -1140 111 -1344 107 -1406 71 -405 51 -1736 55 -1672 103 -100 38491 -672 989 -704 937 -730 935 -756 911 -754 885 -780 911 -754 883 -780 885 -808 857 -808 859 -806 861 -808 859 -806 859 -784 885 -782 883 -808 857 -806 859 -806 859 -806 861 -806 857 -808 857 -808 859 -806 857 -808 857 -808 857 -808 861 -808 859 -806 861 -806 859 -808 859 -806 857 -808 857 -806 859 -808 859 -806 833 -832 859 -808 833 -832 835 -832 833 -832 859 -808 831 -836 831 -834 833 -832 831 -832 833 -832 835 -836 831 -834 833 -832 857 -808 833 -832 833 -832 835 -832 835 -832 831 -832 857 -810 831 -832 859 -808 857 -808 835 -836 833 -832 831 -832 831 -834 833 -832 859 -808 835 -836 831 -832 833 -832 831 -834 833 -832 831 -834 857 -808 859 +RAW_Data: -808 831 -832 833 -832 859 -808 857 -810 831 -834 859 -806 833 -834 857 -806 833 -832 859 -806 859 -808 859 -810 833 -832 831 -834 859 -806 833 -834 857 -808 831 -834 833 -834 833 -832 833 -836 833 -834 829 -832 859 -806 859 -808 833 -832 859 -808 831 -834 857 -806 835 -832 833 -834 859 -806 857 -810 833 -832 857 -808 833 -834 831 -834 833 -834 831 -832 833 -834 857 -808 857 -808 833 -834 835 -834 833 -832 831 -834 857 -806 833 -832 835 -832 833 -834 833 -832 835 -834 831 -834 831 -834 831 -832 833 -832 833 -834 835 -834 831 -832 833 -832 833 -834 833 -832 833 -832 831 -834 857 -808 859 -808 831 -834 831 -834 859 -808 831 -834 857 -808 859 -806 859 -808 857 -810 857 -808 857 -808 835 -834 835 -832 831 -832 835 -832 835 -834 833 -832 831 -830 833 -832 857 -808 859 -808 833 -832 833 -832 833 -834 831 -834 859 -808 831 -834 833 -832 859 -810 833 -832 831 -832 859 -806 859 -808 833 -832 833 -834 833 -832 833 -832 833 -832 857 -808 859 -808 833 -832 857 -808 859 -810 857 -808 831 -832 835 -834 831 -834 833 -832 833 -832 833 -834 857 -808 859 -806 859 -808 835 -834 831 -836 833 -834 831 -834 831 -832 831 -832 831 -834 835 -832 857 -806 859 -806 835 -834 857 -808 857 -808 857 -808 859 -806 859 -808 835 -832 831 -832 859 -808 833 -832 833 -834 833 -832 835 -834 833 -832 833 -834 831 -832 833 -834 831 -832 835 -832 835 -832 831 -832 857 -808 859 -808 859 -806 859 -808 835 -832 833 -832 831 -834 857 -808 833 -832 833 -834 833 -832 833 -832 859 -808 831 -834 859 -806 835 -834 835 -832 831 -836 831 -832 831 -832 859 -806 835 -832 859 -808 831 -834 831 -834 857 -808 833 -832 835 -834 831 -832 859 -808 831 -834 859 -808 833 -832 857 -808 857 -810 833 -834 833 -832 831 -832 859 -808 831 -834 833 -832 859 -808 857 -808 833 -836 831 -834 831 -832 833 -832 859 -808 831 -832 837 -834 833 -832 833 -834 831 -832 831 -834 857 -808 833 -832 859 -808 831 -834 859 -806 833 -834 833 -836 831 -832 833 -832 833 -834 859 -808 831 -832 831 -834 859 -806 859 -808 857 -808 859 -806 833 -834 857 -808 859 -806 835 -832 859 -808 857 -808 857 -808 857 -808 857 -808 859 -808 859 -812 831 -832 831 -832 833 -834 833 -832 857 -808 833 -836 831 -832 857 -808 835 -836 833 -832 831 -832 831 -836 835 -832 831 -834 831 -836 831 -832 857 -808 833 -832 835 -834 831 -832 833 -832 835 -832 1665 -4168 1665 -1668 831 +RAW_Data: -834 1669 -832 3333 -832 833 -832 831 -2500 833 -1666 3347 -3332 829 -830 831 -830 2501 -834 1665 -2502 4171 -1664 1667 -830 831 -2498 831 -3332 831 -836 835 -832 2499 -830 1671 -2510 4155 -1664 1687 -802 853 -2498 829 -3318 857 -828 829 -830 2503 -834 1667 -2502 4163 -1664 1665 -832 829 -2500 857 -3308 831 -836 835 -832 2497 -834 1667 -2504 4171 -1664 1663 -830 833 -2502 13329 -826 851 -3328 825 -826 853 -828 833 -2500 1669 -830 2503 -832 829 -2500 829 -830 1665 -1668 1665 -1668 829 -832 833 -4160 4175 -1668 1665 -1666 853 -4970 853 -1664 5847 -1634 2521 -828 1663 -832 831 -3334 829 -832 831 -836 2499 -832 1671 -2484 4193 -1638 1689 -832 829 -2500 829 -3338 829 -832 833 -832 2499 -832 1669 -2502 4173 -1664 1663 -832 829 -2508 833 -3332 831 -832 831 -832 2505 -832 1665 -2502 4163 -1664 1669 -830 831 -2502 833 -3340 827 -832 829 -834 2503 -832 1665 -2500 4177 -1662 1665 -830 831 -2482 857 -3312 857 -830 829 -830 2501 -834 1663 -2504 4173 -1638 1687 -832 831 -2502 829 -3332 833 -830 831 -832 2505 -832 1663 -2508 4167 -1664 1669 -832 833 -2502 831 -3334 829 -830 829 -832 2501 -832 1667 -2504 4169 -1670 1663 -832 831 -2500 831 -3332 833 -832 831 -832 2497 -834 1663 -2500 4175 -1664 1665 -832 831 -2508 829 -3338 831 -832 831 -830 2501 -832 1665 -2502 4165 -1666 1667 -832 831 -780 53 -1368 57 -86 143 -200 57 -374 57 -130 165 -374 85 -808 85 -196 127 -1010 51 -138 85 -58 77 -174 85 -228 113 -716 95 -520 71 -2831 53 -618 53 -188 83 -82 111 -114 55 -5464 71 -966 95 -1168 71 -824 71 -480 97 -72 101 -612 55 -3330 73 -1995 85 -832 53 -1016 57 -1462 71 -256 75 -776 143 -2066 77 -1748 71 -4832 81 -602 55 -3866 131 -1824 57 -1836 113 -1234 85 -836 73 -560 253 -1606 143 -286 351 -1008 87 -528 107 -1357 256 -1538 233 -1018 71 -264 77 -304 71 -1832 57 -144 85 -858 83 -511 131 -1220 107 -1318 85 -1782 81 -72 73 -7838 51 -696 55 -3805 125 -930 103 -292 95 -382 115 -3256 85 -859 57 -787 220 -1207 143 -2068 143 -2322 97 -548 53 -386 57 -130 51 -1673 57 -3004 71 -783 71 -1560 99 -102 51 -1068 81 -348 83 -2003 51 -2860 77 -2680 57 -4432 81 -936 95 -400 73 -583 71 -2842 97 -1656 81 -146 73 -286 105 -714 141 -2236 53 -1503 81 -200 85 -836 71 -356 109 -1310 75 -616 57 -690 87 -566 79 -727 73 -1604 97 -1438 57 -2641 77 -1650 217 -873 71 -890 109 -2042 163 -3562 107 -3098 111 -904 79 -238 51 -2699 71 -736 53 -488 233 -400 103 -340 81 -2933 53 -1508 51 -1886 53 -388 125 -3336 143 +RAW_Data: -390 99 -1386 71 -1092 97 -1150 51 -506 111 -2575 87 -114 143 -662 57 -644 53 -550 119 -274 85 -1267 55 -1278 71 -1622 117 -2082 77 -1316 73 -1882 55 -1575 71 -424 85 -1031 133 -2367 85 -542 115 -166 113 -2671 149 -256 113 -260 83 -1966 141 -430 71 -1844 127 -4269 57 -840 111 -1598 85 -3530 55 -2263 57 -1302 57 -346 85 -516 83 -2989 51 -334 83 -1811 85 -230 57 -836 55 -678 55 -7081 55 -288 115 -2062 55 -300 189 -738 57 -814 119 -1438 53 -2077 115 -631 145 -206 57 -645 79 -4121 115 -490 53 -186 71 -144 69 -2537 105 -932 53 -1136 55 -3124 57 -1873 125 -4551 77 -3337 57 -1122 57 -622 103 -2437 51 -120 71 -3629 129 -2139 77 -104 99 -1057 95 -416 71 -72 95 -312 95 -1052 115 -342 111 -2452 71 -746 221 -1418 57 -3125 119 -724 55 -950 57 -618 57 -259 107 -210 95 -1046 71 -454 71 -1651 71 -442 71 -312 79 -1169 55 -202 85 -632 57 -144 115 -412 69 -304 85 -2125 53 -998 125 -200 105 -1126 115 -1116 71 -604 85 -174 171 -260 171 -308 71 -120 95 -354 53 -1461 69 -863 121 -1696 55 -3336 79 -2306 83 -754 97 -160 171 -1612 139 -417 79 -2792 73 -498 85 -2112 57 -1370 57 -460 85 -482 55 -1946 113 -682 101 -136 85 -574 77 -838 53 -657 71 -3562 71 -588 97 -252 71 -366 57 -658 85 -1378 53 -168 85 -2896 167 -1412 87 -1684 53 -2008 97 -1861 83 -1251 71 -678 95 -192 71 -930 81 -1380 51 -572 81 -2795 105 -122 95 -1038 85 -1116 117 -1799 129 -356 83 -712 133 -1584 119 -1892 81 -672 143 -116 85 -996 57 -501 57 -450 85 -216 57 -2182 57 -1100 73 -456 85 -260 85 -144 167 -300 57 -202 55 -448 81 -764 143 -1707 79 -3204 53 -108 53 -54 190 -682 87 -1070 53 -1230 55 -112 87 -1014 141 -1659 57 -230 115 -230 57 -750 55 -686 57 -216 87 -4642 51 -4416 95 -2575 111 -1607 53 -368 107 -4757 51 -521 75 -1682 255 -2346 115 -1762 83 -3457 71 -1470 77 -246 157 -1678 55 -418 99 -922 113 -218 123 -260 55 -1384 105 -240 53 -848 53 -1810 79 -648 77 -664 85 -298 109 -86 55 -552 55 -260 57 -913 115 -504 77 -537 53 -3159 105 -3371 51 -138 53 -2668 71 -368 51 -674 55 -280 51 -1048 51 -963 85 -1000 57 -954 113 -1190 53 -1456 57 -200 115 -172 57 -864 57 -288 85 -442 127 -72 145 -584 71 -2799 143 -324 95 -120 121 -1873 51 -658 57 -1285 57 -1516 330 -172 143 -316 87 -200 115 -700 197 -4960 57 -1358 53 -2324 55 -2864 179 -1799 73 -3669 57 -316 85 +RAW_Data: -935 57 -864 115 -740 79 -220 87 -400 81 -1238 242 -1720 169 -176 125 -2132 57 -1227 119 -2810 107 -420 95 -192 75 -74 107 -3191 171 -914 81 -2426 57 -860 157 -618 115 -1462 107 -146 51 -1007 115 -1080 71 -803 75 -1619 55 -1492 57 -1171 53 -1050 57 -538 113 -2006 85 -2537 83 -1490 55 -598 109 -670 139 -166 55 -154 71 -1215 85 -1630 167 -390 127 -840 115 -288 57 -614 97 -397 71 -494 55 -74 73 -74 71 -806 71 -78 247 -656 105 -1176 73 -144 95 -1100 191 -190 135 -114 87 -1290 119 -506 191 -860 115 -3636 141 -6062 83 -2120 55 -392 77 -2020 55 -1316 51 -424 183 -448 225 -474 97 -1068 75 -294 81 -1090 85 -196 57 -2221 113 -458 115 -3219 141 -2086 85 -374 87 -834 105 -470 51 -1338 53 -1401 85 -604 142 -170 109 -848 55 -200 53 -1480 77 -326 51 -9597 57 -341 107 -959 57 -272 51 -4922 75 -78 195 -249 53 -1368 53 -236 127 -3235 105 -174 113 -2854 55 -1140 85 -374 55 -2335 57 -1164 55 -314 55 -368 51 -2454 57 -5231 55 -1868 103 -868 93 -498 71 -2701 119 -851 85 -810 131 -1466 111 -714 57 -1588 113 -846 53 -2596 105 -200 87 -772 75 -128 75 -1739 191 -4925 79 -144 139 -208 71 -348 79 -538 131 -880 143 -1048 155 -1850 109 -170 57 -1014 133 -906 85 -774 57 -1400 103 -1881 53 -2970 147 -554 95 -178 107 -622 85 -674 113 -1442 55 -3090 127 -488 51 -164 85 -4087 113 -1427 77 -6221 57 -3815 81 -488 109 -992 57 -1423 71 -434 51 -2449 95 -542 57 -594 53 -1282 133 -5219 71 -1574 87 -1658 53 -198 85 -628 105 -120 129 -804 137 -5041 171 -1264 125 -1245 129 -168 97 -146 71 -1196 55 -1194 57 -58 137 -86 85 -1885 101 -328 51 -5524 143 -2082 85 -2325 85 -1225 109 -784 55 -200 55 -562 55 -1644 77 -598 85 -1495 51 -882 161 -2568 105 +RAW_Data: -1288 57 -2688 205 -698 57 -434 51 -632 225 -188 109 -1032 129 -636 285 -1055 77 -204 95 -240 79 -462 169 -2442 57 -202 85 -478 57 -1511 55 -114 113 -444 169 -216 79 -124 73 -1030 141 -418 143 -3631 55 -836 129 -506 79 -954 139 -1470 85 -536 139 -416 53 -944 111 -1544 73 -562 55 -3102 71 -2248 85 -836 57 -3044 77 -562 53 -52 75 -480 53 -1200 71 -216 95 -974 71 -2312 83 -1609 51 -848 55 -174 143 -826 107 -4127 57 -1667 57 -498 77 -1660 55 -751 149 -152 193 -1474 99 -608 115 -2312 57 -1586 85 -144 57 -3152 105 -1225 71 -1321 75 -1732 57 -506 189 -1177 71 -1548 87 -1396 109 -3225 55 -1102 223 -114 85 -2537 143 -58 55 -1511 53 -780 57 -2098 71 -96 71 -1180 95 -144 97 -2283 55 -3182 143 -238 55 -2374 57 -792 55 -2931 75 -2015 119 -860 51 -358 173 -1256 165 -3319 141 -316 53 -1390 161 -4297 141 -3288 81 -977 57 -4351 57 -2804 71 -170 141 -2466 167 -1854 57 -260 113 -3224 83 -342 85 -58 79 -486 85 -446 87 -446 55 -1745 55 -366 51 -82 167 -1927 157 -2892 85 -86 85 -1712 83 -4854 83 -1790 109 -104 163 -784 101 -604 119 -888 159 -3756 143 -936 53 -2312 53 -1625 99 -3039 71 -1648 103 -520 57 -1024 57 -1404 57 -690 135 -410 57 -1228 201 -1932 77 -130 51 -688 101 -346 51 -198 87 -568 113 -828 87 -674 53 -684 87 -230 113 -670 143 -250 283 -488 97 -470 103 -122 79 -224 103 -386 71 -1160 55 -276 109 -1046 145 -2978 73 -1230 75 -8593 55 -298 87 -1980 55 -1970 139 -974 143 -446 57 -338 77 -1094 95 -840 77 -1066 55 -485 171 -292 95 -1434 152 -116 113 -658 55 -144 57 -836 85 -144 57 -86 53 -448 75 -2054 95 -240 71 -1638 53 -1000 53 -196 195 -2026 71 -939 51 -930 71 -799 57 -820 51 -968 57 -704 53 -356 173 -3870 57 -368 217 -574 69 -192 103 -764 95 -2853 55 -2042 103 -218 53 -260 69 -1754 97 -356 301 -116 55 -2265 87 -1452 95 -118 71 -1226 143 -638 51 -1195 115 -468 75 -1784 101 -152 51 -1222 71 -1619 113 -508 133 -1168 53 -394 71 -806 85 -600 85 -974 161 -386 73 -370 77 -3390 171 -276 77 -1595 95 -220 171 -3647 53 -772 55 -462 57 -832 71 -2348 119 -1478 51 -80 85 -909 79 -338 71 -2833 99 -274 77 -554 125 -1822 53 -108 83 -371 85 -172 57 -478 75 -1424 53 -680 55 -288 73 -1290 109 -3129 131 -958 131 -898 53 -1836 87 -418 53 -2138 119 -1003 101 -270 115 -1194 79 -2138 115 -2351 55 -1511 115 -1697 105 -1278 115 -198 183 +RAW_Data: -1450 57 -330 51 -894 57 -1926 55 -1552 83 -624 81 -3174 75 -270 107 -1111 85 -686 103 -4595 119 -96 286 -1021 71 -850 143 -606 85 -2639 81 -192 77 -1574 81 -468 55 -2484 137 -476 55 -314 85 -1139 53 -1418 79 -2247 111 -874 77 -120 71 -2082 99 -644 107 -288 115 -344 163 -5007 53 -102 121 -876 87 -244 115 -390 57 -144 85 -856 109 -510 103 -506 73 -3754 79 -2838 165 -1569 139 -2268 75 -2086 121 -2102 170 -634 71 -1294 191 -3428 75 -1719 99 -3194 75 -1630 71 -866 51 -644 171 -1416 97 -1687 57 -634 85 -96 71 -366 85 -745 53 -1418 57 -494 85 -1072 73 -122 73 -178 81 -2848 103 -1186 95 -286 71 -144 51 -1366 256 -1440 85 -1184 211 -2798 83 -140 57 -1516 55 -980 85 -86 141 -1316 55 -758 57 -3040 79 -928 99 -4315 181 -492 103 -400 73 -2040 81 -416 75 -388 171 -4212 53 -2250 85 -144 57 -144 85 -821 167 -192 117 -312 71 -3722 51 -248 83 -588 115 -2378 79 -594 79 -364 97 -408 167 -1382 53 -392 109 -1418 83 -2868 127 -120 71 -2244 71 -287 121 -672 85 -764 53 -260 57 -428 53 -1385 57 -3200 57 -3074 83 -114 55 -2185 77 -252 83 -1130 57 -1965 75 -2128 85 -3293 51 -1258 73 -934 97 -832 73 -432 95 -968 75 -692 93 -888 53 -560 77 -484 77 -954 81 -3098 85 -116 85 -506 85 -1618 141 -442 55 -938 73 -478 123 -944 215 -5486 57 -1530 77 -526 57 -1064 77 -342 83 -1814 75 -3042 85 -2245 85 -1223 79 -2229 83 -1538 71 -4608 103 -316 85 -58 185 -1588 71 -3626 85 -2112 253 -1060 57 -562 183 -3805 206 -674 71 -705 71 -2820 105 -468 95 -3669 213 -877 73 -118 121 -204 135 -2468 113 -232 85 -4493 57 -945 55 -672 113 -652 113 -734 53 -424 83 -510 83 -3710 83 -683 97 -2373 85 -2361 259 -995 51 -452 115 -486 81 -5736 57 -1278 51 -4423 111 -1306 163 -248 95 -844 57 -1317 115 -2350 75 -366 99 -1458 57 -444 57 -3824 87 -54 83 -388 249 -2503 101 -192 95 -910 135 -386 105 -2702 85 -1208 85 -250 85 -200 141 -1450 75 -485 57 -662 85 -3323 107 -622 36813 -362 51 -259 963 -732 937 -728 935 -756 909 -756 883 -780 885 -780 883 -784 883 -806 859 -782 883 -808 863 -806 859 -806 857 -808 857 -806 859 -808 857 -808 861 -808 857 -806 861 -806 859 -808 857 -806 861 -808 859 -808 833 -832 833 -834 831 -832 859 -806 857 -806 859 -808 859 -810 857 -806 859 -806 861 -808 833 -832 833 -832 831 -832 833 -834 857 -808 833 -834 831 -834 835 -834 833 -832 833 -832 831 +RAW_Data: -832 833 -834 857 -806 859 -808 857 -812 833 -834 857 -806 833 -832 833 -832 857 -808 835 -834 831 -834 831 -834 835 -834 831 -832 835 -832 831 -836 831 -832 857 -810 833 -832 831 -834 831 -834 857 -808 831 -836 833 -832 831 -834 831 -834 833 -834 831 -834 857 -808 859 -806 859 -810 831 -834 857 -808 857 -808 859 -810 831 -832 833 -832 833 -832 833 -832 859 -808 833 -832 857 -808 833 -832 859 -806 859 -808 833 -834 859 -808 831 -834 835 -832 833 -832 831 -834 857 -806 859 -808 859 -808 857 -810 831 -836 833 -832 831 -832 833 -832 857 -808 859 -806 835 -834 831 -834 835 -832 857 -808 833 -834 831 -832 833 -834 833 -834 833 -832 831 -834 833 -834 835 -830 833 -832 831 -834 833 -832 833 -832 859 -808 857 -808 833 -834 833 -832 833 -834 831 -834 857 -808 835 -832 831 -834 857 -808 857 -808 835 -834 831 -834 831 -834 833 -836 831 -832 833 -834 831 -834 831 -834 833 -834 835 -832 831 -832 833 -832 857 -810 833 -834 833 -836 829 -832 831 -832 835 -834 831 -832 835 -834 831 -834 833 -832 833 -832 831 -832 835 -832 833 -832 833 -832 833 -834 857 -808 859 -808 833 -834 833 -832 833 -834 831 -834 831 -832 835 -834 831 -832 833 -832 859 -810 831 -832 833 -834 857 -808 833 -832 833 -832 833 -832 833 -834 859 -806 859 -810 831 -834 831 -832 859 -806 835 -836 831 -832 831 -832 859 -808 833 -832 859 -808 857 -808 835 -832 831 -834 833 -834 831 -834 833 -832 857 -810 833 -832 833 -832 859 -808 831 -832 859 -808 831 -832 859 -808 859 -806 859 -806 859 -810 833 -834 835 -832 833 -832 831 -832 857 -808 857 -808 859 -806 835 -834 831 -836 835 -834 831 -832 831 -832 859 -808 831 -836 833 -834 833 -832 833 -832 831 -832 859 -806 835 -836 833 -832 831 -834 831 -836 831 -834 833 -832 835 -834 833 -834 831 -832 831 -832 835 -834 833 -832 831 -832 833 -834 831 -834 831 -832 857 -808 857 -808 833 -834 835 -832 831 -834 831 -834 857 -808 859 -808 833 -832 831 -834 833 -832 859 -808 857 -808 835 -832 835 -832 831 -832 835 -834 831 -834 831 -834 833 -834 831 -832 833 -832 833 -832 835 -834 831 -834 831 -832 835 -832 831 -834 859 -806 859 -808 859 -806 837 -832 831 -832 833 -834 857 -808 833 -832 859 -808 857 -808 831 -834 835 -832 833 -832 857 -808 833 -832 861 -810 831 -832 831 -834 857 -810 831 -834 831 -832 859 -808 833 -832 857 -808 859 -806 835 -834 831 -834 833 -832 859 -806 859 -808 857 +RAW_Data: -808 835 -832 831 -834 857 -808 857 -808 859 -808 859 -808 831 -832 833 -834 831 -836 833 -832 831 -832 859 -808 833 -834 833 -832 859 -806 859 -808 857 -808 833 -834 833 -832 831 -834 833 -834 857 -808 831 -832 859 -808 859 -806 835 -832 1665 -4178 1667 -1662 833 -832 1663 -832 3335 -832 835 -832 831 -2500 831 -1666 3339 -3338 829 -830 831 -832 2499 -832 1665 -2500 4173 -1664 1665 -832 831 -2500 833 -3344 831 -830 833 -830 2499 -832 1669 -2506 4177 -1640 1693 -802 853 -2476 853 -3332 831 -830 831 -830 2501 -836 1665 -2506 4169 -1664 1663 -832 829 -2506 831 -3338 827 -832 831 -830 2505 -830 1665 -2504 4167 -1664 1665 -832 831 -2498 13331 -828 853 -830 4165 -4166 1663 -2506 3333 -830 1665 -1664 1663 -1668 831 -832 1665 -3336 831 -1668 831 -832 831 -832 2499 -3342 829 -832 829 -834 2501 -832 1667 -2502 4169 -1672 1663 -830 831 -2502 829 -3338 829 -834 831 -832 2497 -832 1667 -2500 4169 -1666 1663 -836 831 -2500 831 -3342 833 -832 829 -832 2497 -832 1667 -2510 4179 -1638 1689 -804 855 -2476 855 -3330 831 -830 831 -832 2499 -832 1669 -2506 4173 -1662 1663 -832 829 -2504 831 -3336 829 -832 831 -834 2497 -832 1665 -2500 4177 -1668 1663 -832 831 -2504 829 -3336 829 -832 829 -832 2499 -832 1667 -2500 4169 -1668 1667 -834 831 -2500 833 -3338 827 -832 831 -832 2499 -832 1671 -2508 4169 -1662 1663 -830 829 -2500 831 -3332 833 -832 833 -834 2499 -834 1669 -2500 4167 -1664 1671 -832 829 -2500 831 -3334 829 -836 831 -832 2499 -834 1665 -2500 4185 -1642 1689 -828 831 -2500 829 -3334 831 -834 831 -830 2507 -830 1665 -2500 4167 -1668 1665 -830 831 -778 77 -502 75 -427 224 -242 167 -1264 57 -334 105 -5932 115 -2566 79 -514 55 -459 57 -1564 75 -296 95 -4925 111 -202 85 -3492 99 -4327 55 -582 57 -1520 197 -708 53 -1666 53 -1005 85 -3861 139 -858 73 -276 147 -1406 113 -5864 95 -1253 93 -2699 85 -575 93 -3012 57 -774 71 -1662 55 -926 77 -138 55 -744 97 -6232 79 -1435 109 -799 73 -1018 95 -982 79 -664 85 -192 171 -202 57 -198 83 -832 117 -96 53 -734 119 -780 79 -1394 197 -488 55 -371 83 -144 85 -1816 145 -2451 57 -114 115 -1158 69 -168 71 -868 87 -3907 51 -2788 123 -1454 55 -492 53 -510 85 -144 57 -857 53 -1214 85 -140 51 -899 103 -1318 55 -2793 73 -142 71 -1067 109 -5247 55 -172 113 -341 85 -2553 57 -682 217 -170 77 -1216 161 -1844 53 -2747 87 -538 111 -843 53 -1197 109 -2973 53 -1314 111 -514 95 -864 81 -1671 53 -1812 57 -1419 71 -636 83 -3998 75 -1285 135 -578 51 -2754 179 -1194 71 -7260 51 +RAW_Data: -1003 75 -1988 57 -764 57 -5820 85 -474 69 -655 81 -136 103 -1594 53 -1120 51 -520 101 -487 159 -5829 77 -784 103 -440 139 -432 57 -786 79 -506 95 -1982 53 -3728 71 -2506 77 -983 57 -922 135 -3584 57 -1088 57 -142 115 -424 55 -1435 103 -954 113 -286 99 -948 79 -417 133 -398 85 -260 143 -3084 55 -940 195 -758 71 -288 71 -216 95 -1490 77 -1902 85 -3592 53 -796 55 -1351 53 -1538 55 -778 75 -5106 85 -144 57 -1104 95 -452 51 -3006 83 -316 85 -3131 69 -1243 53 -2591 73 -192 71 -462 71 -2566 81 -706 85 -446 51 -1226 81 -656 57 -622 55 -1302 115 -428 55 -1165 171 -1767 111 -1888 85 -1362 55 -562 79 -698 71 -100 191 -192 57 -150 73 -342 97 -342 71 -534 125 -1558 81 -348 77 -232 55 -434 81 -2934 55 -2374 392 -774 53 -3880 71 -4408 105 -230 55 -888 57 -1014 133 -1074 51 -440 173 -314 111 -2931 105 -2165 53 -1654 51 -5547 109 -1688 163 -398 103 -1727 51 -958 139 -1370 87 -144 85 -316 143 -3860 51 -682 163 -2472 107 -1116 125 -896 51 -366 73 -1198 75 -647 143 -2628 53 -1663 85 -984 103 -882 115 -960 71 -2405 81 -1010 53 -510 79 -3410 135 -2502 139 -1552 53 -2004 55 -628 115 -404 55 -570 113 -688 113 -1817 131 -1240 51 -414 135 -538 109 -1233 201 -214 57 -274 73 -1428 85 -434 57 -2570 53 -340 57 -2775 51 -2914 71 -828 79 -740 57 -3780 137 -386 75 -1304 57 -641 53 -668 85 -480 53 -284 85 -764 85 -358 53 -6176 127 -442 95 -192 95 -2628 109 -722 83 -1068 95 -144 145 -404 57 -1762 51 -2612 171 -230 87 -632 171 -146 55 -196 79 -324 51 -224 57 -1318 81 -1345 85 -136 53 -410 83 -80 81 -930 143 -172 57 -2253 53 -216 71 -282 79 -788 212 -706 87 -3134 71 -498 87 -2968 77 -1186 83 -1189 57 -656 83 -424 53 -1410 71 -1554 55 -1004 55 -2736 83 -3182 83 -318 69 -456 95 -926 85 -1232 51 -138 55 -2078 111 -708 142 -268 79 -4582 53 -1152 55 -160 95 -144 161 -330 71 -2236 133 -324 51 -1134 119 -144 139 -718 85 -272 75 -694 55 -318 57 -1710 75 -330 55 -202 115 -1642 163 -56 113 -256 85 -398 73 -1378 95 -94 71 -168 71 -1748 111 -744 85 -2261 73 -336 85 -4614 57 -2696 79 -54 277 -2278 85 -716 71 -2765 85 -1852 77 -622 95 -913 157 -1542 105 -284 57 -3042 77 -1418 85 -900 51 -658 83 -1122 115 -452 81 -100 75 -1400 57 -700 105 -380 99 -332 55 -573 75 -2416 75 -294 107 -316 161 -957 113 -730 51 -998 71 -384 53 -488 209 +RAW_Data: -222 57 -364 53 -1099 57 -570 301 -4112 71 -2730 53 -917 85 -519 85 -1030 55 -2335 85 -374 143 -791 169 -786 57 -998 85 -404 85 -323 81 -1443 55 -1861 199 -88 85 -1991 57 -6675 95 -811 131 -1474 85 -202 229 -1528 85 -912 87 -1233 53 -484 123 -1245 53 -2714 83 -1715 51 -2626 77 -1429 57 -2401 85 -420 51 -669 55 -986 143 -1509 95 -1362 71 -530 79 -762 51 -1226 95 -5703 143 -138 71 -738 83 -912 55 -1582 55 -1200 55 -1106 55 -1289 95 -558 95 -206 143 -2372 109 -748 51 -1584 57 -172 115 -662 135 -156 207 -1464 55 -1732 125 -218 135 -2488 57 -312 55 -2344 79 -412 85 -610 53 -170 55 -1890 57 -3146 57 -924 167 -1127 145 -1284 51 -436 55 -458 115 -340 179 -640 121 -1297 184 -1106 55 -716 113 -2115 71 -240 95 -120 53 -190 57 -266 125 -158 57 -1042 203 -3645 101 -196 101 -138 85 -912 159 -2064 85 -536 83 -3063 55 -170 85 -510 53 -1224 81 -128 51 -1143 101 -4358 95 -947 53 -1402 85 -1894 51 -160 81 -3344 250 -718 103 -184 185 -280 51 -372 113 -820 57 -1154 105 -100 75 -462 71 -1681 53 -1395 79 -670 121 -2820 57 -1014 79 -1628 87 -498 57 -288 143 -740 57 -584 77 -676 85 -1106 57 -2601 103 -1062 83 -3676 75 -1387 171 -138 53 -164 83 -746 57 -316 172 -144 57 -1987 99 -1416 143 -2058 85 -1872 57 -1538 171 -1630 171 -2542 137 -1102 117 -1824 135 -292 163 -462 125 -1226 57 -622 57 -345 85 -1499 53 -910 53 -3758 77 -960 143 -216 167 -912 53 -160 75 -354 57 -831 71 -168 73 -1026 81 -1778 85 -250 51 -1472 57 -466 51 -916 119 -992 73 -980 55 -1039 139 -424 57 -1118 141 -534 85 -486 85 -906 119 -144 71 -1481 109 -1822 79 -2745 57 -3291 137 -2190 95 -1865 133 -1580 55 -628 57 -1683 87 -350 55 -1363 115 -220 87 -56 113 -1068 85 -1642 71 -1727 57 -1398 95 -2382 79 -416 53 -2231 57 -86 143 -984 77 -809 95 -2508 73 -5249 57 -1408 115 -1401 115 -974 143 -1392 57 -818 51 -472 83 -340 83 -533 57 -144 55 -1447 146 -2054 167 -116 55 -3623 51 -1221 75 -314 129 -1122 79 -1146 53 -1695 55 -772 165 -899 57 -454 53 -110 139 -1158 85 -1138 95 -318 55 -1394 75 -1302 85 -1774 81 -851 109 -1620 79 -1598 101 -1417 81 -1038 143 -376 201 -86 85 -2134 83 -2553 131 -431 71 -714 51 -1226 85 -565 254 -307 143 -72 75 -2096 51 -426 57 -1246 185 -972 51 -104 121 -422 51 -746 55 -174 85 -1839 75 -468 193 -952 55 -5596 53 -902 85 -932 77 -244 93 -797 71 +RAW_Data: -120 95 -1172 127 -1658 127 -336 115 -3786 81 -1645 175 -664 71 -1213 119 -538 81 -486 83 -1056 139 -502 81 -136 57 -1016 55 -4015 79 -983 83 -3019 162 -872 55 -1206 51 -668 69 -1794 71 -72 71 -1110 85 -260 109 -1256 77 -1689 77 -220 85 -1356 85 -1444 57 -1574 113 -748 85 -2763 111 -1122 97 -200 71 -180 163 -652 99 -406 221 -1464 57 -2674 152 -1056 111 -1950 95 -246 51 -564 57 -1968 143 -2935 125 -72 51 -3471 147 -1538 75 -2358 143 -998 55 -56 81 -1742 71 -614 71 -510 115 -1230 51 -592 85 -5279 71 -1456 143 -546 97 -2283 115 -768 135 -2157 53 -1126 125 -1852 85 -172 115 -288 135 -3593 55 -82 81 -418 79 -2092 75 -2337 75 -862 123 -1512 51 -196 57 -2481 81 -282 85 -272 71 -96 71 -468 75 -200 99 -1080 55 -1080 79 -80 81 -146 241 -1940 57 -172 85 -232 221 -166 111 -720 111 -1020 201 -202 57 -438 113 -3193 105 -432 95 -382 53 -254 85 +RAW_Data: -576 57 -428 71 -1124 85 -756 77 -160 81 -747 57 -720 53 -1277 75 -1634 143 -120 119 -72 85 -682 287 -156 71 -72 71 -828 155 -144 95 -238 145 -893 133 -784 55 -530 305 -346 85 -86 357 -690 95 -144 97 -606 95 -590 99 -748 51 -954 55 -786 77 -878 131 -834 141 -770 105 -718 53 -86 143 -958 75 -2848 101 -1184 57 -392 81 -202 55 -592 53 -854 57 -2498 71 -3492 217 -2608 55 -1050 215 -94 53 -230 115 -1046 85 -890 81 -464 57 -350 149 -178 57 -1463 71 -2903 113 -283 53 -1820 83 -2193 55 -3771 51 -2286 53 -132 109 -1115 97 -1400 57 -892 105 -670 81 -634 107 -400 53 -662 107 -172 55 -8569 95 -1160 113 -172 57 -376 119 -360 57 -4359 55 -5612 85 -903 107 -2561 217 -1696 53 -328 99 -222 69 -628 53 -190 75 -296 51 -100 95 -238 190 -463 255 -664 79 -2058 57 -840 55 -1408 71 -774 53 -84 93 -582 51 -8306 55 -1909 129 -4008 135 -3409 77 -106 77 -664 95 -1304 123 -308 79 -1343 77 -680 79 -3844 119 -1222 75 -1388 125 -3826 57 -870 73 -744 53 -2282 140 -500 81 -192 87 -2144 143 -892 55 -950 71 -614 187 -174 85 -402 51 -288 131 -494 111 -124 165 -1326 57 -202 55 -346 57 -918 181 -896 57 -380 105 -484 191 -670 85 -2323 55 -3243 133 -390 97 -3123 105 -1292 71 -722 105 -426 75 -172 93 -880 71 -96 81 -544 79 -122 79 -2570 53 -782 57 -2544 53 -438 143 -988 113 -490 57 -144 113 -1980 115 -1540 51 -1974 452 -1540 57 -1507 115 -1440 85 -1485 55 -1309 109 -4194 107 -826 53 -84 109 -4176 109 -1699 111 -1789 199 -1891 119 -1162 55 -1282 105 -1320 189 -200 115 -1004 83 -500 95 -3674 215 -1672 57 -396 55 -1992 71 -191 71 -4032 83 -238 57 -1076 139 -1018 55 -2031 73 -3503 77 -2106 51 -268 173 -1106 101 -160 57 -2695 53 -412 71 -971 143 -512 143 -1142 219 -314 57 -2280 141 -1352 53 -142 115 -1261 53 -3901 85 -1568 53 -1030 165 -1322 51 -1320 137 -859 95 -419 95 -1546 85 -431 195 -4704 55 -174 115 -86 55 -3617 81 -1847 57 -1075 55 -258 57 -512 55 -842 55 -144 95 -648 79 -1022 55 -2452 71 -400 95 -1854 57 -316 85 -3789 57 -1923 57 -56 51 -586 51 -558 81 -280 81 -144 71 -406 51 -5014 71 -386 127 -138 229 -270 75 -144 141 -511 123 -268 57 -1619 101 -2900 113 -426 85 -114 57 -1092 173 -690 57 -6610 85 -6804 57 -314 119 -382 71 -484 115 -2236 143 -1202 79 -584 105 -724 71 -948 115 -214 75 -5453 51 -952 145 -572 107 -2334 103 -338 55 +RAW_Data: -838 79 -4725 69 -298 95 -1760 81 -795 55 -480 179 -1534 133 -457 51 -970 51 -2324 81 -844 57 -1780 119 -550 145 -1218 57 -268 55 -573 115 -2077 71 -1476 57 -86 97 -4518 71 -526 51 -272 139 -3348 85 -1338 53 -780 53 -1548 77 -582 81 -881 55 -1422 105 -1636 77 -1617 71 -924 201 -260 85 -1092 83 -914 51 -2326 111 -382 109 -2328 77 -750 95 -1342 71 -120 51 -280 57 -918 73 -784 53 -4704 79 -1094 85 -624 57 -2733 85 -710 77 -346 57 -716 143 -1489 165 -792 173 -688 73 -102 97 -1139 75 -76 51 -164 81 -762 109 -296 77 -5079 113 -500 83 -304 139 -1080 51 -4167 75 -998 85 -367 85 -3404 71 -1460 95 -1588 111 -1510 95 -939 111 -2271 57 -694 135 -1592 85 -256 163 -708 95 -770 81 -164 113 -1608 95 -672 83 -470 79 -1810 55 -82 79 -144 51 -188 113 -58 115 -1338 55 -4046 119 -970 38481 -128 51 -496 935 -728 937 -754 911 -756 911 -754 911 -754 911 -756 883 -784 885 -780 883 -782 885 -808 857 -806 859 -806 859 -808 859 -806 859 -806 859 -808 857 -808 859 -806 861 -808 857 -808 859 -810 859 -806 857 -808 857 -806 859 -806 859 -808 859 -806 859 -806 859 -808 857 -810 857 -806 859 -810 835 -832 831 -834 831 -832 833 -832 859 -810 831 -832 833 -834 857 -808 833 -834 833 -832 831 -834 833 -834 831 -834 833 -834 831 -834 831 -832 859 -808 857 -806 859 -808 833 -832 833 -832 859 -810 831 -832 859 -808 857 -808 859 -808 831 -836 831 -834 833 -832 833 -834 857 -808 857 -810 831 -832 833 -834 857 -808 857 -808 833 -832 859 -810 831 -832 859 -808 831 -832 859 -808 835 -832 831 -834 857 -808 833 -832 859 -810 833 -836 831 -834 831 -832 831 -834 857 -808 859 -808 835 -834 831 -832 831 -834 831 -834 833 -832 857 -808 833 -832 859 -810 831 -834 831 -832 859 -808 857 -808 833 -834 831 -834 833 -832 859 -808 831 -834 833 -834 833 -834 831 -834 831 -834 857 -808 857 -808 833 -834 833 -834 833 -832 833 -832 835 -834 831 -834 833 -832 831 -832 831 -834 859 -808 857 -808 831 -834 857 -808 859 -806 835 -834 831 -834 831 -834 835 -832 833 -832 857 -810 831 -832 833 -832 833 -832 859 -808 861 -808 833 -834 831 -832 833 -832 857 -810 831 -834 831 -838 833 -830 833 -832 831 -832 859 -808 833 -832 833 -832 859 -808 857 -808 835 -832 833 -832 831 -836 831 -832 859 -806 859 -808 859 -808 857 -808 859 -808 833 -832 833 -834 833 -832 831 -834 857 -808 859 -806 835 -834 831 -832 833 +RAW_Data: -834 833 -834 831 -832 857 -808 835 -832 833 -834 857 -808 859 -806 859 -808 857 -808 831 -832 859 -808 859 -808 831 -834 857 -808 859 -810 833 -832 831 -838 831 -834 835 -830 833 -832 831 -832 835 -832 833 -834 835 -832 831 -832 831 -834 831 -834 857 -808 859 -806 859 -808 857 -808 833 -834 833 -832 831 -836 831 -832 859 -810 833 -834 833 -832 831 -832 833 -834 831 -832 859 -808 857 -808 857 -808 859 -808 859 -806 859 -808 857 -808 859 -808 831 -834 857 -810 857 -806 835 -834 831 -834 831 -834 833 -832 833 -834 831 -834 833 -832 857 -808 859 -808 857 -810 833 -834 833 -832 831 -832 833 -832 857 -812 831 -836 835 -830 831 -832 831 -836 831 -834 833 -836 831 -832 831 -834 831 -832 859 -808 859 -808 831 -836 835 -834 831 -832 831 -834 831 -832 859 -808 831 -836 835 -832 831 -832 831 -834 857 -808 857 -810 831 -834 833 -834 835 -832 831 -832 831 -836 831 -834 859 -808 833 -832 831 -834 857 -808 859 -806 833 -834 857 -810 835 -832 831 -834 831 -832 833 -832 833 -834 833 -834 831 -834 831 -832 859 -808 857 -808 833 -832 859 -808 857 -808 859 -808 835 -832 833 -832 831 -832 859 -808 857 -808 859 -808 833 -832 833 -834 835 -832 831 -834 831 -834 831 -834 857 -810 831 -832 857 -808 859 -808 859 -808 857 -808 831 -834 859 -806 859 -808 857 -808 857 -810 857 -808 859 -810 831 -834 831 -832 833 -834 857 -808 857 -808 835 -834 831 -832 833 -832 859 -808 857 -808 833 -834 831 -832 833 -834 857 -810 835 -834 831 -832 831 -832 859 -806 1691 -4134 1691 -1640 855 -830 1663 -832 3333 -832 831 -832 831 -2502 831 -1668 3337 -3336 829 -832 831 -832 2505 -830 1665 -2506 4169 -1642 1689 -830 829 -2500 831 -3342 829 -832 831 -832 2501 -832 1665 -2506 4157 -1664 1691 -804 853 -2478 857 -3306 853 -832 833 -834 2505 -830 1663 -2502 4153 -1660 1687 -828 829 -2500 833 -3340 829 -830 829 -832 2499 -832 1667 -2500 4171 -1668 1667 -832 829 -2500 829 -3318 859 -830 831 -832 2499 -832 1667 -2498 4171 -1664 1663 -832 831 -2502 829 -3338 831 -832 831 -832 2501 -832 1667 -2504 4167 -1670 1669 -828 831 -2500 12491 -3334 853 -4972 853 -1660 827 -1660 853 -3308 855 -830 829 -830 2499 -834 1665 -2508 4169 -1664 1663 -830 831 -2506 829 -3336 831 -830 833 -832 2499 -832 1667 -2508 4165 -1664 1663 -832 833 -2500 833 -3338 829 -832 831 -832 2501 -830 1665 -2502 4171 -1666 1663 -832 831 -2500 831 -3342 829 -832 831 -832 2501 -836 1663 -2500 4173 -1670 1663 -830 831 -2504 829 -3332 831 -832 831 -832 2507 +RAW_Data: -830 1667 -2502 4173 -1642 1695 -804 855 -2498 829 -3332 831 -830 831 -832 2499 -834 1669 -2506 4175 -1636 1689 -832 831 -2480 853 -3332 833 -830 831 -832 2509 -830 1663 -2502 4165 -1666 1667 -832 831 -2500 831 -3340 831 -830 831 -832 2503 -832 1665 -2504 4169 -1662 1663 -832 831 -2506 831 -3340 829 -830 831 -830 2503 -832 1669 -2502 4169 -1664 1665 -830 831 -1350 81 -266 177 -269 57 -490 143 -2812 85 -2206 57 -72 73 -689 200 -726 149 -598 143 -1554 85 -792 143 -336 123 -548 95 -996 109 -424 55 -140 143 -520 123 -744 81 -730 51 -2840 73 -2716 103 -490 129 -1354 51 -2207 85 -2683 55 -288 173 -895 85 -4697 55 -530 97 -1837 131 -946 73 -660 103 -2022 119 -1039 95 -454 143 -1098 109 -1004 219 -78 312 -778 53 -364 51 -666 113 -376 85 -1059 73 -802 55 -700 75 -1554 171 -1446 107 -168 85 -1278 111 -2564 97 -1578 71 -94 75 -1124 57 -202 171 -2954 79 -3597 191 -326 57 -922 51 -2730 53 -6135 55 -2020 225 -230 87 -1212 53 -1216 149 -1208 53 -502 57 -985 57 -2636 51 -2358 85 -926 143 -1490 57 -114 85 -634 87 -258 57 -1351 75 -1086 95 -192 71 -2150 73 -2060 137 -2159 95 -1362 73 -336 71 -953 77 -220 53 -1989 83 -172 57 -1969 107 -2257 140 -886 71 -1026 123 -372 73 -934 99 -522 139 -651 257 -1566 77 -5069 201 -4802 55 -142 57 -1396 79 -2716 55 -2050 79 -604 111 -1040 85 -1534 109 -544 83 -342 107 -1459 85 -86 57 -3009 99 -322 51 -2178 119 -1485 73 -694 95 -2832 85 -628 81 -1824 222 -1313 85 -918 71 -864 139 -872 79 -218 51 -468 81 -400 85 -1794 83 -742 227 -504 79 -1632 95 -1193 173 -316 85 -2780 51 -1454 103 -246 95 -1885 53 -2051 125 -1186 71 -1708 73 -719 83 -896 73 -524 81 -1082 141 -1076 77 -982 95 -1493 55 -1760 57 -1092 125 -2082 51 -120 83 -2372 77 -1458 75 -1212 75 -412 125 -504 109 -1937 57 -1176 161 -532 71 -224 75 -170 53 -2455 83 -1448 85 -520 55 -1582 143 -1199 115 -172 57 -3324 113 -968 115 -936 109 -3588 71 -1038 57 -1284 245 -674 125 -3396 105 -11139 57 -112 107 -1070 81 -424 115 -2333 131 -1048 115 -874 81 -1754 57 -1300 115 -776 109 -1778 83 -58 85 -2295 55 -5975 115 -6613 55 -2096 51 -394 113 -976 51 -856 53 -950 85 -896 57 -1021 83 -2526 71 -914 53 -1867 121 -376 85 -144 115 -1340 51 -544 143 -1367 71 -252 105 -3156 85 -1170 53 -82 55 -3404 107 -4580 81 -284 83 -2419 57 -1649 123 -714 51 -315 85 -452 105 -562 51 -2883 339 -284 105 -4443 79 -772 145 -700 71 +RAW_Data: -2030 57 -506 57 -2361 135 -4288 71 -240 95 -5117 81 -1952 85 -78 51 -268 131 -336 187 -256 103 -480 115 -200 57 -1072 51 -1488 169 -601 85 -344 51 -527 83 -316 105 -2755 81 -1151 55 -515 119 -1884 115 -86 57 -198 107 -572 75 -1890 87 -344 53 -3983 53 -1831 143 -1036 115 -776 73 -1976 83 -526 57 -244 71 -2232 53 -658 55 -2022 111 -1187 55 -1060 143 -790 113 -448 85 -1146 171 -360 77 -326 55 -1430 55 -1196 57 -2278 57 -58 85 -472 99 -144 153 -76 73 -3314 71 -336 127 -1364 85 -2548 161 -2241 83 -1835 173 -1282 105 -598 109 -1635 85 -1584 131 -936 57 -202 57 -316 87 -2655 57 -2056 83 -1442 51 -2730 51 -1225 73 -1618 85 -1316 73 -1938 75 -144 57 -466 75 -542 81 -666 135 -76 51 -2683 57 -2176 171 -1803 73 -1938 55 -116 85 -674 71 -144 73 -1015 71 -348 139 -114 87 -804 57 -876 81 -3570 103 -2494 115 -4706 97 -836 167 -3400 109 -159 109 -422 143 -1118 81 -1652 53 -1064 85 -2080 125 -942 51 -536 109 -596 57 -2403 101 -1859 51 -456 51 -4086 53 -944 57 -510 135 -1405 87 -1710 85 -2595 81 -654 71 -366 179 -2085 79 -1852 55 -1312 77 -1568 73 -230 201 -612 77 -2530 107 -834 53 -2593 71 -720 69 -956 51 -1000 71 -2016 73 -1062 53 -288 85 -1816 51 -1080 105 -4427 57 -502 57 -246 57 -172 85 -522 111 -1109 55 -1322 85 -3728 53 -726 77 -342 169 -548 85 -144 85 -4389 95 -168 111 -1119 107 -170 55 -482 55 -1877 115 -224 55 -1441 115 -1658 55 -260 115 -2828 57 -292 141 -588 77 -366 113 -1268 113 -2047 57 -2529 95 -96 95 -2418 51 -606 55 -7091 199 -232 55 -542 185 -503 115 -4766 71 -1646 81 -364 57 -842 57 -1202 77 -1835 173 -606 75 -1815 95 -2219 115 -1155 105 -1413 55 -624 55 -1132 73 -3094 107 -228 115 -2893 85 -410 77 -390 53 -876 71 -1922 95 -238 213 -102 71 -3646 57 -144 57 -790 83 -258 57 -534 55 -1262 55 -442 57 -922 55 -394 81 -2235 85 -432 115 -1230 55 -2571 167 -2298 57 -364 173 -114 115 -2858 55 -380 55 -1758 113 -140 137 -679 53 -486 57 -492 107 -470 79 -344 107 -708 55 -438 201 -647 85 -318 125 -1030 119 -216 115 -1186 190 -456 111 -830 85 -324 75 -204 73 -1540 55 -1106 51 -824 87 -1648 51 -236 51 -894 113 -758 57 -246 73 -2861 163 -368 107 -2106 85 -172 85 -230 57 -732 81 -1398 55 -1004 187 -1516 55 -1230 105 -1356 51 -134 169 -188 51 -3247 85 -346 115 -1154 71 -288 83 -1114 129 -294 75 -52 51 -1298 55 -2941 55 +RAW_Data: -214 75 -196 111 -2485 75 -126 95 -312 143 -72 71 -190 81 -804 57 -174 55 -1083 55 -368 51 -108 85 -288 171 -314 85 -508 57 -1214 53 -642 73 -1274 75 -2906 85 -994 53 -196 55 -516 57 -1062 71 -168 95 -230 73 -220 111 -1678 175 -885 79 -392 135 -780 75 -1414 101 -226 115 -1356 75 -1103 107 -166 55 -374 201 -1658 79 -2138 83 -2953 51 -3438 57 -1496 139 -706 55 -86 113 -550 79 -290 69 -886 75 -1810 85 -2014 57 -7729 85 -346 143 -320 71 -370 109 -630 171 -832 57 -230 85 -2047 57 -2083 55 -1038 53 -307 143 -3795 85 -224 51 -76 75 -734 51 -110 139 -1386 51 -1956 143 -804 87 -2378 51 -266 95 -479 71 -74 153 -3470 57 -1820 195 -2516 191 -2735 51 -298 95 -382 55 -142 85 -484 143 -422 139 -240 145 -224 71 -614 51 -5422 53 -284 57 -2086 79 -457 143 -792 69 -1877 57 -370 53 -1174 57 -202 201 -444 143 -2668 77 -499 95 -336 71 -168 99 -601 55 -1254 113 -342 107 -572 57 -2087 55 -140 55 -1613 103 -226 187 -516 87 -984 55 -1292 139 -2796 53 -104 83 -548 83 -58 115 -566 103 -2006 57 -399 167 -716 143 -924 105 -226 57 -756 127 -366 81 -7232 53 -3058 71 -3351 57 -316 77 -689 99 -1099 75 -1238 142 +RAW_Data: -338 85 -404 115 -1320 165 -86 113 -280 133 -1238 133 -838 137 -2438 233 -1339 77 -326 285 -684 85 -542 405 -144 117 -74 133 -488 161 -256 154 -204 219 -292 79 -234 131 -58 143 -386 381 -108 211 -370 143 -240 71 -510 177 -511 191 -238 163 -428 115 -784 105 -698 57 -774 141 -1686 85 -88 53 -504 53 -138 83 -3074 229 -2636 105 -344 57 -1200 85 -431 85 -368 131 -592 79 -108 57 -144 85 -2860 83 -1708 77 -5452 145 -130 111 -514 75 -214 97 -194 53 -1610 139 -968 51 -456 71 -1228 79 -831 115 -4064 103 -2760 57 -1613 57 -1198 55 -1513 85 -825 69 -72 87 -6472 143 -202 57 -2092 113 -764 111 -1016 85 -1328 321 -2368 57 -288 83 -948 107 -1250 111 -606 79 -392 87 -1048 81 -1190 57 -3359 131 -612 133 -4205 81 -244 71 -72 143 -1263 85 -230 115 -414 107 -209 125 -172 57 -718 133 -282 75 -1116 81 -1250 57 -200 231 -684 57 -568 75 -2242 81 -1015 85 -2736 141 -96 239 -574 119 -1188 95 -72 119 -1968 77 -364 57 -1090 75 -2203 125 -4261 171 -72 71 -432 71 -3192 87 -418 55 -646 79 -519 57 -3108 181 -1844 53 -576 111 -980 53 -498 95 -1398 57 -3554 81 -2111 157 -222 137 -156 85 -58 315 -180 55 -1576 115 -2007 75 -178 113 -1660 57 -2160 71 -942 51 -264 55 -470 77 -174 105 -1352 71 -528 71 -200 101 -1054 81 -672 57 -116 141 -168 57 -502 51 -3472 71 -96 71 -698 95 -557 139 -392 55 -572 57 -2121 75 -849 57 -757 191 -58 55 -835 51 -516 53 -1395 79 -230 51 -392 95 -1216 85 -540 81 -441 235 -2225 351 -84 111 -1198 57 -260 55 -86 113 -600 55 -1224 75 -104 51 -735 71 -2128 217 -2296 53 -174 125 -154 71 -96 71 -432 109 -1114 129 -2309 185 -760 93 -1597 119 -1341 53 -558 199 -1754 107 -80 53 -262 143 -2375 105 -530 127 -1875 77 -1161 55 -220 95 -1106 71 -427 213 -2730 71 -835 83 -1084 55 -958 113 -1938 55 -3530 99 -100 71 -1898 143 -1378 57 -1091 57 -872 85 -144 57 -1924 73 -1016 93 -72 95 -1056 97 -1922 79 -408 85 -1863 77 -908 57 -292 53 -816 79 -108 55 -918 95 -262 87 -1573 71 -384 105 -522 105 -5164 57 -2268 113 -1595 143 -1210 115 -1250 115 -1072 85 -392 55 -88 113 -392 83 -716 53 -2979 77 -945 173 -554 71 -3442 55 -1746 113 -144 287 -82 57 -604 157 -1221 115 -374 57 -1718 77 -432 57 -1504 57 -1140 83 -228 57 -202 85 -712 77 -934 57 -1234 129 -168 71 -800 77 -790 79 -2738 137 -1610 51 -610 55 -590 53 -2878 57 -1028 53 +RAW_Data: -2146 51 -722 113 -1007 85 -2775 71 -96 143 -168 71 -560 53 -80 81 -2334 81 -658 137 -220 51 -124 71 -6008 81 -776 71 -350 123 -168 71 -448 71 -454 109 -318 85 -3378 71 -490 109 -5580 127 -3651 73 -912 71 -1372 87 -1122 83 -144 57 -2868 53 -370 51 -1582 55 -266 157 -300 75 -1232 53 -662 199 -202 139 -1772 190 -294 81 -3744 53 -1156 79 -2455 55 -242 71 -408 57 -2073 99 -140 57 -1305 83 -455 57 -260 85 -720 75 -298 81 -975 259 -534 127 -352 57 -522 71 -1633 85 -843 57 -316 87 -1169 81 -566 75 -226 83 -196 115 -2258 173 -489 83 -136 55 -1445 81 -1108 71 -2362 97 -728 95 -1581 57 -432 57 -1344 133 -112 57 -910 55 -84 83 -954 83 -1375 155 -1141 195 -144 95 -1495 71 -829 111 -142 85 -2702 111 -1576 159 -1990 97 -640 75 -344 171 -86 85 -3409 71 -386 101 -912 143 -168 71 -1313 95 -1223 57 -288 85 -86 115 -230 57 -100 71 -910 71 -792 57 -254 85 -2755 137 -1395 69 -3515 87 -2440 55 -1038 137 -72 73 -448 105 -142 83 -1408 105 -2444 105 -492 97 -918 169 -86 81 -1721 57 -482 55 -5453 113 -3386 71 -128 173 -956 51 -1106 53 -1028 143 -168 81 -300 73 -1383 79 -3180 51 -3667 51 -480 57 -2206 53 -532 135 -2097 75 -440 53 -1294 85 -116 113 -484 105 -1614 55 -1106 53 -2197 105 -2796 113 -1504 71 -1038 75 -3274 165 -1598 97 -338 73 -1071 57 -230 115 -2267 331 -1306 85 -648 85 -492 81 -1232 55 -3281 55 -376 97 -3073 83 -3046 143 -978 85 -803 75 -720 107 -988 95 -758 51 -1076 109 -1359 85 -2750 95 -1355 79 -230 71 -312 71 -144 143 -1520 55 -1126 75 -641 77 -632 57 -76 73 -122 119 -1056 95 -1748 51 -918 113 -1070 85 -642 75 -1402 55 -58 159 -482 109 -2875 115 -388 101 -698 55 -554 53 -898 71 -622 95 -472 75 -272 109 -336 189 -1702 123 -184 57 -1217 79 -682 83 -372 137 -430 113 -674 57 -661 75 -1102 81 -1438 115 -976 83 -898 137 -808 53 -2065 151 -3742 55 -3758 55 -414 55 -5521 141 -988 53 -446 131 -142 87 -614 77 -1107 113 -1110 51 -602 85 -1184 75 -654 53 -1724 97 -528 77 -630 85 -58 113 -538 115 -1078 53 -284 55 -576 165 -224 71 -1224 55 -342 55 -462 113 -426 85 -364 171 -1258 107 -837 143 -2620 115 -2844 53 -2348 75 -544 115 -288 85 -898 75 -414 81 -1014 101 -1062 77 -1408 81 -158 113 -908 131 -496 187 -979 51 -484 71 -530 191 -2927 109 -3701 57 -86 85 -1132 57 -892 85 -1671 75 -1040 79 -106 51 -946 71 +RAW_Data: -1552 129 -4484 225 -2645 133 -482 71 -1211 163 -136 143 -144 55 -404 115 -1574 141 -2378 53 -726 75 -102 125 -246 97 -797 53 -624 71 -421 71 -1338 77 -1094 73 -1504 103 -340 51 -256 51 -418 191 -804 55 -368 53 -1197 51 -1778 77 -1496 57 -278 105 -340 111 -2992 141 -1000 221 -1470 79 -2306 57 -1330 81 -3216 77 -282 71 -120 69 -1884 85 -578 55 -775 57 -576 57 -1634 109 -1098 133 -926 113 -1887 85 -58 169 -3933 51 -4166 57 -2099 53 -1490 143 -2902 53 -622 85 -776 75 -412 57 -483 55 -2698 51 -1354 95 -664 53 -1022 57 -1886 53 -3041 85 -1478 55 -2702 299 -312 77 -817 99 -1344 53 -1290 167 -1844 133 -746 103 -313 93 -470 167 -182 79 -892 167 -162 57 -174 55 -836 97 -1160 73 -1863 55 -404 115 -6023 95 -646 53 -2812 53 -864 55 -1194 133 -486 57 -1476 87 -342 101 -1442 119 -178 163 -698 51 -2886 71 -484 71 -378 35173 -52 51 -78 51 -156 77 -106 1092 -702 937 -730 937 -754 913 -754 901 -756 911 -756 911 -758 889 -784 883 -782 887 -780 883 -780 885 -780 885 -780 881 -806 859 -784 887 -782 881 -802 857 -808 859 -806 787 -760 983 -806 855 -802 853 -830 831 -834 829 -830 777 -880 839 -828 857 -806 859 -728 679 -80 161 -834 1073 -590 851 -378 53 -258 71 -818 847 -796 869 -808 861 -790 863 -812 867 -808 857 -812 835 -830 857 -806 859 -806 857 -812 837 -182 51 -606 841 -814 837 -830 833 -834 859 -808 857 -806 857 -806 859 -806 839 -832 859 -806 831 -832 857 -808 857 -808 855 -806 861 -810 863 -806 835 -832 831 -830 857 -808 857 -812 835 -836 831 -834 831 -832 829 -838 829 -832 831 -836 835 -832 831 -832 833 -832 859 -808 831 -834 833 -834 835 -832 833 -832 831 -834 831 -836 831 -832 835 -832 831 -834 831 -836 831 -832 857 -808 859 -808 833 -834 833 -832 831 -834 833 -832 859 -808 833 -836 831 -836 831 -832 831 -836 831 -834 831 -832 833 -834 833 -836 833 -832 833 -830 833 -832 833 -832 831 -832 835 -832 833 -834 857 -812 831 -830 833 -832 833 -834 833 -836 835 -832 829 -834 833 -832 831 -834 857 -808 857 -808 859 -808 833 -832 831 -834 859 -808 833 -834 831 -834 831 -832 859 -808 859 -806 833 -832 859 -808 859 -806 835 -834 831 -832 833 -832 833 -834 857 -808 857 -808 859 -808 857 -808 833 -832 859 -808 833 -836 831 -834 831 -832 833 -836 835 -832 831 -834 831 -834 833 -832 831 -834 857 -806 833 -832 859 -808 833 -832 857 -808 859 -808 831 -834 857 -808 861 +RAW_Data: -808 857 -808 831 -832 859 -806 859 -810 833 -834 857 -806 833 -834 859 -808 831 -834 833 -834 831 -834 831 -836 831 -832 859 -808 833 -832 831 -832 833 -834 857 -810 831 -832 859 -808 857 -808 833 -832 857 -808 859 -806 859 -808 859 -810 833 -832 833 -832 833 -834 831 -834 833 -832 833 -834 833 -832 831 -834 859 -808 857 -808 857 -808 857 -808 833 -834 833 -832 831 -834 857 -808 833 -834 833 -832 833 -832 833 -832 837 -832 833 -836 831 -832 831 -832 857 -810 831 -832 835 -834 857 -808 835 -836 831 -832 831 -836 833 -830 835 -830 835 -834 831 -832 831 -834 831 -834 831 -834 833 -834 857 -808 833 -832 833 -832 835 -834 831 -832 833 -832 859 -806 859 -808 831 -834 859 -806 859 -808 831 -834 859 -806 835 -834 831 -834 831 -832 833 -836 831 -834 833 -832 833 -836 831 -834 831 -832 859 -808 831 -834 857 -812 831 -832 833 -832 857 -808 831 -834 833 -834 857 -810 831 -832 859 -808 857 -808 833 -834 833 -832 833 -832 859 -808 831 -832 833 -834 857 -808 859 -806 859 -806 859 -808 833 -832 861 -808 857 -808 831 -834 833 -832 833 -834 831 -834 857 -808 859 -808 833 -832 831 -832 859 -806 859 -808 859 -808 833 -832 859 -808 857 -808 859 -808 833 -832 857 -808 833 -834 833 -832 833 -832 835 -832 833 -832 833 -832 859 -808 857 -808 859 -806 833 -832 859 -806 859 -808 859 -808 833 -832 857 -808 859 -808 857 -808 857 -808 861 -808 831 -832 833 -832 859 -808 857 -808 859 -806 833 -834 833 -832 859 -806 859 -808 857 -810 831 -832 859 -810 831 -834 857 -808 833 -832 831 -834 859 -806 859 -808 831 -834 859 -806 833 -834 835 -832 1665 -4178 1667 -1644 853 -830 1665 -830 3343 -830 829 -832 833 -2502 831 -1666 3333 -3340 831 -830 829 -834 2499 -832 1665 -2508 4175 -1638 1695 -802 853 -2502 829 -3332 831 -832 829 -832 2499 -832 1669 -2508 4177 -1642 1687 -830 827 -2500 829 -3336 829 -830 831 -832 2503 -834 1671 -2480 4195 -1642 1687 -830 829 -2504 829 -3332 831 -832 829 -832 2501 -832 1669 -2500 4173 -1668 1667 -830 833 -2500 829 -3314 855 -830 829 -832 2499 -832 1665 -2500 4173 -1666 1663 -832 831 -2498 831 -3346 829 -830 829 -832 2505 -832 1665 -2504 4167 -1664 1665 -830 831 -2508 9999 -826 2519 -802 853 -1664 829 -2500 1667 -832 831 -834 1665 -2502 3333 -3334 2503 -1644 2531 -806 853 -832 831 -830 829 -832 831 -832 831 -2504 831 -1666 1673 -830 831 -3340 831 -832 831 -2498 831 -2500 1669 -832 831 -832 835 -830 1671 -7504 1665 -1666 10007 -2472 855 -830 829 -1668 2497 +RAW_Data: -3342 829 -830 831 -832 2503 -830 1667 -2506 4169 -1666 1661 -832 831 -2502 831 -3336 829 -832 829 -832 2505 -830 1671 -2500 4167 -1666 1665 -832 831 -2502 831 -3332 831 -832 831 -834 2507 -834 1663 -2498 4171 -1668 1667 -830 829 -2506 831 -3316 853 -830 829 -832 2503 -830 1665 -2498 4173 -1668 1667 -832 829 -2502 829 -3316 855 -828 829 -836 2501 -832 1665 -2504 4155 -1666 1667 -828 853 -2480 855 -3306 853 -828 831 -832 2503 -830 1669 -2500 4165 -1666 1665 -832 831 -884 239 -84 57 -86 139 -595 115 -58 171 -488 171 -196 109 -560 233 -354 85 -628 83 -170 87 -172 57 -114 201 -936 83 -440 51 -140 257 -1331 73 -1130 143 -850 107 -84 55 -2862 301 -392 57 -3352 109 -518 113 -1454 71 -309 113 -400 55 -1551 81 -3980 51 -2334 77 -2336 81 -818 79 -1622 57 -545 111 -368 57 -2790 141 -230 113 -1418 109 -3084 57 -1836 191 -1407 71 -1556 85 -3456 119 -1138 53 -1830 51 -6980 95 -1186 73 -246 95 -1590 53 -112 55 -1262 85 -1164 53 -1229 190 -1226 71 -314 73 -1102 55 -154 51 -202 111 -2555 55 -1915 85 -1214 85 -174 85 -58 57 -2466 71 -70 55 -1752 95 -1326 237 -1038 165 -74 57 -678 51 -2062 85 -1532 143 -1898 55 -232 55 -1478 93 -1740 85 -196 143 -765 71 -96 71 -780 53 -1918 357 -1807 51 -1054 173 -1584 57 -2294 79 -790 53 -424 71 -1492 69 -3693 85 -710 143 -202 57 -1562 71 -168 71 -1020 147 -1276 85 -2227 97 -192 95 -2028 73 -216 71 -72 95 -230 79 -2310 57 -1124 85 -2510 71 -1798 105 -1173 111 -560 73 -1120 73 -342 71 -144 166 -1704 73 -72 95 -304 57 -3130 85 -9625 119 -2383 113 -486 83 -190 83 -2192 95 -1553 51 -1986 119 -202 135 -1096 81 -2311 201 -2079 97 -894 95 -1782 83 -820 83 -1465 55 -1138 85 -2786 143 -3226 204 -1358 71 -2544 53 -56 105 -934 115 -284 53 -80 71 -896 163 -736 73 -1538 105 -184 101 -686 53 -642 103 -1330 75 -3897 85 -556 51 -602 225 -1666 53 -1428 85 -1193 83 -298 97 -1507 109 -2383 79 -1805 77 -2877 119 -1233 137 -968 55 -1210 85 -196 153 -264 103 -1470 85 -3017 113 -218 73 -2133 57 -1948 109 -594 83 -2816 157 -539 55 -558 55 -112 81 -952 51 -272 57 -444 85 -570 83 -1175 53 -1760 57 -4421 53 -168 111 -232 55 -2752 53 -366 79 -1238 73 -1228 85 -2416 57 -3523 85 -1566 103 -820 113 -765 173 -1354 53 -2122 85 -346 57 -4443 79 -408 53 -290 95 -1484 75 -1052 73 -278 145 -454 77 -164 167 -430 81 -5196 115 -2725 53 -2715 83 -136 119 -457 79 -364 105 -728 175 -1528 57 +RAW_Data: -728 53 -176 163 -2120 71 -1394 71 -488 107 -1404 221 -422 95 -96 201 -356 71 -7701 85 -3729 77 -3237 95 -846 71 -888 51 -322 123 -784 79 -276 105 -1064 77 -652 85 -776 83 -664 77 -3171 107 -112 57 -1733 77 -898 85 -2118 57 -1423 81 -616 73 -2090 55 -2730 85 -6676 85 -317 85 -632 79 -526 101 -1637 192 -700 107 -314 55 -608 109 -388 217 -2209 85 -116 143 -1837 143 -4598 79 -1406 87 -972 71 -1750 85 -882 167 -1105 75 -5685 57 -672 55 -2931 113 -730 109 -196 87 -86 85 -1168 51 -1041 57 -404 71 -2115 155 -880 85 -719 51 -216 53 -660 113 -1412 73 -2408 97 -2971 57 -2495 170 -2786 87 -2076 55 -2939 53 -1032 111 -258 115 -500 81 -1947 113 -580 85 -1656 75 -1528 79 -324 143 -1110 79 -274 143 -796 53 -460 83 -1480 53 -1874 119 -192 97 -676 71 -1558 55 -3100 79 -1702 53 -618 57 -1091 71 -854 119 -1086 53 -2373 57 -1252 77 -136 87 -4334 133 -1292 85 -304 53 -556 71 -668 157 -1981 109 -792 77 -446 57 -226 77 -296 51 -202 101 -1104 81 -1782 99 -414 95 -1043 121 -2439 109 -1296 103 -3848 55 -116 85 -690 85 -1092 105 -1873 83 -966 75 -140 87 -944 53 -2992 81 -755 101 -376 79 -2732 113 -422 53 -964 51 -396 57 -7268 75 -314 95 -826 105 -1332 71 -460 195 -740 53 -434 51 -104 85 -2272 135 -1858 57 -172 201 -200 113 -4127 129 -176 69 -712 79 -6216 57 -2069 73 -1370 51 -3561 143 -1895 95 -566 51 -1440 95 -1062 57 -791 57 -116 85 -1240 107 -1216 57 -3492 105 -3270 57 -548 57 -250 97 -2722 79 -1640 115 -1928 57 -425 85 -1278 85 -698 53 -534 85 -685 85 -3646 141 -1378 57 -562 192 -400 111 -622 133 -208 51 -1396 111 -924 143 -1442 95 -1145 95 -72 81 -803 107 -112 55 -692 57 -2961 107 -1823 83 -3286 51 -372 97 -1180 71 -192 167 -96 95 -862 79 -1030 77 -394 176 -1455 55 -1594 53 -400 157 -334 57 -678 77 -522 217 -254 77 -315 137 -116 85 -172 57 -198 171 -378 71 -743 55 -860 79 -483 57 -230 201 -1650 71 -326 53 -2747 95 -576 165 -1854 57 -2763 57 -440 53 -348 57 -772 135 -198 55 -2280 51 -1903 85 -1666 143 -1120 55 -1507 75 -166 115 -248 87 -142 53 -2238 147 -332 53 -1842 55 -670 201 -1078 53 -112 57 -1012 167 -336 51 -522 51 -1330 115 -1824 55 -776 85 -806 139 -216 95 -1318 85 -548 85 -1647 83 -398 51 -1452 95 -1982 143 -1146 267 -2308 107 -656 57 -757 83 -742 77 -414 107 -312 77 -864 53 -112 85 -564 85 -2234 113 -5404 95 +RAW_Data: -1490 57 -374 83 -1644 115 -110 71 -478 71 -72 71 -1140 135 -2792 95 -2703 129 -168 85 -1668 133 -1521 53 -914 51 -4717 79 -1724 57 -172 115 -746 127 -394 83 -674 169 -564 71 -2250 119 -1603 51 -464 77 -2220 85 -566 55 -144 143 -116 115 -487 115 -282 129 -1690 111 -706 129 -1429 55 -223 113 -1228 53 -544 57 -114 57 -698 77 -2874 55 -232 113 -254 57 -1523 159 -72 101 -2285 51 -166 85 -315 57 -2125 53 -758 55 -478 107 -1725 53 -5851 83 -1616 101 -339 55 -230 109 -188 77 -652 51 -478 113 -3742 55 -230 57 -144 173 -754 143 -480 71 -2526 179 -4037 57 -1720 75 -432 133 -1464 165 -1268 215 -154 107 -398 87 -3083 85 -144 87 -512 71 -222 113 -487 85 -2428 81 -1648 119 -1226 95 -1213 103 -1275 57 -702 81 -1908 55 -542 55 -1838 109 -148 71 -1286 95 -3248 55 -639 71 -144 71 -598 119 -3930 171 -2344 55 -2623 87 -168 79 -2264 141 -1018 83 -344 115 -426 109 -518 85 -756 55 -2340 55 -1679 85 -200 85 -6170 51 -590 224 -1233 85 -260 107 -6039 57 -2192 113 -1496 109 -1146 55 -174 85 -848 75 -1242 111 -1068 85 -2111 81 -542 95 -1350 75 -144 95 -96 105 -362 105 -340 57 -864 115 -1568 73 -722 71 -2762 249 -382 113 -1979 75 -1233 143 -342 81 -3036 51 -226 87 -572 55 -282 57 -288 103 -3244 83 -242 99 -1748 55 -1206 172 -276 79 -2060 167 -904 123 -770 79 -1816 115 -202 113 -1526 137 -604 85 -2234 73 -300 113 -1504 95 -1114 55 -590 75 -410 103 -1314 83 -590 77 -3440 167 -3132 55 -224 75 -2107 57 -144 123 -842 155 -813 75 -602 71 -3652 141 -2380 57 -224 249 -164 189 -530 75 -493 51 -130 51 -126 95 -670 51 -340 81 -1084 97 -216 115 -1284 57 -1200 85 -310 55 -1002 71 -1455 79 -720 85 -1140 119 -288 95 -944 119 -554 53 -2450 73 -324 79 -836 105 -1087 73 -418 105 -528 139 -468 121 -582 167 -4205 71 -1858 183 -2318 143 -780 101 -98 187 -136 55 -2239 57 -434 103 -1946 113 -86 57 -428 53 -222 57 -86 143 -1036 107 -1232 77 -606 113 -1394 115 -86 57 -2204 75 -456 57 -1623 173 -2832 53 -2464 228 -609 141 -58 95 -847 77 -488 95 -734 51 -882 95 -4004 143 -1242 97 -322 77 -218 109 -2283 85 -116 85 -1281 55 -228 173 -820 77 -2298 71 -2057 115 -116 85 -760 143 -489 57 -2702 139 -1380 143 -583 143 -658 99 -918 141 -1033 55 -262 85 -1408 143 -1979 75 -872 57 -268 219 -594 107 -172 105 -222 71 -448 51 -806 101 -540 51 -108 115 -1558 147 -418 79 -206 71 +RAW_Data: -514 107 -1090 125 -928 77 -172 153 -382 71 -742 73 -1060 133 -3547 71 -992 85 -890 119 -72 81 -1154 145 -122 51 -198 57 -1288 173 -2424 83 -260 55 -278 105 -926 55 -274 75 -1555 57 -538 137 -2713 71 -1082 57 -1110 57 -670 83 -494 105 -1504 77 -750 81 -1226 57 -2030 79 -258 57 -140 101 -858 57 -400 55 -2286 55 -3390 55 -542 103 -404 181 -316 57 -174 85 -3657 51 -162 81 -735 105 -518 87 -2452 51 -252 165 -1942 73 -74 73 -1386 113 -3530 181 -1312 57 -1262 115 -314 133 -2418 57 -4028 71 -182 121 -747 83 -2793 167 -686 85 -1814 171 -1984 109 -1592 101 -1250 57 -346 113 -1370 99 -2761 53 -1930 51 -280 57 -1590 71 -1105 79 -702 143 -1216 235 -3208 57 -1998 77 -859 119 -608 51 -1084 143 -709 81 -1286 85 -144 265 -1274 53 -2068 75 -3092 77 -232 55 -144 57 -1836 57 -258 115 -1507 85 -2022 109 -1121 71 -893 93 -696 119 -951 57 -710 75 -844 95 -396 109 -1323 83 -1878 85 -272 51 -1108 179 -584 147 -196 71 -4320 57 -904 81 -776 55 -1857 55 -712 111 -54 81 -1338 121 -510 57 -698 85 -396 55 -1239 57 -892 75 -146 71 -358 71 -278 113 -2876 105 -671 85 -316 269 -1362 81 -342 57 -2932 55 -1391 111 -202 57 -576 55 -910 113 -318 57 -586 55 -719 143 -256 113 -2136 81 -802 71 -1190 95 -144 71 -2156 71 -730 55 -2380 87 -977 83 -172 95 -1322 57 -1160 71 -144 147 -1028 83 -898 53 -878 87 -114 115 -1296 75 -476 171 -1442 53 -1705 103 -2318 57 -3989 73 -414 73 -1012 51 -1492 55 -1992 87 -2711 83 -484 77 -760 105 -1338 53 -56 81 -590 57 -316 169 -4225 105 -1172 109 -744 115 -394 51 -4057 107 -531 87 -734 83 -1522 55 -1895 55 -2121 83 -1574 265 -1181 83 -2434 71 -1888 105 -734 167 -2886 57 -114 135 -2099 79 -854 71 -3982 51 -440 229 -654 57 -2316 57 -266 97 -536 75 -2106 53 -937 149 -2691 85 -838 57 -506 51 -108 57 -1044 85 -760 57 -2398 73 -2428 75 -1016 81 -138 85 -88 57 -1134 235 -1612 113 -2849 71 -1517 77 -434 127 -192 57 -1992 95 -232 107 -3254 53 -1442 57 -86 107 -1024 95 -854 53 -534 85 -2618 81 -2344 115 -2866 111 -998 71 -3113 53 -1341 55 -1216 103 -246 85 -3100 260 -450 85 -3023 55 -372 167 -86 57 -1094 51 -1499 85 -1252 57 -546 51 -2099 191 -172 85 -1829 71 -1259 97 -1506 85 -1928 143 -900 143 -858 115 -942 81 -2027 53 -1292 115 -1010 119 -852 55 -342 51 -80 81 -470 101 -636 55 -1046 85 -576 81 -976 79 -188 95 -947 81 +RAW_Data: -1480 55 -1430 55 -596 171 -1583 95 -884 51 -1116 121 -276 143 -2098 51 -1172 73 -1918 111 -112 51 -220 57 -230 163 -740 51 -1074 57 -1608 55 -3299 57 -2876 77 -1268 85 -771 79 -386 77 -1618 71 -1308 55 -863 121 -938 75 -110 83 -1176 187 -1807 57 -2894 55 -344 285 -994 55 -836 51 -963 85 -202 263 -686 55 -853 57 -144 115 -658 127 -955 57 -116 85 -944 111 -1891 57 -460 311 -1531 129 -146 121 -1301 71 -312 75 -600 77 -1760 71 -1264 85 -2345 51 -294 111 -772 51 -78 75 -292 71 -542 113 -690 85 -1164 79 -1368 57 -1284 53 -130 182 -240 53 -114 57 -287 143 -304 75 -754 169 -130 83 -54 85 -527 71 -1657 71 -462 383 -560 115 -638 131 -3943 285 -264 75 -168 85 -3999 83 -996 73 -644 71 -1205 71 -1108 85 -172 87 -1139 139 -518 167 -1278 123 -1125 75 diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index 756acfcd42e..e8fe7968a3a 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -376,7 +376,7 @@ const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { }; const SubGhzProtocol subghz_protocol_pocsag = { - .name = SUBGHZ_PROTOCOL_POCSAG, + .name = SUBGHZ_PROTOCOL_POCSAG_NAME, .type = SubGhzProtocolTypeStatic, .flag = SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Load, diff --git a/lib/subghz/protocols/pocsag.h b/lib/subghz/protocols/pocsag.h index a33cc090fad..dd799efe46b 100644 --- a/lib/subghz/protocols/pocsag.h +++ b/lib/subghz/protocols/pocsag.h @@ -2,6 +2,6 @@ #include "base.h" -#define SUBGHZ_PROTOCOL_POCSAG "POCSAG" +#define SUBGHZ_PROTOCOL_POCSAG_NAME "POCSAG" extern const SubGhzProtocol subghz_protocol_pocsag; \ No newline at end of file From ce013251f2659a1e1f053af9feda35bdfc09724c Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 26 Nov 2022 17:23:59 +0100 Subject: [PATCH 24/26] Fix count of packets in unit test --- applications/debug/unit_tests/subghz/subghz_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index ba9fdefe9a1..266cba8dd04 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -13,7 +13,7 @@ #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") -#define TEST_RANDOM_COUNT_PARSE 250 +#define TEST_RANDOM_COUNT_PARSE 248 #define TEST_TIMEOUT 10000 static SubGhzEnvironment* environment_handler; From b5c5fff555aec61b3a46fe66483b84ef97314fd2 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 26 Nov 2022 17:25:24 +0100 Subject: [PATCH 25/26] Merge errors --- .../debug/unit_tests/subghz/subghz_test.c | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index 266cba8dd04..08a0dc2561b 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -437,19 +437,18 @@ MU_TEST(subghz_decoder_clemsa_test) { "Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); } -<<<<<<< HEAD -MU_TEST(subghz_decoder_pocsag_test) { - mu_assert( - subghz_decoder_test( - EXT_PATH("unit_tests/subghz/pocsag.sub"), SUBGHZ_PROTOCOL_POCSAG_NAME), - "Test decoder " SUBGHZ_PROTOCOL_POCSAG_NAME " error\r\n"); -======= MU_TEST(subghz_decoder_ansonic_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/ansonic_raw.sub"), SUBGHZ_PROTOCOL_ANSONIC_NAME), "Test decoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n"); ->>>>>>> dev +} + +MU_TEST(subghz_decoder_pocsag_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/pocsag.sub"), SUBGHZ_PROTOCOL_POCSAG_NAME), + "Test decoder " SUBGHZ_PROTOCOL_POCSAG_NAME " error\r\n"); } //test encoders @@ -619,11 +618,8 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_magellan_test); MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_clemsa_test); -<<<<<<< HEAD - MU_RUN_TEST(subghz_decoder_pocsag_test); -======= MU_RUN_TEST(subghz_decoder_ansonic_test); ->>>>>>> dev + MU_RUN_TEST(subghz_decoder_pocsag_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); From dd578eb91c95756a1aad5fee807040e71fc064dc Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sat, 26 Nov 2022 17:47:56 +0100 Subject: [PATCH 26/26] Make linter happy --- .../debug/unit_tests/subghz/subghz_test.c | 9 +- lib/subghz/protocols/pocsag.c | 145 ++++++++---------- lib/subghz/protocols/pocsag.h | 2 +- 3 files changed, 67 insertions(+), 89 deletions(-) diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index 08a0dc2561b..1c279f9dbf0 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -445,10 +445,9 @@ MU_TEST(subghz_decoder_ansonic_test) { } MU_TEST(subghz_decoder_pocsag_test) { - mu_assert( - subghz_decoder_test( - EXT_PATH("unit_tests/subghz/pocsag.sub"), SUBGHZ_PROTOCOL_POCSAG_NAME), - "Test decoder " SUBGHZ_PROTOCOL_POCSAG_NAME " error\r\n"); + mu_assert( + subghz_decoder_test(EXT_PATH("unit_tests/subghz/pocsag.sub"), SUBGHZ_PROTOCOL_POCSAG_NAME), + "Test decoder " SUBGHZ_PROTOCOL_POCSAG_NAME " error\r\n"); } //test encoders @@ -619,7 +618,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_clemsa_test); MU_RUN_TEST(subghz_decoder_ansonic_test); - MU_RUN_TEST(subghz_decoder_pocsag_test); + MU_RUN_TEST(subghz_decoder_pocsag_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); diff --git a/lib/subghz/protocols/pocsag.c b/lib/subghz/protocols/pocsag.c index e8fe7968a3a..cd531660b2a 100644 --- a/lib/subghz/protocols/pocsag.c +++ b/lib/subghz/protocols/pocsag.c @@ -16,24 +16,18 @@ static const SubGhzBlockConst pocsag_const = { }; // Minimal amount of sync bits (interleaving zeros and ones) -#define POCSAG_MIN_SYNC_BITS 32 -#define POCSAG_CW_BITS 32 -#define POCSAG_CW_MASK 0xFFFFFFFF -#define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 -#define POCSAG_IDLE_CODE_WORD 0x7A89C197 - -#define POCSAG_FUNC_NUM 0 -#define POCSAG_FUNC_ALERT1 1 -#define POCSAG_FUNC_ALERT2 2 -#define POCSAG_FUNC_ALPHANUM 3 - -static const char* func_msg[] = { - "num: ", - "alert", - "alert: ", - "msg: ", -}; - +#define POCSAG_MIN_SYNC_BITS 32 +#define POCSAG_CW_BITS 32 +#define POCSAG_CW_MASK 0xFFFFFFFF +#define POCSAG_FRAME_SYNC_CODE 0x7CD215D8 +#define POCSAG_IDLE_CODE_WORD 0x7A89C197 + +#define POCSAG_FUNC_NUM 0 +#define POCSAG_FUNC_ALERT1 1 +#define POCSAG_FUNC_ALERT2 2 +#define POCSAG_FUNC_ALPHANUM 3 + +static const char* func_msg[] = {"num: ", "alert", "alert: ", "msg: "}; static const char* bcd_chars = "*U -)("; struct SubGhzProtocolDecoderPocsag { @@ -66,7 +60,6 @@ typedef enum { PocsagDecoderStepMessage, } PocsagDecoderStep; - void* subghz_protocol_decoder_pocsag_alloc(SubGhzEnvironment* environment) { UNUSED(environment); @@ -100,24 +93,21 @@ void subghz_protocol_decoder_pocsag_reset(void* context) { furi_string_reset(instance->done_msg); } - static void pocsag_decode_address_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { instance->ric = (data >> 13); instance->ric = (instance->ric << 3) | (instance->codeword_idx >> 1); instance->func = (data >> 11) & 0b11; } - static bool decode_message_alphanumeric(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { - for (uint8_t i = 0; i < 20; i++) { + for(uint8_t i = 0; i < 20; i++) { instance->char_data >>= 1; - if (data & (1 << 30)) { - instance->char_data |= 1<<6; + if(data & (1 << 30)) { + instance->char_data |= 1 << 6; } instance->char_bits++; - if (instance->char_bits == 7) { - if (instance->char_data == 0) - return false; + if(instance->char_bits == 7) { + if(instance->char_data == 0) return false; furi_string_push_back(instance->msg, instance->char_data); instance->char_data = 0; instance->char_bits = 0; @@ -127,54 +117,47 @@ static bool decode_message_alphanumeric(SubGhzProtocolDecoderPocsag* instance, u return true; } - static void decode_message_numeric(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { // 5 groups with 4 bits each uint8_t val; - for (uint8_t i = 0; i < 5; i++) { - val = (data >> (27 - i*4)) & 0b1111; + for(uint8_t i = 0; i < 5; i++) { + val = (data >> (27 - i * 4)) & 0b1111; // reverse the order of 4 bits val = (val & 0x5) << 1 | (val & 0xA) >> 1; val = (val & 0x3) << 2 | (val & 0xC) >> 2; - if (val <= 9) + if(val <= 9) val += '0'; else - val = bcd_chars[val-10]; + val = bcd_chars[val - 10]; furi_string_push_back(instance->msg, val); } } - // decode message word, maintaining instance state for partial decoding. Return true if more data // might follow or false if end of message reached. static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, uint32_t data) { - switch (instance->func) { - case POCSAG_FUNC_ALERT2: - case POCSAG_FUNC_ALPHANUM: - return decode_message_alphanumeric(instance, data); - - case POCSAG_FUNC_NUM: - decode_message_numeric(instance, data); - return true; + switch(instance->func) { + case POCSAG_FUNC_ALERT2: + case POCSAG_FUNC_ALPHANUM: + return decode_message_alphanumeric(instance, data); + + case POCSAG_FUNC_NUM: + decode_message_numeric(instance, data); + return true; } return false; } - // Function called when current message got decoded, but other messages might follow static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { // append the message to the long-term storage string - furi_string_cat_printf( - instance->done_msg, - "RIC: %" PRIu32 ", ", - instance->ric - ); - - furi_string_cat_str(instance->done_msg, func_msg[instance->func]); - if (instance->func != POCSAG_FUNC_ALERT1) - furi_string_cat(instance->done_msg, instance->msg); - furi_string_cat_str(instance->done_msg, "\r\n"); + furi_string_cat_printf(instance->done_msg, "RIC: %" PRIu32 ", ", instance->ric); + furi_string_cat_str(instance->done_msg, func_msg[instance->func]); + if(instance->func != POCSAG_FUNC_ALERT1) { + furi_string_cat(instance->done_msg, instance->msg); + } + furi_string_cat_str(instance->done_msg, "\r\n"); // reset the state instance->char_bits = 0; @@ -182,22 +165,20 @@ static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { furi_string_reset(instance->msg); } - void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t duration) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; // reset state - waiting for 32 bits of interleaving 1s and 0s - if (instance->decoder.parser_step == PocsagDecoderStepReset) { - if (DURATION_DIFF(duration, pocsag_const.te_short) < pocsag_const.te_delta) { + if(instance->decoder.parser_step == PocsagDecoderStepReset) { + if(DURATION_DIFF(duration, pocsag_const.te_short) < pocsag_const.te_delta) { // POCSAG signals are inverted subghz_protocol_blocks_add_bit(&instance->decoder, !level); - if (instance->decoder.decode_count_bit == POCSAG_MIN_SYNC_BITS) { + if(instance->decoder.decode_count_bit == POCSAG_MIN_SYNC_BITS) { instance->decoder.parser_step = PocsagDecoderStepFoundSync; } - } - else if (instance->decoder.decode_count_bit > 0 ) { + } else if(instance->decoder.decode_count_bit > 0) { subghz_protocol_decoder_pocsag_reset(context); } return; @@ -206,11 +187,11 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur int bits_count = duration / pocsag_const.te_short; uint32_t extra = duration - pocsag_const.te_short * bits_count; - if (DURATION_DIFF(extra, pocsag_const.te_short) < pocsag_const.te_delta) + if(DURATION_DIFF(extra, pocsag_const.te_short) < pocsag_const.te_delta) bits_count++; - else if (extra > pocsag_const.te_delta) { + else if(extra > pocsag_const.te_delta) { // in non-reset state we faced the error signal - we reached the end of the packet, flush data - if (furi_string_size(instance->done_msg) > 0) { + if(furi_string_size(instance->done_msg) > 0) { if(instance->base.callback) instance->base.callback(&instance->base, instance->base.context); } @@ -221,12 +202,12 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur uint32_t codeword; // handle state machine for every incoming bit - while (bits_count-- > 0) { + while(bits_count-- > 0) { subghz_protocol_blocks_add_bit(&instance->decoder, !level); switch(instance->decoder.parser_step) { case PocsagDecoderStepFoundSync: - if ((instance->decoder.decode_data & POCSAG_CW_MASK) == POCSAG_FRAME_SYNC_CODE) { + if((instance->decoder.decode_data & POCSAG_CW_MASK) == POCSAG_FRAME_SYNC_CODE) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; instance->decoder.decode_count_bit = 0; instance->decoder.decode_data = 0UL; @@ -234,9 +215,9 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur break; case PocsagDecoderStepFoundPreamble: // handle codewords - if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { + if(instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); - switch (codeword) { + switch(codeword) { case POCSAG_IDLE_CODE_WORD: instance->codeword_idx++; break; @@ -245,7 +226,7 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur break; default: // Here we expect only address messages - if (codeword >> 31 == 0) { + if(codeword >> 31 == 0) { pocsag_decode_address_word(instance, codeword); instance->decoder.parser_step = PocsagDecoderStepMessage; } @@ -257,9 +238,9 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur break; case PocsagDecoderStepMessage: - if (instance->decoder.decode_count_bit == POCSAG_CW_BITS) { + if(instance->decoder.decode_count_bit == POCSAG_CW_BITS) { codeword = (uint32_t)(instance->decoder.decode_data & POCSAG_CW_MASK); - switch (codeword) { + switch(codeword) { case POCSAG_IDLE_CODE_WORD: // Idle during the message stops the message instance->codeword_idx++; @@ -271,11 +252,11 @@ void subghz_protocol_decoder_pocsag_feed(void* context, bool level, uint32_t dur break; default: // In this state, both address and message words can arrive - if (codeword >> 31 == 0) { + if(codeword >> 31 == 0) { pocsag_message_done(instance); pocsag_decode_address_word(instance, codeword); } else { - if (!pocsag_decode_message_word(instance, codeword)) { + if(!pocsag_decode_message_word(instance, codeword)) { instance->decoder.parser_step = PocsagDecoderStepFoundPreamble; pocsag_message_done(instance); } @@ -299,13 +280,15 @@ uint8_t subghz_protocol_decoder_pocsag_get_hash_data(void* context) { return hash; } -bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flipper_format, SubGhzRadioPreset* preset) { +bool subghz_protocol_decoder_pocsag_serialize( + void* context, + FlipperFormat* flipper_format, + SubGhzRadioPreset* preset) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; uint32_t msg_len; - if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) - return false; + if(!subghz_block_generic_serialize(&instance->generic, flipper_format, preset)) return false; msg_len = furi_string_size(instance->done_msg); if(!flipper_format_write_uint32(flipper_format, "MsgLen", &msg_len, 1)) { @@ -313,9 +296,8 @@ bool subghz_protocol_decoder_pocsag_serialize(void* context, FlipperFormat* flip return false; } - if(!flipper_format_write_hex(flipper_format, "Msg", (uint8_t*)furi_string_get_cstr(instance->done_msg), - msg_len)) - { + uint8_t* s = (uint8_t*)furi_string_get_cstr(instance->done_msg); + if(!flipper_format_write_hex(flipper_format, "Msg", s, msg_len)) { FURI_LOG_E(TAG, "Error adding Msg"); return false; } @@ -356,11 +338,7 @@ bool subghz_protocol_decoder_pocsag_deserialize(void* context, FlipperFormat* fl void subhz_protocol_decoder_pocsag_get_string(void* context, FuriString* output) { furi_assert(context); SubGhzProtocolDecoderPocsag* instance = context; - furi_string_cat_printf( - output, - "%s\r\n", - instance->generic.protocol_name - ); + furi_string_cat_printf(output, "%s\r\n", instance->generic.protocol_name); furi_string_cat(output, instance->done_msg); } @@ -378,7 +356,8 @@ const SubGhzProtocolDecoder subghz_protocol_pocsag_decoder = { const SubGhzProtocol subghz_protocol_pocsag = { .name = SUBGHZ_PROTOCOL_POCSAG_NAME, .type = SubGhzProtocolTypeStatic, - .flag = SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Load, + .flag = SubGhzProtocolFlag_FM | SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save | + SubGhzProtocolFlag_Load, .decoder = &subghz_protocol_pocsag_decoder, -}; \ No newline at end of file +}; diff --git a/lib/subghz/protocols/pocsag.h b/lib/subghz/protocols/pocsag.h index dd799efe46b..5700e24015f 100644 --- a/lib/subghz/protocols/pocsag.h +++ b/lib/subghz/protocols/pocsag.h @@ -4,4 +4,4 @@ #define SUBGHZ_PROTOCOL_POCSAG_NAME "POCSAG" -extern const SubGhzProtocol subghz_protocol_pocsag; \ No newline at end of file +extern const SubGhzProtocol subghz_protocol_pocsag;