From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Tue, 18 Jul 2023 15:41:58 +0000 (-0600) Subject: deprecate wbt formats. (#1136) X-Git-Tag: archive/raspbian/1.10.0+ds-2+rpi1~1^2~12^2~1^2~42 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7d5cc780cd8a7024f4d4738af74324c85154713e;p=gpsbabel.git deprecate wbt formats. (#1136) --- diff --git a/CMakeLists.txt b/CMakeLists.txt index cfd123141..02ef0a5f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,6 @@ set(MINIMAL_FMTS gpx.cc kml.cc nmea.cc - wbt-200.cc ) # ALL_FMTS diff --git a/deprecated/wbt-200.cc b/deprecated/wbt-200.cc new file mode 100644 index 000000000..f88b54286 --- /dev/null +++ b/deprecated/wbt-200.cc @@ -0,0 +1,1101 @@ +/* + * Serial download of track data from a Wintec WBT-200. + * + * Copyright (C) 2006 Andy Armstrong + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include // for array +#include // for isprint +#include // for va_end, va_list, va_start +#include // for uint32_t, int32_t, int16_t, uint16_t +#include // for size_t, snprintf, fread, fclose, feof, vprintf, FILE +#include // for strtod, strtoul +#include // for strlen, memcmp, memcpy + +#include // for QByteArray +#include // for QDate +#include // for QDateTime +#include // for QString +#include // for QTime +#include // for QVector +#include // for UTC +#include // for qPrintable + +#include "defs.h" +#include "gbser.h" // for gbser_set_port, gbser_deinit, gbser_flush, gbser_init, gbser_print, gbser_read_line, gbser_read_wait, gbser_readc_wait, gbser_OK + + +#define MYNAME "WBT-100/200" +#define NL "\x0D\x0A" + +#define WBT200BAUD 9600 + +#define WBT201BAUD 57600 +#define WBT201CHUNK 4096 + +#define TIMEOUT 5000 + +#define RECLEN_V1 12 +#define RECLEN_V2 16 + +#define RECLEN_WBT201 16 + +/* tk1 file format stuff */ + +#define TK1_MAGIC "WintecLogFormat" +#define TK1_DATA_OFFSET 0x0400 +#define TK1_END_FLAG 0x04000000ul + +/* Used to sanity check data - from + * http://hypertextbook.com/facts/2001/DanaWollman.shtml + * The MAXALT check doesn't need to be enabled unless there's + * a format with larger records than V2. + */ +/*#define MAXALT 120000*/ + +#define _MAX(a, b) ((a) > (b) ? (a) : (b)) +#define RECLEN_MAX _MAX(RECLEN_V1, RECLEN_V2) + +/* Flags for WBT201 */ +enum { + WBT201_TRACK_START = 0x01, + WBT201_WAYPOINT = 0x02, + WBT201_OVER_SPEED = 0x04 +}; + +#define BUFSPEC(b) b, sizeof(b) + +/* The formats here must be in ascending record length order so that + * each format identification attempt can read more data from the + * device if necessary. If that proves to be a bad order to try the + * heuristics the format matching code will have to be rejigged. + */ +static struct { + size_t reclen; +} fmt_version[] = { + { RECLEN_V1 }, + { RECLEN_V2 }, + { 0 } +}; + +/* Number of lines to skip while waiting for an ACK from a command. I've seen + * conversations with up to 30 lines of cruft before the response so 60 isn't + * too crazy. + */ +#define RETRIES 60 + +/* + * For WBT-200 protocol documentation see: + * http://hexten.net/wiki/index.php/WBT-200_Comms_Protocol + */ + +static void* fd; +static FILE* fl; +static char* opt_erase; + +enum wintec_gps_types { + UNKNOWN, WBT200, WBT201, WSG1000 +}; + +static wintec_gps_types dev_type = UNKNOWN; + +struct buf_chunk { + struct buf_chunk* next; + size_t size; + size_t used; + /* data follows in memory */ +}; + +#define buf_CHUNK_DATA(c) \ + ((void *) ((struct buf_chunk *) (c) + 1)) + +#define buf_CHUNK_PTR(c, offset) \ + ((void *) ((char *) buf_CHUNK_DATA(c) + (offset))) + +struct buf_head { + struct buf_chunk* head; + struct buf_chunk* tail; + size_t alloc; + size_t used; + /* read position */ + struct buf_chunk* current; + unsigned long offset; + /* shoehorned in here primarily out of laziness */ + unsigned checksum; +}; + +struct read_state { + route_head* route_head_; + unsigned wpn, tpn; + + struct buf_head data; +}; + +[[gnu::format(printf, 2, 3)]] static void db(int l, const char* msg, ...) +{ + va_list ap; + va_start(ap, msg); + if (global_opts.debug_level >= l) { + vprintf(msg, ap); + } + va_end(ap); +} + +/* Growable buffer support. TODO: Put this in a separate file and + * tidy up its interface. + */ + +static void buf_init(struct buf_head* h, size_t alloc) +{ + h->head = nullptr; + h->tail = nullptr; + h->alloc = alloc; + h->used = 0; + h->checksum = 0; + h->offset = 0; +} + +static void buf_empty(struct buf_head* h) +{ + struct buf_chunk* next; + for (struct buf_chunk* chunk = h->head; chunk; chunk = next) { + next = chunk->next; + xfree(chunk); + } + h->head = nullptr; + h->tail = nullptr; + h->used = 0; + h->checksum = 0; +} + +static void buf_rewind(struct buf_head* h) +{ + h->current = h->head; + h->offset = 0; +} + +static size_t buf_read(struct buf_head* h, void* data, size_t len) +{ + char* bp = (char*) data; + size_t got = 0; + + while (len != 0 && h->current != nullptr) { + size_t avail = h->current->used - h->offset; + if (avail > len) { + avail = len; + } + + /* Allow NULL buffer pointer to skip bytes */ + if (nullptr != bp) { + memcpy(bp, buf_CHUNK_PTR(h->current, h->offset), avail); + bp += avail; + } + + h->offset += avail; + len -= avail; + got += avail; + + if (h->offset == h->current->used) { + h->current = h->current->next; + h->offset = 0; + } + } + + return got; +} + +static void buf_extend(struct buf_head* h, size_t amt) +{ + size_t sz = amt + sizeof(struct buf_chunk); + + auto* c = (struct buf_chunk*) xmalloc(sz); + c->next = nullptr; + c->size = amt; + c->used = 0; + + if (nullptr == h->head) { + h->head = c; + } else { + h->tail->next = c; + } + + h->tail = c; +} + +static void buf_update_checksum(struct buf_head* h, const void* data, size_t len) +{ + auto* cp = static_cast(data); + + db(4, "Updating checksum with %p, %zu, before: %02x ", + data, len, h->checksum); + for (unsigned i = 0; i < len; i++) { + h->checksum ^= cp[i]; + } + db(4, "after: %02x\n", h->checksum); +} + +static void buf_write(struct buf_head* h, const void* data, size_t len) +{ + const char* bp = (const char*) data; + + buf_update_checksum(h, data, len); + + h->used += len; + + if (nullptr == h->tail) { + buf_extend(h, h->alloc); + } + + for (;;) { + size_t avail = h->tail->size - h->tail->used; + if (avail > len) { + avail = len; + } + + memcpy((char*) buf_CHUNK_PTR(h->tail, h->tail->used), bp, avail); + h->tail->used += avail; + bp += avail; + len -= avail; + if (len == 0) { + break; + } + buf_extend(h, h->alloc); + } +} + +static void rd_drain() +{ + if (gbser_flush(fd)) { + fatal(MYNAME ": Comm error\n"); + } +} + +static void rd_line(char* buf, int len) +{ + int rc; + if (rc = gbser_read_line(fd, buf, len, TIMEOUT, 0x0A, 0x0D), rc != gbser_OK) { + fatal(MYNAME ": Read error (%d)\n", rc); + } + db(3, "Got response: \"%s\"\n", buf); +} + +static void wr_cmd(const char* cmd) +{ + int rc; + db(3, "Sending: %s\n", cmd); + if (rc = gbser_print(fd, cmd), gbser_OK != rc) { + fatal(MYNAME ": Write error (%d)\n", rc); + } +} + +static void wr_cmdl(const char* cmd) +{ + wr_cmd(cmd); + wr_cmd(NL); +} + +static int expect(const char* str) +{ + int state = 0; + int errors = 5; /* allow this many errors */ + + for (int i = 0; i < 5000; i++) { + /* reached end of string */ + if (str[state] == '\0') { + return 1; + } + + int c = gbser_readc_wait(fd, 500); + if (c < 0) { + db(3, "Got error: %d\n", c); + if (--errors <= 0) { + return 0; + } + } else { + db(3, "Got char: %02x '%c'\n", c, isprint(c) ? c : '.'); + if (c == str[state]) { + state++; /* carry on */ + } else { + state = 0; /* go back to start */ + } + } + } + + return 0; +} + +static int wbt200_try() +{ + int rc; + + db(1, "Trying WBT100/200\n"); + + if ((rc = gbser_set_port(fd, WBT200BAUD, 8, 0, 1))) { + db(1, "Set baud rate to %d failed (%d)\n", WBT200BAUD, rc); + return 0; + } + + wr_cmdl("$PFST,NORMAL"); + return expect("$PFST"); +} + +static int wbt201_try() +{ + int rc; + + db(1, "Trying WBT201/G-Rays 2\n"); + + if ((rc = gbser_set_port(fd, WBT201BAUD, 8, 0, 1))) { + db(1, "Set baud rate to %d failed (%d)\n", WBT201BAUD, rc); + return 0; + } + + wr_cmdl("@AL"); + return expect("@AL"); +} + +static int wsg1000_try() +{ + int rc; + + db(1, "Trying WSG 1000/G-Rays 2\n"); + + if ((rc = gbser_set_port(fd, WBT201BAUD, 8, 0, 1))) { + db(1, "Set baud rate to %d failed (%d)\n", WBT201BAUD, rc); + return 0; + } + + wr_cmdl("@AL,2,3"); + return expect("@AL,2,3,OK"); +} + +static wintec_gps_types guess_device() +{ + db(1, "Guessing device...\n"); + for (int i = 0; i < 5; i++) { + if (wbt200_try()) { + return WBT200; + } + if (wbt201_try()) { + return WBT201; + } + if (wsg1000_try()) { + return WSG1000; + } + } + return UNKNOWN; + +} + +static void rd_init(const QString& fname) +{ + db(1, "Opening port...\n"); + if ((fd = gbser_init(qPrintable(fname))) == nullptr) { + fatal(MYNAME ": Can't initialise port \"%s\"\n", qPrintable(fname)); + } + + dev_type = guess_device(); + if (UNKNOWN == dev_type) { + fatal(MYNAME ": Can't determine device type\n"); + } +} + +static void rd_deinit() +{ + db(1, "Closing port...\n"); + gbser_deinit(fd); + fd = nullptr; +} + +static int rd_buf(void* buf, int len) +{ + int rc; + if (rc = gbser_read_wait(fd, buf, len, TIMEOUT), rc < 0) { + fatal(MYNAME ": Read error (%d)\n", rc); + } else if (rc < len) { + db(2, MYNAME ": Read timeout, got %i of %i bytes\n", rc, len); + return 0; + } + return 1; +} + +static void file_init(const QString& fname) +{ + db(1, "Opening file...\n"); + if ((fl = ufopen(fname, "rb")) == nullptr) { + fatal(MYNAME ": Can't open file '%s'\n", qPrintable(fname)); + } +} + +static void file_deinit() +{ + db(1, "Closing file...\n"); + fclose(fl); +} + +static int starts_with(const char* buf, const char* pat) +{ + size_t pat_len = strlen(pat); + return (pat_len <= strlen(buf)) + ? (memcmp(buf, pat, pat_len) == 0) + : 0; +} + +/* Send a command then wait for a line starting with the command string + * to be returned. + */ +static int do_cmd(const char* cmd, const char* expect, char* buf, int len) +{ + rd_drain(); + wr_cmdl(cmd); + + db(2, "Cmd: %s\n", cmd); + + /* We may need to skip a load of data to start with - the unit streams + * NMEA data all the time so it's highly likely that it'll be in the + * middle of an NMEA sentence when we start listening. + */ + for (int trycount = 0; trycount < RETRIES; trycount++) { + rd_line(buf, len); + db(3, "Got: %s\n", buf); + if (starts_with(buf, expect)) { + db(2, "Matched: %s\n", buf); + return strlen(expect); + } + db(2, "Skip %d: %s\n", trycount, buf); + } + + fatal(MYNAME ": Bad response from unit\n"); + return 0; /* keep compiler quiet */ +} + +/* Issue a command that expects the same string to be echoed + * back as an ACK + */ +static int do_simple(const char* cmd, char* buf, int len) +{ + return do_cmd(cmd, cmd, buf, len); +} + +static char* get_param(const char* cmd, char* buf, int len) +{ + int cl = do_simple(cmd, buf, len); + return buf + cl + 1; +} + +static int get_param_int(const char* cmd) +{ + char buf[80]; + return xstrtoi(get_param(cmd, buf, sizeof(buf)), nullptr, 10); +} + +static double get_param_float(const char* cmd) +{ + char buf[80]; + return strtod(get_param(cmd, buf, sizeof(buf)), nullptr); +} + +/* Decompose binary date into discreet fields */ +std::array split_date(uint32_t tim) +{ + int sec = (((tim) >> 0) & 0x3F); + int min = (((tim) >> 6) & 0x3F); + int hour = (((tim) >> 12) & 0x1F); + int mday = (((tim) >> 17) & 0x1F); + int mon = (((tim) >> 22) & 0x0F); + int year = (((tim) >> 26) & 0x3F); + return {sec, min, hour, mday, mon, year}; +} + +static QDateTime decode_date(uint32_t tim) +{ + auto [sec, min, hour, mday, mon, year] = split_date(tim); + return {QDate(year + 2000, mon, mday), QTime(hour, min, sec), Qt::UTC}; +} + +static bool check_date(uint32_t tim) +{ + auto [sec, min, hour, mday, mon, year] = split_date(tim); + + /* Sanity check the date. We don't allow years prior to 2004 because zero in + * those bits will usually indicate that we have an altitude instead of a + * date (i.e. that the data is the new format that uses 16 byte records). + */ + return sec < 60 && min < 60 && hour < 24 && + mday > 0 && mday <= 31 && mon > 0 && mon <= 12 && year >= 4; +} + +static Waypoint* make_point(double lat, double lon, double alt, const QDateTime& tim, const char* fmt, int index) +{ + auto* wpt = new Waypoint; + + wpt->latitude = lat; + wpt->longitude = lon; + wpt->altitude = alt; + wpt->SetCreationTime(tim); + wpt->shortname = QString::asprintf(fmt, index); + + return wpt; +} + +static Waypoint* make_waypoint(struct read_state* st, double lat, double lon, double alt, const QDateTime& tim) +{ + return make_point(lat, lon, alt, tim, "WP%04d", ++st->wpn); +} + +static Waypoint* make_trackpoint(struct read_state* st, double lat, double lon, double alt, const QDateTime& tim) +{ + return make_point(lat, lon, alt, tim, "TP%04d", ++st->tpn); +} + +static int wbt200_data_chunk(struct read_state* st, const void* buf, int fmt) +{ + double alt; + const char* bp = (const char*) buf; + size_t buf_used = fmt_version[fmt].reclen; + + uint32_t tim = le_read32(bp + 0); + + double lat = (double)((int32_t) le_read32(bp + 4)) / 10000000; + double lon = (double)((int32_t) le_read32(bp + 8)) / 10000000; + + /* Handle extra fields in longer records here. */ + if (buf_used >= 16) { + alt = (double) le_read32(bp + 12) / 10; + } else { + alt = unknown_alt; + } + + QDateTime rtim = decode_date(tim); + + if (lat >= 100) { + /* Start new track in the northern hemisphere */ + lat -= 100; + st->route_head_ = nullptr; + } else if (lat <= -100) { + /* Start new track in the southern hemisphere */ + /* This fix courtesy of Anton Frolich */ + lat += 100; + st->route_head_ = nullptr; + } + + Waypoint* tpt = make_trackpoint(st, lat, lon, alt, rtim); + + if (nullptr == st->route_head_) { + db(1, "New Track\n"); + st->route_head_ = new route_head; + track_add_head(st->route_head_); + } + + track_add_wpt(st->route_head_, tpt); + + return 1; +} + +/* Return true iff the data appears valid with the specified record length */ +static bool is_valid(struct buf_head* h, int fmt) +{ + char buf[RECLEN_MAX]; + size_t reclen = fmt_version[fmt].reclen; + + buf_rewind(h); + + db(2, "Checking %zu bytes of data against format %d\n", h->used, fmt); + + for (;;) { + size_t got = buf_read(h, buf, reclen); + /* Don't mind odd bytes at the end - we may + * be examining an incomplete dataset. + */ + if (got != reclen) { + break; + } + + uint32_t tim = le_read32(buf + 0); + if (!check_date(tim)) { + return false; + } + + if (reclen > 12) { +#ifdef MAXALT + uint32_t alt = le_read32(buf + 12); + if (alt > MAXALT * 10) { + return false; + } +#endif + } + } + + return true; +} + +static void wbt200_process_data(struct read_state* pst, int fmt) +{ + char buf[RECLEN_MAX]; + size_t reclen = fmt_version[fmt].reclen; + + buf_rewind(&pst->data); + + db(2, "Processing %zu bytes of data using format %d\n", pst->data.used, fmt); + + for (;;) { + size_t got = buf_read(&pst->data, buf, reclen); + if (got != reclen) { + break; + } + wbt200_data_chunk(pst, buf, fmt); + } +} + +static void state_init(struct read_state* pst) +{ + pst->route_head_ = nullptr; + pst->wpn = 0; + pst->tpn = 0; + + buf_init(&pst->data, RECLEN_V1 * RECLEN_V2); +} + +static void state_empty(struct read_state* pst) +{ + buf_empty(&pst->data); + state_init(pst); +} + +static int want_bytes(struct buf_head* h, size_t len) +{ + char buf[512]; + + db(3, "Reading %zu bytes from device\n", len); + + while (len > 0) { + size_t want = sizeof(buf); + if (want > len) { + want = len; + } + if (!rd_buf(buf, want)) { + return 0; + } + buf_write(h, buf, want); + len -= want; + } + return 1; +} + +static void wbt200_data_read() +{ + /* Awooga! Awooga! Statically allocated buffer danger! + * Actually, it's OK because rd_line can read arbitrarily + * long lines returning only the first N characters + */ + char line_buf[100]; + int fmt; + struct read_state st; + + state_init(&st); + + /* We could potentially parse the version string to find out which + * data format to use - but it's not clear how the version string + * will increment in the future - so just now it's more future- + * proof to rely on analysing the data. We need to be able to do + * that with files anyway - because they're not versioned. + */ + do_simple("$PFST,FIRMWAREVERSION", BUFSPEC(line_buf)); + + do_simple("$PFST,NORMAL", BUFSPEC(line_buf)); + do_simple("$PFST,READLOGGER", BUFSPEC(line_buf)); + + /* Now we're into binary mode */ + rd_buf(line_buf, 6); /* six byte header */ + unsigned long count = le_read16(line_buf + 2) + 1; + if (count == 0x10000) { + count = 0; + } + + db(3, "%lu points available\n", count); + + /* Loop through the known formats requesting more data from the + * device each time. When the device contains only a single + * point the first format will get a false positive - so we'll + * lose the altitude data. + */ + for (fmt = 0; fmt_version[fmt].reclen != 0; fmt++) { + size_t reclen = fmt_version[fmt].reclen; + size_t want = reclen * count; + + if (want < st.data.used) { + fatal(MYNAME ": Internal error: formats not ordered in ascending size order\n"); + } + + db(3, "Want %zu bytes of data\n", want); + + /* Top up the buffer */ + want_bytes(&st.data, want - st.data.used); + + /* And see if it's valid */ + if (is_valid(&st.data, fmt)) { + break; + } + } + + if (fmt_version[fmt].reclen == 0) { + fatal(MYNAME ": Can't autodetect data format\n"); + } + + wbt200_process_data(&st, fmt); + + /* Erase data? */ + + if (*opt_erase != '0') { + int f; + db(1, "Erasing data\n"); + for (f = 27; f <= 31; f++) { + snprintf(line_buf, sizeof(line_buf), "$PFST,REMOVEFILE,%d", f); + do_cmd(line_buf, "$PFST,REMOVEFILE", BUFSPEC(line_buf)); + } + db(1, "Reclaiming free space\n"); + for (f = 0; f <= 3; f++) { + snprintf(line_buf, sizeof(line_buf), "$PFST,FFSRECLAIM,%d", f); + do_cmd(line_buf, "$PFST,FFSRECLAIM", BUFSPEC(line_buf)); + } + } + + do_simple("$PFST,NORMAL", BUFSPEC(line_buf)); + + state_empty(&st); +} + +static int all_null(const void* buf, const int len) +{ + const char* bp = (const char*) buf; + + for (int i = 0; i < len; i++) { + if (bp[i]) { + return 0; + } + } + + return 1; +} + +static int wbt201_data_chunk(struct read_state* st, const void* buf) +{ + const char* bp = (const char*) buf; + + /* Zero records are skipped */ + if (all_null(buf, RECLEN_WBT201)) { + return 1; + } + + uint16_t flags = le_read16(bp + 0); + uint32_t tim = le_read32(bp + 2); + + if (TK1_END_FLAG == tim) { + /* EOF? (TK1 files only as far as I know) */ + return 0; + } + + double lat = (double)((int32_t) le_read32(bp + 6)) / 10000000; + double lon = (double)((int32_t) le_read32(bp + 10)) / 10000000; + auto alt = (double)((int16_t) le_read16(bp + 14)); + + QDateTime rtim = decode_date(tim); + + if ((flags & WBT201_WAYPOINT) && (global_opts.masked_objective & WPTDATAMASK)) { + Waypoint* wpt = make_waypoint(st, lat, lon, alt, rtim); + waypt_add(wpt); + } + + if (global_opts.masked_objective & TRKDATAMASK) { + if (flags & WBT201_TRACK_START) { + st->route_head_ = nullptr; + } + + Waypoint* tpt = make_trackpoint(st, lat, lon, alt, rtim); + + if (nullptr == st->route_head_) { + db(1, "New Track\n"); + st->route_head_ = new route_head; + track_add_head(st->route_head_); + } + + track_add_wpt(st->route_head_, tpt); + } + + return 1; +} + +static void wbt201_process_chunk(struct read_state* st) +{ + char buf[RECLEN_WBT201]; + + db(2, "Processing %zu bytes of data\n", st->data.used); + + while (buf_read(&st->data, buf, sizeof(buf)) == sizeof(buf) + && wbt201_data_chunk(st, buf)) { + /* do nothing */ + } +} + +static int wbt201_read_chunk(struct read_state* st, unsigned pos, unsigned limit) +{ + char cmd_buf[30]; + char line_buf[100]; + char* op; + static const char* cs_prefix = "@AL,CS,"; + + unsigned want = limit - pos; + if (want > WBT201CHUNK) { + want = WBT201CHUNK; + } + + db(3, "Reading bytes at %u (0x%x), limit = %u (0x%x), want = %u (0x%x)\n", + pos, pos, limit, limit, want, want); + + buf_empty(&st->data); + + rd_drain(); + snprintf(cmd_buf, sizeof(cmd_buf), "@AL,5,3,%u", pos); + wr_cmdl(cmd_buf); + + + if (!want_bytes(&st->data, want)) { + return 0; + } + + /* checksum */ + rd_line(BUFSPEC(line_buf)); + + if (!starts_with(line_buf, cs_prefix)) { + db(2, "Bad checksum response\n"); + return 0; + } + + char* lp = line_buf + strlen(cs_prefix); + unsigned long cs = strtoul(lp, &op, 16); + if (*lp == ',' || *op != ',') { + db(2, "Badly formed checksum\n"); + return 0; + } + + if (cs != st->data.checksum) { + db(2, "Checksums don't match. Got %02lx, expected %02x\n", cs, st->data.checksum); + return 0; + } + + /* ack */ + /* rd_line(BUFSPEC(line_buf)); + return starts_with(line_buf, cmd_buf); + */ + if (dev_type == WBT201) { + rd_line(BUFSPEC(line_buf)); + return starts_with(line_buf, cmd_buf); + } + return 1; + +} + +static void wbt201_data_read() +{ + char line_buf[100]; + struct read_state st; + + /* Read various device information. We don't use much of this yet - + * just log_addr_start and log_addr_end - but it's useful to have it + * here for debug and documentation purposes. + */ + const char* tmp = get_param("@AL,7,1", BUFSPEC(line_buf)); + db(1, "Reading device \"%s\"\n", tmp); + + double ver_hw = get_param_float("@AL,8,1"); + double ver_sw = get_param_float("@AL,8,2"); + double ver_fmt = get_param_float("@AL,8,3"); + + db(2, "versions: hw=%f, sw=%f, fmt=%f\n", + ver_hw, ver_sw, ver_fmt); + + unsigned log_addr_start = get_param_int("@AL,5,1"); /* we read from here... */ + unsigned log_addr_end = get_param_int("@AL,5,2"); /* ...to here, but ... */ + unsigned log_area_start = get_param_int("@AL,5,9"); /* ...we need these when ... */ + unsigned log_area_end = get_param_int("@AL,5,10"); /* ...the gps wrote more then it fits in memory */ + + db(2, "Log addr=(%d..%d), area=(%d..%d)\n", + log_addr_start, log_addr_end, + log_area_start, log_area_end); + + state_init(&st); + + unsigned tries = 10; + + /* If the WBT-201 device logs more then the memory can handle it continues to write at the beginning of the memory, + * thus overwriting the oldest tracks. In this case log_addr_end is smaller then log_addr_start and we need to read + * from log_addr_start to log_area_end and then from log_area_start to log_addr_end. + */ + + unsigned wantbytes = (log_addr_start < log_addr_end) ? log_addr_end - log_addr_start : log_area_end - (log_addr_start - log_addr_end); + unsigned read_pointer = log_addr_start; + unsigned read_limit = (log_addr_start < log_addr_end) ? log_addr_end : log_area_end; + + db(2, "Want %d bytes from device\n", wantbytes); + while (wantbytes > 0) { + db(2, "Read params: Want %d bytes, read_pointer = %d, read_limit = %d\n", wantbytes, read_pointer, read_limit); + if (wbt201_read_chunk(&st, read_pointer, read_limit)) { + buf_rewind(&st.data); + wbt201_process_chunk(&st); + wantbytes -= st.data.used; + read_pointer += st.data.used; + if (read_pointer >= log_area_end) { + read_pointer = log_area_start; + read_limit = log_addr_end; + } + } else { + if (--tries == 0) { + fatal(MYNAME ": Too many data errors during read\n"); + } + } + } + + if (*opt_erase != '0') { + /* erase device */ + do_simple("@AL,5,6", BUFSPEC(line_buf)); + } + + state_empty(&st); + do_simple("@AL,2,1", BUFSPEC(line_buf)); +} + +static void file_read() +{ + char buf[512]; + struct read_state st; + + const char* tk1_magic = TK1_MAGIC; + size_t tk1_magic_len = strlen(tk1_magic) + 1; + + state_init(&st); + + /* Read the whole file into the buffer */ + size_t rc = fread(buf, 1, sizeof(buf), fl); + while (rc != 0) { + buf_write(&st.data, buf, rc); + rc = fread(buf, 1, sizeof(buf), fl); + } + + if (!feof(fl)) { + fatal(MYNAME ": Read error\n"); + } + + /* Although wbt-tk1 and wbt-bin are enumerated as distinct formats + * we handle them both here and autodetect which type we have. + */ + + /* WBT201 TK1 format? */ + + buf_rewind(&st.data); + buf_read(&st.data, buf, tk1_magic_len); + if (memcmp(buf, tk1_magic, tk1_magic_len) == 0) { + db(1, "Got TK1 file\n"); + buf_rewind(&st.data); + /* Seek */ + buf_read(&st.data, nullptr, TK1_DATA_OFFSET); + wbt201_process_chunk(&st); + } else { + db(1, "Got bin file\n"); + + /* Try to guess the data format */ + int fmt; + for (fmt = 0; fmt_version[fmt].reclen != 0; fmt++) { + size_t reclen = fmt_version[fmt].reclen; + if ((st.data.used % reclen) == 0 && is_valid(&st.data, fmt)) { + break; + } + } + + if (fmt_version[fmt].reclen == 0) { + fatal(MYNAME ": Can't autodetect data format\n"); + } + + wbt200_process_data(&st, fmt); + } + + state_empty(&st); +} + +static void data_read() +{ + switch (dev_type) { + case WBT200: + wbt200_data_read(); + break; + case WBT201: + wbt201_data_read(); + break; + case WSG1000: + wbt201_data_read(); + break; + + default: + fatal(MYNAME ": Unknown device type (internal)\n"); + break; + } +} + +/* wbt */ + +static QVector wbt_sargs = { + { + "erase", &opt_erase, "Erase device data after download", + "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr + }, +}; + +/* master process: don't convert anything */ + +ff_vecs_t wbt_svecs = { + ff_type_serial, + { ff_cap_read, ff_cap_read, ff_cap_none }, + rd_init, + nullptr, + rd_deinit, + nullptr, + data_read, + nullptr, + nullptr, + &wbt_sargs, + NULL_POS_OPS +}; + +/* used for wbt-bin /and/ wbt-tk1 */ + +static QVector wbt_fargs = { +}; + +/* master process: don't convert anything */ + +ff_vecs_t wbt_fvecs = { + ff_type_file, + { ff_cap_none, ff_cap_read, ff_cap_none }, + file_init, + nullptr, + file_deinit, + nullptr, + file_read, + nullptr, + nullptr, + &wbt_fargs, + NULL_POS_OPS +}; diff --git a/reference/format0.txt b/reference/format0.txt index fcc70a38a..ee6c7a35f 100644 --- a/reference/format0.txt +++ b/reference/format0.txt @@ -53,6 +53,3 @@ openoffice Tab delimited fields useful for OpenOffice text txt Textual Output unicsv Universal csv with field structure in first line vcard vcf Vcard Output (for iPod) -wbt-bin bin Wintec WBT-100/200 Binary File Format -wbt Wintec WBT-100/200 GPS Download -wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format diff --git a/reference/format1.txt b/reference/format1.txt index 0647159ab..64f40e9d4 100644 --- a/reference/format1.txt +++ b/reference/format1.txt @@ -59,6 +59,3 @@ file openoffice Tab delimited fields useful for OpenOffice file text txt Textual Output file unicsv Universal csv with field structure in first line file vcard vcf Vcard Output (for iPod) -file wbt-bin bin Wintec WBT-100/200 Binary File Format -serial wbt Wintec WBT-100/200 GPS Download -file wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format diff --git a/reference/format2.txt b/reference/format2.txt index 26ff4eb57..5b2cc187e 100644 --- a/reference/format2.txt +++ b/reference/format2.txt @@ -59,6 +59,3 @@ file rw---- openoffice Tab delimited fields useful for OpenOffice file -w---- text txt Textual Output file rwrwrw unicsv Universal csv with field structure in first line file -w---- vcard vcf Vcard Output (for iPod) -file --r--- wbt-bin bin Wintec WBT-100/200 Binary File Format -serial r-r--- wbt Wintec WBT-100/200 GPS Download -file --r--- wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format diff --git a/reference/format3.txt b/reference/format3.txt index ec2986066..524719f6f 100644 --- a/reference/format3.txt +++ b/reference/format3.txt @@ -752,11 +752,3 @@ file -w---- vcard vcf Vcard Output (for iPod) vcard https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vcard.html option vcard encrypt Encrypt hints using ROT13 boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_vcard.html#fmt_vcard_o_encrypt -file --r--- wbt-bin bin Wintec WBT-100/200 Binary File Format wbt-bin - https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wbt-bin.html -serial r-r--- wbt Wintec WBT-100/200 GPS Download wbt - https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wbt.html -option wbt erase Erase device data after download boolean 0 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wbt.html#fmt_wbt_o_erase - -file --r--- wbt-tk1 tk1 Wintec WBT-201/G-Rays 2 Binary File Format wbt-tk1 - https://www.gpsbabel.org/WEB_DOC_DIR/fmt_wbt-tk1.html diff --git a/reference/help.txt b/reference/help.txt index 7dfed5b0f..54552ba97 100644 --- a/reference/help.txt +++ b/reference/help.txt @@ -370,10 +370,6 @@ File Types (-i and -o options): codec codec to use for reading and writing strings (defa vcard Vcard Output (for iPod) encrypt (0/1) Encrypt hints using ROT13 - wbt-bin Wintec WBT-100/200 Binary File Format - wbt Wintec WBT-100/200 GPS Download - erase (0/1) Erase device data after download - wbt-tk1 Wintec WBT-201/G-Rays 2 Binary File Format Supported data filters: arc Include Only Points Within Distance of Arc diff --git a/reference/wbt-200.bin b/reference/wbt-200.bin deleted file mode 100644 index a99d16397..000000000 Binary files a/reference/wbt-200.bin and /dev/null differ diff --git a/reference/wbt-200.gpx b/reference/wbt-200.gpx deleted file mode 100644 index ff07119de..000000000 --- a/reference/wbt-200.gpx +++ /dev/null @@ -1,1049 +0,0 @@ - - - - - - - - - TP0001 - - - - TP0002 - - - - TP0003 - - - - TP0004 - - - - TP0005 - - - - TP0006 - - - - TP0007 - - - - TP0008 - - - - TP0009 - - - - TP0010 - - - - TP0011 - - - - TP0012 - - - - TP0013 - - - - TP0014 - - - - TP0015 - - - - TP0016 - - - - TP0017 - - - - TP0018 - - - - TP0019 - - - - TP0020 - - - - TP0021 - - - - TP0022 - - - - TP0023 - - - - TP0024 - - - - TP0025 - - - - TP0026 - - - - TP0027 - - - - TP0028 - - - - TP0029 - - - - TP0030 - - - - TP0031 - - - - TP0032 - - - - TP0033 - - - - TP0034 - - - - TP0035 - - - - TP0036 - - - - TP0037 - - - - TP0038 - - - - TP0039 - - - - TP0040 - - - - TP0041 - - - - TP0042 - - - - TP0043 - - - - TP0044 - - - - TP0045 - - - - TP0046 - - - - TP0047 - - - - TP0048 - - - - TP0049 - - - - TP0050 - - - - TP0051 - - - - TP0052 - - - - TP0053 - - - - TP0054 - - - - TP0055 - - - - TP0056 - - - - TP0057 - - - - TP0058 - - - - TP0059 - - - - TP0060 - - - - TP0061 - - - - TP0062 - - - - TP0063 - - - - TP0064 - - - - TP0065 - - - - TP0066 - - - - TP0067 - - - - TP0068 - - - - TP0069 - - - - TP0070 - - - - TP0071 - - - - TP0072 - - - - TP0073 - - - - TP0074 - - - - TP0075 - - - - TP0076 - - - - TP0077 - - - - TP0078 - - - - TP0079 - - - - TP0080 - - - - TP0081 - - - - TP0082 - - - - TP0083 - - - - TP0084 - - - - TP0085 - - - - TP0086 - - - - TP0087 - - - - TP0088 - - - - TP0089 - - - - TP0090 - - - - TP0091 - - - - TP0092 - - - - TP0093 - - - - TP0094 - - - - TP0095 - - - - TP0096 - - - - TP0097 - - - - TP0098 - - - - TP0099 - - - - TP0100 - - - - TP0101 - - - - TP0102 - - - - TP0103 - - - - TP0104 - - - - TP0105 - - - - TP0106 - - - - TP0107 - - - - TP0108 - - - - TP0109 - - - - TP0110 - - - - TP0111 - - - - TP0112 - - - - TP0113 - - - - TP0114 - - - - TP0115 - - - - TP0116 - - - - TP0117 - - - - TP0118 - - - - TP0119 - - - - TP0120 - - - - TP0121 - - - - TP0122 - - - - TP0123 - - - - TP0124 - - - - TP0125 - - - - TP0126 - - - - TP0127 - - - - TP0128 - - - - TP0129 - - - - TP0130 - - - - TP0131 - - - - TP0132 - - - - TP0133 - - - - TP0134 - - - - TP0135 - - - - TP0136 - - - - TP0137 - - - - TP0138 - - - - TP0139 - - - - TP0140 - - - - TP0141 - - - - TP0142 - - - - TP0143 - - - - TP0144 - - - - TP0145 - - - - TP0146 - - - - TP0147 - - - - TP0148 - - - - TP0149 - - - - TP0150 - - - - TP0151 - - - - TP0152 - - - - TP0153 - - - - TP0154 - - - - TP0155 - - - - TP0156 - - - - TP0157 - - - - TP0158 - - - - TP0159 - - - - TP0160 - - - - TP0161 - - - - TP0162 - - - - TP0163 - - - - TP0164 - - - - TP0165 - - - - TP0166 - - - - TP0167 - - - - TP0168 - - - - TP0169 - - - - TP0170 - - - - TP0171 - - - - TP0172 - - - - TP0173 - - - - TP0174 - - - - TP0175 - - - - TP0176 - - - - TP0177 - - - - TP0178 - - - - TP0179 - - - - TP0180 - - - - TP0181 - - - - TP0182 - - - - TP0183 - - - - TP0184 - - - - TP0185 - - - - TP0186 - - - - TP0187 - - - - TP0188 - - - - TP0189 - - - - TP0190 - - - - TP0191 - - - - TP0192 - - - - TP0193 - - - - TP0194 - - - - TP0195 - - - - TP0196 - - - - TP0197 - - - - TP0198 - - - - TP0199 - - - - TP0200 - - - - TP0201 - - - - TP0202 - - - - TP0203 - - - - TP0204 - - - - TP0205 - - - - TP0206 - - - - TP0207 - - - - TP0208 - - - - TP0209 - - - - TP0210 - - - - TP0211 - - - - TP0212 - - - - TP0213 - - - - TP0214 - - - - TP0215 - - - - TP0216 - - - - TP0217 - - - - TP0218 - - - - TP0219 - - - - TP0220 - - - - TP0221 - - - - TP0222 - - - - TP0223 - - - - TP0224 - - - - TP0225 - - - - TP0226 - - - - TP0227 - - - - TP0228 - - - - TP0229 - - - - TP0230 - - - - TP0231 - - - - TP0232 - - - - TP0233 - - - - TP0234 - - - - TP0235 - - - - TP0236 - - - - TP0237 - - - - TP0238 - - - - TP0239 - - - - TP0240 - - - - TP0241 - - - - TP0242 - - - - TP0243 - - - - TP0244 - - - - TP0245 - - - - TP0246 - - - - TP0247 - - - - TP0248 - - - - TP0249 - - - - TP0250 - - - - TP0251 - - - - TP0252 - - - - TP0253 - - - - TP0254 - - - - TP0255 - - - - TP0256 - - - - TP0257 - - - - TP0258 - - - - TP0259 - - - - TP0260 - - - - diff --git a/reference/wbt-201.gpx b/reference/wbt-201.gpx deleted file mode 100644 index b60dc0d53..000000000 --- a/reference/wbt-201.gpx +++ /dev/null @@ -1,20175 +0,0 @@ - - - - - - 378.000 - - WP0001 - WP0001 - WP0001 - - - 379.000 - - WP0002 - WP0002 - WP0002 - - - 379.000 - - WP0003 - WP0003 - WP0003 - - - 377.000 - - WP0004 - WP0004 - WP0004 - - - 531.000 - - WP0005 - WP0005 - WP0005 - - - - - 435.000 - - TP0001 - - - 434.000 - - TP0002 - - - 435.000 - - TP0003 - - - 434.000 - - TP0004 - - - 434.000 - - TP0005 - - - 434.000 - - TP0006 - - - 433.000 - - TP0007 - - - 433.000 - - TP0008 - - - 434.000 - - TP0009 - - - 434.000 - - TP0010 - - - 433.000 - - TP0011 - - - 433.000 - - TP0012 - - - 433.000 - - TP0013 - - - 433.000 - - TP0014 - - - 433.000 - - TP0015 - - - 432.000 - - TP0016 - - - 431.000 - - TP0017 - - - 430.000 - - TP0018 - - - 430.000 - - TP0019 - - - 430.000 - - TP0020 - - - 431.000 - - TP0021 - - - 431.000 - - TP0022 - - - 430.000 - - TP0023 - - - 430.000 - - TP0024 - - - 430.000 - - TP0025 - - - 431.000 - - TP0026 - - - 431.000 - - TP0027 - - - 431.000 - - TP0028 - - - 431.000 - - TP0029 - - - 431.000 - - TP0030 - - - 430.000 - - TP0031 - - - 430.000 - - TP0032 - - - 428.000 - - TP0033 - - - 427.000 - - TP0034 - - - 426.000 - - TP0035 - - - 426.000 - - TP0036 - - - 426.000 - - TP0037 - - - 427.000 - - TP0038 - - - 427.000 - - TP0039 - - - 428.000 - - TP0040 - - - 426.000 - - TP0041 - - - 425.000 - - TP0042 - - - 428.000 - - TP0043 - - - 429.000 - - TP0044 - - - 429.000 - - TP0045 - - - 431.000 - - TP0046 - - - 431.000 - - TP0047 - - - 432.000 - - TP0048 - - - 444.000 - - TP0049 - - - 445.000 - - TP0050 - - - 448.000 - - TP0051 - - - 432.000 - - TP0052 - - - 426.000 - - TP0053 - - - 420.000 - - TP0054 - - - 409.000 - - TP0055 - - - 408.000 - - TP0056 - - - 405.000 - - TP0057 - - - 393.000 - - TP0058 - - - 392.000 - - TP0059 - - - 392.000 - - TP0060 - - - 392.000 - - TP0061 - - - 391.000 - - TP0062 - - - 391.000 - - TP0063 - - - 387.000 - - TP0064 - - - 386.000 - - TP0065 - - - 383.000 - - TP0066 - - - 373.000 - - TP0067 - - - 372.000 - - TP0068 - - - 372.000 - - TP0069 - - - 369.000 - - TP0070 - - - 364.000 - - TP0071 - - - 361.000 - - TP0072 - - - 360.000 - - TP0073 - - - 359.000 - - TP0074 - - - 359.000 - - TP0075 - - - 359.000 - - TP0076 - - - 364.000 - - TP0077 - - - 363.000 - - TP0078 - - - 364.000 - - TP0079 - - - 363.000 - - TP0080 - - - 364.000 - - TP0081 - - - 369.000 - - TP0082 - - - 369.000 - - TP0083 - - - 369.000 - - TP0084 - - - 368.000 - - TP0085 - - - 368.000 - - TP0086 - - - 370.000 - - TP0087 - - - 373.000 - - TP0088 - - - 375.000 - - TP0089 - - - 380.000 - - TP0090 - - - 378.000 - - TP0091 - - - 379.000 - - TP0092 - - - 379.000 - - TP0093 - - - 376.000 - - TP0094 - - - 378.000 - - TP0095 - - - 379.000 - - TP0096 - - - 378.000 - - TP0097 - - - 377.000 - - TP0098 - - - 368.000 - - TP0099 - - - 341.000 - - TP0100 - - - 341.000 - - TP0101 - - - 341.000 - - TP0102 - - - 341.000 - - TP0103 - - - 341.000 - - TP0104 - - - 340.000 - - TP0105 - - - 337.000 - - TP0106 - - - 330.000 - - TP0107 - - - 324.000 - - TP0108 - - - 324.000 - - TP0109 - - - 322.000 - - TP0110 - - - 322.000 - - TP0111 - - - 321.000 - - TP0112 - - - 321.000 - - TP0113 - - - 321.000 - - TP0114 - - - 319.000 - - TP0115 - - - 317.000 - - TP0116 - - - 317.000 - - TP0117 - - - 311.000 - - TP0118 - - - 304.000 - - TP0119 - - - 304.000 - - TP0120 - - - 303.000 - - TP0121 - - - 303.000 - - TP0122 - - - 303.000 - - TP0123 - - - 303.000 - - TP0124 - - - 303.000 - - TP0125 - - - 303.000 - - TP0126 - - - 303.000 - - TP0127 - - - 303.000 - - TP0128 - - - 303.000 - - TP0129 - - - 303.000 - - TP0130 - - - 303.000 - - TP0131 - - - 303.000 - - TP0132 - - - 304.000 - - TP0133 - - - 305.000 - - TP0134 - - - 306.000 - - TP0135 - - - 306.000 - - TP0136 - - - 314.000 - - TP0137 - - - 315.000 - - TP0138 - - - 316.000 - - TP0139 - - - 323.000 - - TP0140 - - - 325.000 - - TP0141 - - - 327.000 - - TP0142 - - - 327.000 - - TP0143 - - - 326.000 - - TP0144 - - - 326.000 - - TP0145 - - - 328.000 - - TP0146 - - - 334.000 - - TP0147 - - - 336.000 - - TP0148 - - - 339.000 - - TP0149 - - - 347.000 - - TP0150 - - - 348.000 - - TP0151 - - - 356.000 - - TP0152 - - - 367.000 - - TP0153 - - - 378.000 - - TP0154 - - - 382.000 - - TP0155 - - - 379.000 - - TP0156 - - - 379.000 - - TP0157 - - - 379.000 - - TP0158 - - - 381.000 - - TP0159 - - - 418.000 - - TP0160 - - - 418.000 - - TP0161 - - - 419.000 - - TP0162 - - - 419.000 - - TP0163 - - - 419.000 - - TP0164 - - - 419.000 - - TP0165 - - - 419.000 - - TP0166 - - - 423.000 - - TP0167 - - - 422.000 - - TP0168 - - - 423.000 - - TP0169 - - - 424.000 - - TP0170 - - - 425.000 - - TP0171 - - - 427.000 - - TP0172 - - - 429.000 - - TP0173 - - - 430.000 - - TP0174 - - - 451.000 - - TP0175 - - - 452.000 - - TP0176 - - - 453.000 - - TP0177 - - - 453.000 - - TP0178 - - - 453.000 - - TP0179 - - - 458.000 - - TP0180 - - - 459.000 - - TP0181 - - - 462.000 - - TP0182 - - - 462.000 - - TP0183 - - - 462.000 - - TP0184 - - - 462.000 - - TP0185 - - - 451.000 - - TP0186 - - - 449.000 - - TP0187 - - - 448.000 - - TP0188 - - - 447.000 - - TP0189 - - - 447.000 - - TP0190 - - - 446.000 - - TP0191 - - - 434.000 - - TP0192 - - - 434.000 - - TP0193 - - - 434.000 - - TP0194 - - - 434.000 - - TP0195 - - - 434.000 - - TP0196 - - - 434.000 - - TP0197 - - - 434.000 - - TP0198 - - - 434.000 - - TP0199 - - - 434.000 - - TP0200 - - - 436.000 - - TP0201 - - - 437.000 - - TP0202 - - - 438.000 - - TP0203 - - - 438.000 - - TP0204 - - - 438.000 - - TP0205 - - - 437.000 - - TP0206 - - - 438.000 - - TP0207 - - - 438.000 - - TP0208 - - - 439.000 - - TP0209 - - - 442.000 - - TP0210 - - - 447.000 - - TP0211 - - - 499.000 - - TP0212 - - - 499.000 - - TP0213 - - - 500.000 - - TP0214 - - - 501.000 - - TP0215 - - - 503.000 - - TP0216 - - - 507.000 - - TP0217 - - - 521.000 - - TP0218 - - - 523.000 - - TP0219 - - - 544.000 - - TP0220 - - - 545.000 - - TP0221 - - - 547.000 - - TP0222 - - - 551.000 - - TP0223 - - - 551.000 - - TP0224 - - - 553.000 - - TP0225 - - - 555.000 - - TP0226 - - - 560.000 - - TP0227 - - - 563.000 - - TP0228 - - - 565.000 - - TP0229 - - - 603.000 - - TP0230 - - - 603.000 - - TP0231 - - - 590.000 - - TP0232 - - - 590.000 - - TP0233 - - - 586.000 - - TP0234 - - - 585.000 - - TP0235 - - - 583.000 - - TP0236 - - - 574.000 - - TP0237 - - - 563.000 - - TP0238 - - - 554.000 - - TP0239 - - - 547.000 - - TP0240 - - - 545.000 - - TP0241 - - - 531.000 - - TP0242 - - - 532.000 - - TP0243 - - - 530.000 - - TP0244 - - - 524.000 - - TP0245 - - - 522.000 - - TP0246 - - - 520.000 - - TP0247 - - - 513.000 - - TP0248 - - - 488.000 - - TP0249 - - - 486.000 - - TP0250 - - - 476.000 - - TP0251 - - - 468.000 - - TP0252 - - - 464.000 - - TP0253 - - - 454.000 - - TP0254 - - - 448.000 - - TP0255 - - - 447.000 - - TP0256 - - - 446.000 - - TP0257 - - - 440.000 - - TP0258 - - - 439.000 - - TP0259 - - - 439.000 - - TP0260 - - - 439.000 - - TP0261 - - - 439.000 - - TP0262 - - - 439.000 - - TP0263 - - - 439.000 - - TP0264 - - - 439.000 - - TP0265 - - - 440.000 - - TP0266 - - - 440.000 - - TP0267 - - - 439.000 - - TP0268 - - - 439.000 - - TP0269 - - - 439.000 - - TP0270 - - - 439.000 - - TP0271 - - - 439.000 - - TP0272 - - - 439.000 - - TP0273 - - - 439.000 - - TP0274 - - - 439.000 - - TP0275 - - - 439.000 - - TP0276 - - - - - - - 438.000 - - TP0277 - - - 438.000 - - TP0278 - - - 438.000 - - TP0279 - - - 438.000 - - TP0280 - - - 438.000 - - TP0281 - - - 438.000 - - TP0282 - - - 438.000 - - TP0283 - - - 438.000 - - TP0284 - - - 438.000 - - TP0285 - - - 438.000 - - TP0286 - - - 438.000 - - TP0287 - - - 438.000 - - TP0288 - - - 438.000 - - TP0289 - - - 438.000 - - TP0290 - - - 438.000 - - TP0291 - - - 438.000 - - TP0292 - - - 438.000 - - TP0293 - - - 438.000 - - TP0294 - - - 438.000 - - TP0295 - - - 438.000 - - TP0296 - - - 438.000 - - TP0297 - - - 438.000 - - TP0298 - - - 438.000 - - TP0299 - - - 438.000 - - TP0300 - - - 438.000 - - TP0301 - - - 438.000 - - TP0302 - - - 438.000 - - TP0303 - - - 438.000 - - TP0304 - - - 438.000 - - TP0305 - - - 438.000 - - TP0306 - - - 438.000 - - TP0307 - - - 416.000 - - TP0308 - - - 416.000 - - TP0309 - - - 416.000 - - TP0310 - - - 416.000 - - TP0311 - - - 416.000 - - TP0312 - - - 416.000 - - TP0313 - - - 416.000 - - TP0314 - - - 416.000 - - TP0315 - - - 416.000 - - TP0316 - - - 416.000 - - TP0317 - - - 416.000 - - TP0318 - - - 416.000 - - TP0319 - - - 416.000 - - TP0320 - - - 416.000 - - TP0321 - - - 417.000 - - TP0322 - - - 417.000 - - TP0323 - - - 417.000 - - TP0324 - - - 417.000 - - TP0325 - - - 417.000 - - TP0326 - - - 418.000 - - TP0327 - - - 418.000 - - TP0328 - - - 418.000 - - TP0329 - - - 418.000 - - TP0330 - - - 418.000 - - TP0331 - - - 418.000 - - TP0332 - - - 418.000 - - TP0333 - - - 418.000 - - TP0334 - - - 418.000 - - TP0335 - - - 418.000 - - TP0336 - - - 418.000 - - TP0337 - - - 418.000 - - TP0338 - - - 418.000 - - TP0339 - - - 419.000 - - TP0340 - - - 419.000 - - TP0341 - - - 419.000 - - TP0342 - - - 419.000 - - TP0343 - - - 419.000 - - TP0344 - - - 419.000 - - TP0345 - - - 419.000 - - TP0346 - - - 419.000 - - TP0347 - - - 419.000 - - TP0348 - - - 419.000 - - TP0349 - - - 419.000 - - TP0350 - - - 419.000 - - TP0351 - - - 419.000 - - TP0352 - - - 419.000 - - TP0353 - - - 419.000 - - TP0354 - - - 419.000 - - TP0355 - - - 419.000 - - TP0356 - - - 419.000 - - TP0357 - - - 420.000 - - TP0358 - - - 420.000 - - TP0359 - - - 420.000 - - TP0360 - - - 420.000 - - TP0361 - - - 420.000 - - TP0362 - - - 420.000 - - TP0363 - - - 420.000 - - TP0364 - - - 420.000 - - TP0365 - - - 420.000 - - TP0366 - - - 420.000 - - TP0367 - - - 421.000 - - TP0368 - - - 421.000 - - TP0369 - - - 421.000 - - TP0370 - - - 421.000 - - TP0371 - - - 421.000 - - TP0372 - - - 421.000 - - TP0373 - - - 421.000 - - TP0374 - - - 421.000 - - TP0375 - - - 421.000 - - TP0376 - - - 421.000 - - TP0377 - - - 421.000 - - TP0378 - - - 421.000 - - TP0379 - - - 421.000 - - TP0380 - - - 421.000 - - TP0381 - - - 421.000 - - TP0382 - - - 421.000 - - TP0383 - - - 421.000 - - TP0384 - - - 421.000 - - TP0385 - - - 421.000 - - TP0386 - - - 421.000 - - TP0387 - - - 421.000 - - TP0388 - - - 421.000 - - TP0389 - - - 421.000 - - TP0390 - - - 421.000 - - TP0391 - - - 421.000 - - TP0392 - - - 421.000 - - TP0393 - - - 421.000 - - TP0394 - - - 421.000 - - TP0395 - - - 421.000 - - TP0396 - - - 421.000 - - TP0397 - - - 421.000 - - TP0398 - - - 421.000 - - TP0399 - - - 421.000 - - TP0400 - - - 421.000 - - TP0401 - - - 421.000 - - TP0402 - - - 421.000 - - TP0403 - - - 421.000 - - TP0404 - - - 421.000 - - TP0405 - - - 421.000 - - TP0406 - - - 421.000 - - TP0407 - - - 421.000 - - TP0408 - - - 421.000 - - TP0409 - - - 421.000 - - TP0410 - - - 420.000 - - TP0411 - - - 416.000 - - TP0412 - - - 413.000 - - TP0413 - - - 410.000 - - TP0414 - - - 407.000 - - TP0415 - - - 406.000 - - TP0416 - - - 408.000 - - TP0417 - - - 415.000 - - TP0418 - - - 415.000 - - TP0419 - - - 415.000 - - TP0420 - - - 415.000 - - TP0421 - - - 415.000 - - TP0422 - - - 415.000 - - TP0423 - - - 415.000 - - TP0424 - - - 415.000 - - TP0425 - - - 415.000 - - TP0426 - - - 415.000 - - TP0427 - - - 415.000 - - TP0428 - - - 415.000 - - TP0429 - - - 415.000 - - TP0430 - - - 415.000 - - TP0431 - - - 415.000 - - TP0432 - - - 415.000 - - TP0433 - - - 415.000 - - TP0434 - - - 415.000 - - TP0435 - - - 415.000 - - TP0436 - - - 415.000 - - TP0437 - - - 416.000 - - TP0438 - - - 416.000 - - TP0439 - - - 416.000 - - TP0440 - - - 416.000 - - TP0441 - - - 416.000 - - TP0442 - - - 416.000 - - TP0443 - - - 416.000 - - TP0444 - - - 416.000 - - TP0445 - - - 416.000 - - TP0446 - - - 416.000 - - TP0447 - - - 416.000 - - TP0448 - - - 417.000 - - TP0449 - - - 417.000 - - TP0450 - - - 417.000 - - TP0451 - - - 419.000 - - TP0452 - - - 419.000 - - TP0453 - - - 419.000 - - TP0454 - - - 419.000 - - TP0455 - - - 419.000 - - TP0456 - - - 419.000 - - TP0457 - - - 419.000 - - TP0458 - - - 419.000 - - TP0459 - - - 419.000 - - TP0460 - - - 419.000 - - TP0461 - - - - - - - 423.000 - - TP0462 - - - 423.000 - - TP0463 - - - - - - - 431.000 - - TP0464 - - - 431.000 - - TP0465 - - - 432.000 - - TP0466 - - - 432.000 - - TP0467 - - - - - - - 451.000 - - TP0468 - - - 451.000 - - TP0469 - - - 451.000 - - TP0470 - - - 450.000 - - TP0471 - - - 450.000 - - TP0472 - - - 450.000 - - TP0473 - - - 450.000 - - TP0474 - - - 450.000 - - TP0475 - - - 450.000 - - TP0476 - - - 450.000 - - TP0477 - - - 450.000 - - TP0478 - - - 450.000 - - TP0479 - - - 450.000 - - TP0480 - - - 450.000 - - TP0481 - - - 450.000 - - TP0482 - - - 450.000 - - TP0483 - - - 450.000 - - TP0484 - - - 450.000 - - TP0485 - - - 450.000 - - TP0486 - - - 450.000 - - TP0487 - - - 450.000 - - TP0488 - - - 450.000 - - TP0489 - - - 450.000 - - TP0490 - - - 450.000 - - TP0491 - - - 450.000 - - TP0492 - - - 450.000 - - TP0493 - - - 450.000 - - TP0494 - - - 450.000 - - TP0495 - - - 450.000 - - TP0496 - - - 450.000 - - TP0497 - - - 450.000 - - TP0498 - - - 450.000 - - TP0499 - - - 450.000 - - TP0500 - - - 450.000 - - TP0501 - - - 450.000 - - TP0502 - - - 450.000 - - TP0503 - - - 450.000 - - TP0504 - - - 450.000 - - TP0505 - - - 450.000 - - TP0506 - - - 450.000 - - TP0507 - - - 450.000 - - TP0508 - - - 450.000 - - TP0509 - - - 450.000 - - TP0510 - - - 450.000 - - TP0511 - - - 450.000 - - TP0512 - - - 450.000 - - TP0513 - - - 450.000 - - TP0514 - - - 450.000 - - TP0515 - - - 450.000 - - TP0516 - - - 450.000 - - TP0517 - - - 450.000 - - TP0518 - - - 450.000 - - TP0519 - - - 450.000 - - TP0520 - - - 450.000 - - TP0521 - - - 450.000 - - TP0522 - - - 450.000 - - TP0523 - - - 449.000 - - TP0524 - - - 448.000 - - TP0525 - - - 447.000 - - TP0526 - - - 446.000 - - TP0527 - - - 445.000 - - TP0528 - - - 443.000 - - TP0529 - - - 441.000 - - TP0530 - - - 438.000 - - TP0531 - - - 435.000 - - TP0532 - - - 429.000 - - TP0533 - - - 423.000 - - TP0534 - - - 413.000 - - TP0535 - - - 414.000 - - TP0536 - - - 415.000 - - TP0537 - - - 415.000 - - TP0538 - - - 415.000 - - TP0539 - - - 415.000 - - TP0540 - - - 415.000 - - TP0541 - - - 415.000 - - TP0542 - - - 415.000 - - TP0543 - - - 415.000 - - TP0544 - - - 415.000 - - TP0545 - - - 415.000 - - TP0546 - - - 415.000 - - TP0547 - - - 415.000 - - TP0548 - - - 415.000 - - TP0549 - - - 415.000 - - TP0550 - - - 415.000 - - TP0551 - - - 415.000 - - TP0552 - - - 415.000 - - TP0553 - - - 415.000 - - TP0554 - - - 415.000 - - TP0555 - - - 415.000 - - TP0556 - - - 415.000 - - TP0557 - - - 415.000 - - TP0558 - - - 415.000 - - TP0559 - - - 415.000 - - TP0560 - - - 415.000 - - TP0561 - - - 415.000 - - TP0562 - - - 415.000 - - TP0563 - - - 415.000 - - TP0564 - - - 415.000 - - TP0565 - - - 415.000 - - TP0566 - - - 415.000 - - TP0567 - - - 415.000 - - TP0568 - - - 415.000 - - TP0569 - - - 415.000 - - TP0570 - - - 415.000 - - TP0571 - - - 415.000 - - TP0572 - - - 415.000 - - TP0573 - - - 415.000 - - TP0574 - - - 415.000 - - TP0575 - - - 415.000 - - TP0576 - - - 415.000 - - TP0577 - - - 415.000 - - TP0578 - - - 415.000 - - TP0579 - - - 415.000 - - TP0580 - - - 415.000 - - TP0581 - - - 415.000 - - TP0582 - - - 415.000 - - TP0583 - - - 415.000 - - TP0584 - - - 415.000 - - TP0585 - - - 415.000 - - TP0586 - - - 415.000 - - TP0587 - - - 415.000 - - TP0588 - - - 415.000 - - TP0589 - - - 415.000 - - TP0590 - - - 415.000 - - TP0591 - - - 415.000 - - TP0592 - - - 415.000 - - TP0593 - - - 415.000 - - TP0594 - - - 415.000 - - TP0595 - - - 415.000 - - TP0596 - - - 415.000 - - TP0597 - - - 415.000 - - TP0598 - - - 415.000 - - TP0599 - - - 415.000 - - TP0600 - - - 415.000 - - TP0601 - - - 415.000 - - TP0602 - - - 415.000 - - TP0603 - - - 415.000 - - TP0604 - - - 415.000 - - TP0605 - - - 415.000 - - TP0606 - - - 415.000 - - TP0607 - - - 415.000 - - TP0608 - - - 415.000 - - TP0609 - - - 415.000 - - TP0610 - - - 415.000 - - TP0611 - - - 415.000 - - TP0612 - - - 415.000 - - TP0613 - - - 415.000 - - TP0614 - - - 415.000 - - TP0615 - - - 415.000 - - TP0616 - - - 415.000 - - TP0617 - - - 415.000 - - TP0618 - - - 415.000 - - TP0619 - - - 415.000 - - TP0620 - - - 415.000 - - TP0621 - - - 415.000 - - TP0622 - - - 415.000 - - TP0623 - - - 415.000 - - TP0624 - - - 415.000 - - TP0625 - - - 415.000 - - TP0626 - - - 415.000 - - TP0627 - - - 415.000 - - TP0628 - - - 415.000 - - TP0629 - - - 415.000 - - TP0630 - - - 415.000 - - TP0631 - - - 415.000 - - TP0632 - - - 415.000 - - TP0633 - - - 415.000 - - TP0634 - - - 415.000 - - TP0635 - - - 415.000 - - TP0636 - - - 416.000 - - TP0637 - - - 416.000 - - TP0638 - - - 416.000 - - TP0639 - - - 416.000 - - TP0640 - - - 416.000 - - TP0641 - - - 416.000 - - TP0642 - - - 416.000 - - TP0643 - - - 416.000 - - TP0644 - - - 416.000 - - TP0645 - - - 416.000 - - TP0646 - - - 416.000 - - TP0647 - - - 418.000 - - TP0648 - - - 418.000 - - TP0649 - - - 419.000 - - TP0650 - - - 419.000 - - TP0651 - - - 420.000 - - TP0652 - - - 420.000 - - TP0653 - - - 420.000 - - TP0654 - - - 420.000 - - TP0655 - - - 420.000 - - TP0656 - - - 420.000 - - TP0657 - - - 420.000 - - TP0658 - - - 420.000 - - TP0659 - - - 420.000 - - TP0660 - - - 421.000 - - TP0661 - - - 421.000 - - TP0662 - - - 421.000 - - TP0663 - - - 421.000 - - TP0664 - - - 421.000 - - TP0665 - - - 421.000 - - TP0666 - - - 421.000 - - TP0667 - - - 421.000 - - TP0668 - - - 421.000 - - TP0669 - - - 420.000 - - TP0670 - - - 420.000 - - TP0671 - - - 420.000 - - TP0672 - - - 420.000 - - TP0673 - - - 420.000 - - TP0674 - - - 421.000 - - TP0675 - - - 421.000 - - TP0676 - - - 421.000 - - TP0677 - - - 421.000 - - TP0678 - - - 421.000 - - TP0679 - - - 421.000 - - TP0680 - - - 421.000 - - TP0681 - - - 421.000 - - TP0682 - - - 421.000 - - TP0683 - - - 421.000 - - TP0684 - - - 421.000 - - TP0685 - - - 421.000 - - TP0686 - - - 421.000 - - TP0687 - - - 421.000 - - TP0688 - - - 421.000 - - TP0689 - - - 421.000 - - TP0690 - - - 421.000 - - TP0691 - - - 421.000 - - TP0692 - - - 421.000 - - TP0693 - - - 421.000 - - TP0694 - - - 421.000 - - TP0695 - - - 421.000 - - TP0696 - - - 421.000 - - TP0697 - - - 421.000 - - TP0698 - - - 421.000 - - TP0699 - - - 421.000 - - TP0700 - - - 421.000 - - TP0701 - - - 421.000 - - TP0702 - - - 421.000 - - TP0703 - - - 421.000 - - TP0704 - - - 421.000 - - TP0705 - - - 421.000 - - TP0706 - - - 421.000 - - TP0707 - - - 421.000 - - TP0708 - - - 421.000 - - TP0709 - - - 421.000 - - TP0710 - - - 421.000 - - TP0711 - - - 421.000 - - TP0712 - - - 421.000 - - TP0713 - - - 421.000 - - TP0714 - - - 421.000 - - TP0715 - - - 421.000 - - TP0716 - - - 421.000 - - TP0717 - - - 421.000 - - TP0718 - - - 421.000 - - TP0719 - - - 421.000 - - TP0720 - - - 421.000 - - TP0721 - - - 421.000 - - TP0722 - - - 421.000 - - TP0723 - - - 421.000 - - TP0724 - - - 421.000 - - TP0725 - - - 421.000 - - TP0726 - - - 421.000 - - TP0727 - - - 421.000 - - TP0728 - - - 422.000 - - TP0729 - - - 422.000 - - TP0730 - - - 422.000 - - TP0731 - - - 422.000 - - TP0732 - - - 422.000 - - TP0733 - - - 422.000 - - TP0734 - - - 422.000 - - TP0735 - - - 422.000 - - TP0736 - - - 422.000 - - TP0737 - - - 422.000 - - TP0738 - - - 422.000 - - TP0739 - - - 422.000 - - TP0740 - - - 422.000 - - TP0741 - - - 422.000 - - TP0742 - - - 422.000 - - TP0743 - - - 422.000 - - TP0744 - - - 422.000 - - TP0745 - - - 422.000 - - TP0746 - - - 422.000 - - TP0747 - - - 422.000 - - TP0748 - - - 422.000 - - TP0749 - - - 422.000 - - TP0750 - - - 422.000 - - TP0751 - - - 423.000 - - TP0752 - - - 423.000 - - TP0753 - - - 423.000 - - TP0754 - - - 423.000 - - TP0755 - - - 423.000 - - TP0756 - - - 423.000 - - TP0757 - - - 423.000 - - TP0758 - - - 423.000 - - TP0759 - - - 424.000 - - TP0760 - - - 424.000 - - TP0761 - - - 424.000 - - TP0762 - - - 424.000 - - TP0763 - - - 424.000 - - TP0764 - - - 424.000 - - TP0765 - - - 424.000 - - TP0766 - - - 424.000 - - TP0767 - - - 424.000 - - TP0768 - - - 424.000 - - TP0769 - - - 424.000 - - TP0770 - - - 425.000 - - TP0771 - - - 425.000 - - TP0772 - - - 425.000 - - TP0773 - - - 425.000 - - TP0774 - - - 425.000 - - TP0775 - - - 425.000 - - TP0776 - - - 425.000 - - TP0777 - - - 425.000 - - TP0778 - - - 425.000 - - TP0779 - - - 425.000 - - TP0780 - - - 425.000 - - TP0781 - - - 425.000 - - TP0782 - - - 425.000 - - TP0783 - - - 425.000 - - TP0784 - - - 425.000 - - TP0785 - - - 425.000 - - TP0786 - - - 425.000 - - TP0787 - - - 425.000 - - TP0788 - - - 425.000 - - TP0789 - - - 425.000 - - TP0790 - - - 425.000 - - TP0791 - - - 425.000 - - TP0792 - - - 425.000 - - TP0793 - - - 425.000 - - TP0794 - - - 425.000 - - TP0795 - - - 425.000 - - TP0796 - - - 425.000 - - TP0797 - - - 425.000 - - TP0798 - - - 425.000 - - TP0799 - - - 422.000 - - TP0800 - - - 421.000 - - TP0801 - - - 420.000 - - TP0802 - - - 422.000 - - TP0803 - - - 422.000 - - TP0804 - - - 422.000 - - TP0805 - - - 422.000 - - TP0806 - - - 422.000 - - TP0807 - - - 416.000 - - TP0808 - - - 413.000 - - TP0809 - - - 413.000 - - TP0810 - - - 413.000 - - TP0811 - - - 413.000 - - TP0812 - - - 413.000 - - TP0813 - - - 413.000 - - TP0814 - - - 413.000 - - TP0815 - - - 413.000 - - TP0816 - - - 413.000 - - TP0817 - - - 413.000 - - TP0818 - - - 413.000 - - TP0819 - - - 413.000 - - TP0820 - - - 413.000 - - TP0821 - - - 413.000 - - TP0822 - - - 414.000 - - TP0823 - - - 414.000 - - TP0824 - - - 414.000 - - TP0825 - - - 414.000 - - TP0826 - - - 414.000 - - TP0827 - - - 414.000 - - TP0828 - - - 414.000 - - TP0829 - - - 414.000 - - TP0830 - - - 414.000 - - TP0831 - - - 414.000 - - TP0832 - - - 414.000 - - TP0833 - - - 414.000 - - TP0834 - - - 414.000 - - TP0835 - - - 414.000 - - TP0836 - - - 415.000 - - TP0837 - - - 416.000 - - TP0838 - - - 416.000 - - TP0839 - - - 416.000 - - TP0840 - - - 416.000 - - TP0841 - - - 416.000 - - TP0842 - - - 416.000 - - TP0843 - - - 416.000 - - TP0844 - - - 416.000 - - TP0845 - - - 416.000 - - TP0846 - - - 416.000 - - TP0847 - - - 416.000 - - TP0848 - - - 416.000 - - TP0849 - - - 416.000 - - TP0850 - - - 416.000 - - TP0851 - - - 416.000 - - TP0852 - - - 416.000 - - TP0853 - - - 416.000 - - TP0854 - - - 416.000 - - TP0855 - - - 416.000 - - TP0856 - - - 416.000 - - TP0857 - - - 416.000 - - TP0858 - - - 417.000 - - TP0859 - - - 417.000 - - TP0860 - - - 418.000 - - TP0861 - - - 418.000 - - TP0862 - - - 419.000 - - TP0863 - - - 419.000 - - TP0864 - - - 420.000 - - TP0865 - - - 420.000 - - TP0866 - - - 419.000 - - TP0867 - - - 419.000 - - TP0868 - - - 419.000 - - TP0869 - - - 421.000 - - TP0870 - - - 421.000 - - TP0871 - - - 421.000 - - TP0872 - - - 421.000 - - TP0873 - - - 422.000 - - TP0874 - - - 422.000 - - TP0875 - - - 422.000 - - TP0876 - - - 422.000 - - TP0877 - - - 422.000 - - TP0878 - - - 423.000 - - TP0879 - - - 423.000 - - TP0880 - - - 423.000 - - TP0881 - - - 423.000 - - TP0882 - - - 423.000 - - TP0883 - - - 423.000 - - TP0884 - - - 423.000 - - TP0885 - - - 423.000 - - TP0886 - - - 423.000 - - TP0887 - - - 423.000 - - TP0888 - - - 423.000 - - TP0889 - - - 423.000 - - TP0890 - - - 423.000 - - TP0891 - - - 423.000 - - TP0892 - - - 423.000 - - TP0893 - - - 423.000 - - TP0894 - - - 424.000 - - TP0895 - - - 424.000 - - TP0896 - - - 425.000 - - TP0897 - - - 425.000 - - TP0898 - - - 425.000 - - TP0899 - - - 425.000 - - TP0900 - - - 425.000 - - TP0901 - - - 425.000 - - TP0902 - - - 425.000 - - TP0903 - - - 425.000 - - TP0904 - - - 425.000 - - TP0905 - - - 425.000 - - TP0906 - - - 425.000 - - TP0907 - - - 425.000 - - TP0908 - - - 425.000 - - TP0909 - - - 425.000 - - TP0910 - - - 425.000 - - TP0911 - - - 425.000 - - TP0912 - - - 425.000 - - TP0913 - - - 425.000 - - TP0914 - - - 425.000 - - TP0915 - - - 425.000 - - TP0916 - - - 425.000 - - TP0917 - - - 425.000 - - TP0918 - - - 425.000 - - TP0919 - - - 425.000 - - TP0920 - - - 425.000 - - TP0921 - - - 425.000 - - TP0922 - - - 425.000 - - TP0923 - - - 425.000 - - TP0924 - - - 425.000 - - TP0925 - - - 425.000 - - TP0926 - - - 425.000 - - TP0927 - - - 425.000 - - TP0928 - - - 425.000 - - TP0929 - - - 425.000 - - TP0930 - - - 425.000 - - TP0931 - - - 425.000 - - TP0932 - - - 425.000 - - TP0933 - - - 425.000 - - TP0934 - - - 425.000 - - TP0935 - - - 425.000 - - TP0936 - - - 425.000 - - TP0937 - - - 425.000 - - TP0938 - - - 425.000 - - TP0939 - - - 425.000 - - TP0940 - - - 425.000 - - TP0941 - - - 425.000 - - TP0942 - - - 425.000 - - TP0943 - - - 425.000 - - TP0944 - - - 425.000 - - TP0945 - - - 425.000 - - TP0946 - - - 426.000 - - TP0947 - - - 426.000 - - TP0948 - - - 426.000 - - TP0949 - - - 426.000 - - TP0950 - - - 426.000 - - TP0951 - - - 426.000 - - TP0952 - - - 426.000 - - TP0953 - - - 426.000 - - TP0954 - - - 426.000 - - TP0955 - - - 426.000 - - TP0956 - - - 426.000 - - TP0957 - - - 426.000 - - TP0958 - - - 426.000 - - TP0959 - - - 426.000 - - TP0960 - - - 426.000 - - TP0961 - - - 426.000 - - TP0962 - - - 426.000 - - TP0963 - - - 426.000 - - TP0964 - - - 426.000 - - TP0965 - - - 426.000 - - TP0966 - - - 426.000 - - TP0967 - - - 426.000 - - TP0968 - - - 426.000 - - TP0969 - - - 426.000 - - TP0970 - - - 426.000 - - TP0971 - - - 426.000 - - TP0972 - - - 426.000 - - TP0973 - - - 426.000 - - TP0974 - - - 426.000 - - TP0975 - - - 426.000 - - TP0976 - - - 426.000 - - TP0977 - - - 426.000 - - TP0978 - - - 426.000 - - TP0979 - - - 426.000 - - TP0980 - - - 426.000 - - TP0981 - - - 426.000 - - TP0982 - - - 426.000 - - TP0983 - - - 426.000 - - TP0984 - - - 426.000 - - TP0985 - - - 426.000 - - TP0986 - - - 426.000 - - TP0987 - - - 426.000 - - TP0988 - - - 426.000 - - TP0989 - - - 426.000 - - TP0990 - - - 426.000 - - TP0991 - - - 426.000 - - TP0992 - - - 426.000 - - TP0993 - - - 426.000 - - TP0994 - - - 426.000 - - TP0995 - - - 426.000 - - TP0996 - - - 426.000 - - TP0997 - - - 426.000 - - TP0998 - - - 426.000 - - TP0999 - - - 426.000 - - TP1000 - - - 426.000 - - TP1001 - - - 426.000 - - TP1002 - - - 426.000 - - TP1003 - - - 426.000 - - TP1004 - - - 426.000 - - TP1005 - - - 426.000 - - TP1006 - - - 426.000 - - TP1007 - - - 426.000 - - TP1008 - - - 426.000 - - TP1009 - - - 426.000 - - TP1010 - - - 426.000 - - TP1011 - - - 426.000 - - TP1012 - - - 426.000 - - TP1013 - - - 426.000 - - TP1014 - - - 426.000 - - TP1015 - - - 426.000 - - TP1016 - - - 426.000 - - TP1017 - - - 426.000 - - TP1018 - - - 426.000 - - TP1019 - - - 426.000 - - TP1020 - - - 426.000 - - TP1021 - - - 425.000 - - TP1022 - - - 425.000 - - TP1023 - - - 426.000 - - TP1024 - - - 426.000 - - TP1025 - - - 426.000 - - TP1026 - - - 426.000 - - TP1027 - - - 426.000 - - TP1028 - - - 426.000 - - TP1029 - - - 426.000 - - TP1030 - - - 426.000 - - TP1031 - - - 426.000 - - TP1032 - - - 426.000 - - TP1033 - - - 426.000 - - TP1034 - - - 426.000 - - TP1035 - - - 426.000 - - TP1036 - - - 426.000 - - TP1037 - - - 426.000 - - TP1038 - - - 426.000 - - TP1039 - - - 426.000 - - TP1040 - - - 426.000 - - TP1041 - - - 426.000 - - TP1042 - - - 426.000 - - TP1043 - - - 426.000 - - TP1044 - - - 426.000 - - TP1045 - - - 426.000 - - TP1046 - - - 427.000 - - TP1047 - - - 427.000 - - TP1048 - - - 427.000 - - TP1049 - - - 427.000 - - TP1050 - - - 427.000 - - TP1051 - - - 427.000 - - TP1052 - - - 427.000 - - TP1053 - - - 427.000 - - TP1054 - - - 427.000 - - TP1055 - - - 427.000 - - TP1056 - - - 427.000 - - TP1057 - - - 427.000 - - TP1058 - - - 427.000 - - TP1059 - - - 427.000 - - TP1060 - - - 427.000 - - TP1061 - - - 427.000 - - TP1062 - - - 427.000 - - TP1063 - - - 427.000 - - TP1064 - - - 427.000 - - TP1065 - - - 427.000 - - TP1066 - - - 427.000 - - TP1067 - - - 427.000 - - TP1068 - - - 427.000 - - TP1069 - - - 427.000 - - TP1070 - - - 427.000 - - TP1071 - - - 427.000 - - TP1072 - - - 427.000 - - TP1073 - - - 427.000 - - TP1074 - - - 427.000 - - TP1075 - - - 427.000 - - TP1076 - - - 427.000 - - TP1077 - - - 427.000 - - TP1078 - - - 427.000 - - TP1079 - - - 427.000 - - TP1080 - - - 427.000 - - TP1081 - - - 427.000 - - TP1082 - - - 427.000 - - TP1083 - - - 427.000 - - TP1084 - - - 427.000 - - TP1085 - - - 427.000 - - TP1086 - - - 427.000 - - TP1087 - - - 427.000 - - TP1088 - - - 427.000 - - TP1089 - - - 427.000 - - TP1090 - - - 427.000 - - TP1091 - - - 427.000 - - TP1092 - - - 427.000 - - TP1093 - - - 427.000 - - TP1094 - - - 427.000 - - TP1095 - - - 427.000 - - TP1096 - - - 427.000 - - TP1097 - - - 427.000 - - TP1098 - - - 427.000 - - TP1099 - - - 427.000 - - TP1100 - - - 427.000 - - TP1101 - - - 428.000 - - TP1102 - - - 428.000 - - TP1103 - - - 428.000 - - TP1104 - - - 428.000 - - TP1105 - - - 428.000 - - TP1106 - - - 428.000 - - TP1107 - - - 428.000 - - TP1108 - - - 428.000 - - TP1109 - - - 428.000 - - TP1110 - - - 428.000 - - TP1111 - - - 428.000 - - TP1112 - - - 428.000 - - TP1113 - - - 428.000 - - TP1114 - - - 428.000 - - TP1115 - - - 428.000 - - TP1116 - - - 428.000 - - TP1117 - - - 428.000 - - TP1118 - - - 428.000 - - TP1119 - - - 428.000 - - TP1120 - - - 428.000 - - TP1121 - - - 428.000 - - TP1122 - - - 428.000 - - TP1123 - - - 428.000 - - TP1124 - - - 428.000 - - TP1125 - - - 428.000 - - TP1126 - - - 428.000 - - TP1127 - - - 428.000 - - TP1128 - - - 428.000 - - TP1129 - - - 428.000 - - TP1130 - - - 428.000 - - TP1131 - - - 428.000 - - TP1132 - - - 428.000 - - TP1133 - - - 428.000 - - TP1134 - - - 428.000 - - TP1135 - - - 428.000 - - TP1136 - - - 428.000 - - TP1137 - - - 428.000 - - TP1138 - - - 428.000 - - TP1139 - - - 428.000 - - TP1140 - - - 428.000 - - TP1141 - - - 428.000 - - TP1142 - - - 428.000 - - TP1143 - - - 428.000 - - TP1144 - - - 428.000 - - TP1145 - - - 428.000 - - TP1146 - - - 428.000 - - TP1147 - - - 428.000 - - TP1148 - - - 428.000 - - TP1149 - - - 428.000 - - TP1150 - - - 428.000 - - TP1151 - - - 428.000 - - TP1152 - - - 428.000 - - TP1153 - - - 428.000 - - TP1154 - - - 428.000 - - TP1155 - - - 428.000 - - TP1156 - - - 428.000 - - TP1157 - - - 428.000 - - TP1158 - - - 428.000 - - TP1159 - - - 428.000 - - TP1160 - - - 428.000 - - TP1161 - - - 428.000 - - TP1162 - - - 428.000 - - TP1163 - - - 428.000 - - TP1164 - - - 428.000 - - TP1165 - - - 428.000 - - TP1166 - - - 428.000 - - TP1167 - - - 428.000 - - TP1168 - - - 428.000 - - TP1169 - - - 428.000 - - TP1170 - - - 428.000 - - TP1171 - - - 428.000 - - TP1172 - - - 428.000 - - TP1173 - - - 428.000 - - TP1174 - - - 428.000 - - TP1175 - - - 428.000 - - TP1176 - - - 428.000 - - TP1177 - - - 428.000 - - TP1178 - - - 428.000 - - TP1179 - - - 428.000 - - TP1180 - - - 428.000 - - TP1181 - - - 428.000 - - TP1182 - - - 428.000 - - TP1183 - - - 428.000 - - TP1184 - - - 428.000 - - TP1185 - - - 428.000 - - TP1186 - - - 428.000 - - TP1187 - - - 428.000 - - TP1188 - - - 428.000 - - TP1189 - - - 428.000 - - TP1190 - - - 428.000 - - TP1191 - - - 428.000 - - TP1192 - - - 428.000 - - TP1193 - - - 428.000 - - TP1194 - - - 428.000 - - TP1195 - - - 428.000 - - TP1196 - - - 428.000 - - TP1197 - - - 428.000 - - TP1198 - - - 428.000 - - TP1199 - - - 428.000 - - TP1200 - - - 428.000 - - TP1201 - - - 428.000 - - TP1202 - - - 428.000 - - TP1203 - - - 428.000 - - TP1204 - - - 428.000 - - TP1205 - - - 428.000 - - TP1206 - - - 428.000 - - TP1207 - - - 428.000 - - TP1208 - - - 428.000 - - TP1209 - - - 428.000 - - TP1210 - - - 428.000 - - TP1211 - - - 429.000 - - TP1212 - - - 429.000 - - TP1213 - - - 429.000 - - TP1214 - - - 429.000 - - TP1215 - - - 429.000 - - TP1216 - - - 429.000 - - TP1217 - - - 429.000 - - TP1218 - - - 429.000 - - TP1219 - - - 429.000 - - TP1220 - - - 429.000 - - TP1221 - - - 429.000 - - TP1222 - - - 429.000 - - TP1223 - - - 430.000 - - TP1224 - - - 430.000 - - TP1225 - - - 430.000 - - TP1226 - - - 430.000 - - TP1227 - - - 430.000 - - TP1228 - - - 430.000 - - TP1229 - - - 430.000 - - TP1230 - - - 430.000 - - TP1231 - - - 430.000 - - TP1232 - - - 430.000 - - TP1233 - - - 430.000 - - TP1234 - - - 430.000 - - TP1235 - - - 430.000 - - TP1236 - - - 430.000 - - TP1237 - - - 430.000 - - TP1238 - - - 430.000 - - TP1239 - - - 430.000 - - TP1240 - - - 430.000 - - TP1241 - - - 430.000 - - TP1242 - - - 430.000 - - TP1243 - - - 430.000 - - TP1244 - - - 430.000 - - TP1245 - - - 430.000 - - TP1246 - - - 430.000 - - TP1247 - - - 430.000 - - TP1248 - - - 430.000 - - TP1249 - - - 430.000 - - TP1250 - - - 430.000 - - TP1251 - - - 430.000 - - TP1252 - - - 430.000 - - TP1253 - - - 430.000 - - TP1254 - - - 430.000 - - TP1255 - - - 430.000 - - TP1256 - - - 430.000 - - TP1257 - - - 430.000 - - TP1258 - - - 430.000 - - TP1259 - - - 430.000 - - TP1260 - - - 430.000 - - TP1261 - - - 430.000 - - TP1262 - - - 430.000 - - TP1263 - - - 430.000 - - TP1264 - - - 430.000 - - TP1265 - - - 430.000 - - TP1266 - - - 430.000 - - TP1267 - - - 430.000 - - TP1268 - - - 430.000 - - TP1269 - - - 430.000 - - TP1270 - - - 430.000 - - TP1271 - - - 430.000 - - TP1272 - - - 431.000 - - TP1273 - - - 431.000 - - TP1274 - - - 431.000 - - TP1275 - - - 431.000 - - TP1276 - - - 431.000 - - TP1277 - - - 431.000 - - TP1278 - - - 431.000 - - TP1279 - - - 431.000 - - TP1280 - - - 431.000 - - TP1281 - - - 431.000 - - TP1282 - - - 431.000 - - TP1283 - - - 431.000 - - TP1284 - - - 431.000 - - TP1285 - - - 431.000 - - TP1286 - - - 431.000 - - TP1287 - - - 431.000 - - TP1288 - - - 431.000 - - TP1289 - - - 431.000 - - TP1290 - - - 431.000 - - TP1291 - - - 431.000 - - TP1292 - - - 431.000 - - TP1293 - - - 431.000 - - TP1294 - - - 431.000 - - TP1295 - - - 431.000 - - TP1296 - - - 431.000 - - TP1297 - - - 431.000 - - TP1298 - - - 431.000 - - TP1299 - - - 431.000 - - TP1300 - - - 431.000 - - TP1301 - - - 431.000 - - TP1302 - - - 431.000 - - TP1303 - - - 431.000 - - TP1304 - - - 431.000 - - TP1305 - - - 431.000 - - TP1306 - - - 431.000 - - TP1307 - - - 431.000 - - TP1308 - - - 431.000 - - TP1309 - - - 431.000 - - TP1310 - - - 431.000 - - TP1311 - - - 431.000 - - TP1312 - - - 431.000 - - TP1313 - - - 431.000 - - TP1314 - - - 431.000 - - TP1315 - - - 431.000 - - TP1316 - - - 431.000 - - TP1317 - - - 431.000 - - TP1318 - - - 431.000 - - TP1319 - - - 431.000 - - TP1320 - - - 431.000 - - TP1321 - - - 431.000 - - TP1322 - - - 431.000 - - TP1323 - - - 431.000 - - TP1324 - - - 431.000 - - TP1325 - - - 431.000 - - TP1326 - - - 431.000 - - TP1327 - - - 431.000 - - TP1328 - - - 431.000 - - TP1329 - - - 431.000 - - TP1330 - - - 431.000 - - TP1331 - - - 431.000 - - TP1332 - - - 431.000 - - TP1333 - - - 431.000 - - TP1334 - - - 431.000 - - TP1335 - - - 431.000 - - TP1336 - - - 431.000 - - TP1337 - - - 431.000 - - TP1338 - - - 431.000 - - TP1339 - - - 432.000 - - TP1340 - - - 432.000 - - TP1341 - - - 432.000 - - TP1342 - - - 432.000 - - TP1343 - - - 432.000 - - TP1344 - - - 432.000 - - TP1345 - - - 432.000 - - TP1346 - - - 432.000 - - TP1347 - - - 432.000 - - TP1348 - - - 432.000 - - TP1349 - - - 432.000 - - TP1350 - - - 432.000 - - TP1351 - - - 432.000 - - TP1352 - - - 432.000 - - TP1353 - - - 432.000 - - TP1354 - - - 432.000 - - TP1355 - - - 432.000 - - TP1356 - - - 432.000 - - TP1357 - - - 432.000 - - TP1358 - - - 432.000 - - TP1359 - - - 432.000 - - TP1360 - - - 432.000 - - TP1361 - - - 432.000 - - TP1362 - - - 432.000 - - TP1363 - - - 432.000 - - TP1364 - - - 432.000 - - TP1365 - - - 432.000 - - TP1366 - - - 432.000 - - TP1367 - - - 432.000 - - TP1368 - - - 432.000 - - TP1369 - - - 432.000 - - TP1370 - - - 432.000 - - TP1371 - - - 432.000 - - TP1372 - - - 432.000 - - TP1373 - - - 432.000 - - TP1374 - - - 432.000 - - TP1375 - - - 432.000 - - TP1376 - - - 432.000 - - TP1377 - - - 432.000 - - TP1378 - - - 432.000 - - TP1379 - - - 432.000 - - TP1380 - - - 432.000 - - TP1381 - - - 432.000 - - TP1382 - - - 432.000 - - TP1383 - - - 432.000 - - TP1384 - - - 432.000 - - TP1385 - - - 432.000 - - TP1386 - - - 432.000 - - TP1387 - - - 432.000 - - TP1388 - - - 432.000 - - TP1389 - - - 432.000 - - TP1390 - - - 432.000 - - TP1391 - - - 432.000 - - TP1392 - - - 432.000 - - TP1393 - - - 432.000 - - TP1394 - - - 432.000 - - TP1395 - - - 432.000 - - TP1396 - - - 432.000 - - TP1397 - - - 432.000 - - TP1398 - - - 432.000 - - TP1399 - - - 432.000 - - TP1400 - - - 432.000 - - TP1401 - - - 432.000 - - TP1402 - - - 432.000 - - TP1403 - - - 432.000 - - TP1404 - - - 432.000 - - TP1405 - - - 432.000 - - TP1406 - - - 432.000 - - TP1407 - - - 432.000 - - TP1408 - - - 432.000 - - TP1409 - - - 432.000 - - TP1410 - - - 432.000 - - TP1411 - - - 432.000 - - TP1412 - - - 432.000 - - TP1413 - - - 432.000 - - TP1414 - - - 432.000 - - TP1415 - - - 432.000 - - TP1416 - - - 432.000 - - TP1417 - - - 432.000 - - TP1418 - - - 432.000 - - TP1419 - - - 432.000 - - TP1420 - - - 432.000 - - TP1421 - - - 432.000 - - TP1422 - - - 432.000 - - TP1423 - - - 432.000 - - TP1424 - - - 432.000 - - TP1425 - - - 432.000 - - TP1426 - - - 432.000 - - TP1427 - - - 432.000 - - TP1428 - - - 432.000 - - TP1429 - - - 432.000 - - TP1430 - - - 432.000 - - TP1431 - - - 433.000 - - TP1432 - - - 434.000 - - TP1433 - - - 434.000 - - TP1434 - - - 434.000 - - TP1435 - - - 434.000 - - TP1436 - - - 434.000 - - TP1437 - - - 434.000 - - TP1438 - - - 434.000 - - TP1439 - - - 434.000 - - TP1440 - - - 435.000 - - TP1441 - - - 435.000 - - TP1442 - - - 435.000 - - TP1443 - - - 435.000 - - TP1444 - - - 435.000 - - TP1445 - - - 435.000 - - TP1446 - - - 435.000 - - TP1447 - - - 435.000 - - TP1448 - - - 435.000 - - TP1449 - - - 435.000 - - TP1450 - - - 435.000 - - TP1451 - - - 435.000 - - TP1452 - - - 435.000 - - TP1453 - - - 435.000 - - TP1454 - - - 435.000 - - TP1455 - - - 435.000 - - TP1456 - - - 435.000 - - TP1457 - - - 435.000 - - TP1458 - - - 435.000 - - TP1459 - - - 435.000 - - TP1460 - - - 435.000 - - TP1461 - - - 435.000 - - TP1462 - - - 435.000 - - TP1463 - - - 435.000 - - TP1464 - - - 435.000 - - TP1465 - - - 435.000 - - TP1466 - - - 435.000 - - TP1467 - - - 435.000 - - TP1468 - - - 435.000 - - TP1469 - - - 435.000 - - TP1470 - - - 435.000 - - TP1471 - - - 435.000 - - TP1472 - - - 435.000 - - TP1473 - - - 435.000 - - TP1474 - - - 435.000 - - TP1475 - - - 435.000 - - TP1476 - - - 435.000 - - TP1477 - - - 435.000 - - TP1478 - - - 435.000 - - TP1479 - - - 435.000 - - TP1480 - - - 436.000 - - TP1481 - - - 436.000 - - TP1482 - - - 436.000 - - TP1483 - - - 436.000 - - TP1484 - - - 435.000 - - TP1485 - - - 435.000 - - TP1486 - - - 435.000 - - TP1487 - - - 435.000 - - TP1488 - - - 435.000 - - TP1489 - - - 435.000 - - TP1490 - - - 435.000 - - TP1491 - - - 435.000 - - TP1492 - - - 435.000 - - TP1493 - - - 435.000 - - TP1494 - - - 435.000 - - TP1495 - - - 436.000 - - TP1496 - - - 436.000 - - TP1497 - - - 436.000 - - TP1498 - - - 436.000 - - TP1499 - - - 436.000 - - TP1500 - - - 436.000 - - TP1501 - - - 436.000 - - TP1502 - - - 436.000 - - TP1503 - - - 436.000 - - TP1504 - - - 436.000 - - TP1505 - - - 436.000 - - TP1506 - - - 436.000 - - TP1507 - - - 436.000 - - TP1508 - - - 436.000 - - TP1509 - - - 436.000 - - TP1510 - - - 436.000 - - TP1511 - - - 436.000 - - TP1512 - - - 436.000 - - TP1513 - - - 436.000 - - TP1514 - - - 436.000 - - TP1515 - - - 436.000 - - TP1516 - - - 436.000 - - TP1517 - - - 436.000 - - TP1518 - - - 436.000 - - TP1519 - - - 436.000 - - TP1520 - - - 436.000 - - TP1521 - - - 436.000 - - TP1522 - - - 436.000 - - TP1523 - - - 436.000 - - TP1524 - - - 436.000 - - TP1525 - - - 436.000 - - TP1526 - - - 436.000 - - TP1527 - - - 436.000 - - TP1528 - - - 436.000 - - TP1529 - - - 436.000 - - TP1530 - - - 436.000 - - TP1531 - - - 436.000 - - TP1532 - - - 436.000 - - TP1533 - - - 436.000 - - TP1534 - - - 436.000 - - TP1535 - - - 436.000 - - TP1536 - - - 436.000 - - TP1537 - - - 436.000 - - TP1538 - - - 436.000 - - TP1539 - - - 436.000 - - TP1540 - - - 436.000 - - TP1541 - - - 436.000 - - TP1542 - - - 436.000 - - TP1543 - - - 436.000 - - TP1544 - - - 436.000 - - TP1545 - - - 436.000 - - TP1546 - - - 436.000 - - TP1547 - - - 436.000 - - TP1548 - - - 436.000 - - TP1549 - - - 436.000 - - TP1550 - - - 436.000 - - TP1551 - - - 436.000 - - TP1552 - - - 436.000 - - TP1553 - - - 436.000 - - TP1554 - - - 436.000 - - TP1555 - - - 436.000 - - TP1556 - - - 436.000 - - TP1557 - - - 436.000 - - TP1558 - - - 436.000 - - TP1559 - - - 436.000 - - TP1560 - - - 436.000 - - TP1561 - - - 436.000 - - TP1562 - - - 437.000 - - TP1563 - - - 437.000 - - TP1564 - - - 437.000 - - TP1565 - - - 437.000 - - TP1566 - - - 437.000 - - TP1567 - - - 437.000 - - TP1568 - - - 437.000 - - TP1569 - - - 437.000 - - TP1570 - - - 437.000 - - TP1571 - - - 437.000 - - TP1572 - - - 437.000 - - TP1573 - - - 437.000 - - TP1574 - - - 437.000 - - TP1575 - - - 437.000 - - TP1576 - - - 437.000 - - TP1577 - - - 437.000 - - TP1578 - - - 437.000 - - TP1579 - - - 438.000 - - TP1580 - - - 438.000 - - TP1581 - - - 438.000 - - TP1582 - - - 438.000 - - TP1583 - - - 438.000 - - TP1584 - - - 438.000 - - TP1585 - - - 438.000 - - TP1586 - - - 438.000 - - TP1587 - - - 438.000 - - TP1588 - - - 438.000 - - TP1589 - - - 438.000 - - TP1590 - - - 438.000 - - TP1591 - - - 438.000 - - TP1592 - - - 438.000 - - TP1593 - - - 438.000 - - TP1594 - - - 438.000 - - TP1595 - - - 438.000 - - TP1596 - - - 438.000 - - TP1597 - - - 438.000 - - TP1598 - - - 438.000 - - TP1599 - - - 438.000 - - TP1600 - - - 438.000 - - TP1601 - - - 439.000 - - TP1602 - - - 439.000 - - TP1603 - - - 439.000 - - TP1604 - - - 439.000 - - TP1605 - - - 439.000 - - TP1606 - - - 439.000 - - TP1607 - - - 439.000 - - TP1608 - - - 439.000 - - TP1609 - - - 439.000 - - TP1610 - - - 439.000 - - TP1611 - - - 439.000 - - TP1612 - - - 439.000 - - TP1613 - - - 439.000 - - TP1614 - - - 439.000 - - TP1615 - - - 439.000 - - TP1616 - - - 439.000 - - TP1617 - - - 439.000 - - TP1618 - - - 439.000 - - TP1619 - - - 439.000 - - TP1620 - - - 439.000 - - TP1621 - - - 439.000 - - TP1622 - - - 439.000 - - TP1623 - - - 439.000 - - TP1624 - - - 439.000 - - TP1625 - - - 439.000 - - TP1626 - - - 439.000 - - TP1627 - - - 439.000 - - TP1628 - - - 439.000 - - TP1629 - - - 439.000 - - TP1630 - - - 439.000 - - TP1631 - - - 439.000 - - TP1632 - - - 439.000 - - TP1633 - - - 439.000 - - TP1634 - - - 439.000 - - TP1635 - - - 439.000 - - TP1636 - - - 439.000 - - TP1637 - - - 439.000 - - TP1638 - - - 439.000 - - TP1639 - - - 439.000 - - TP1640 - - - 439.000 - - TP1641 - - - 439.000 - - TP1642 - - - 439.000 - - TP1643 - - - 440.000 - - TP1644 - - - 440.000 - - TP1645 - - - 440.000 - - TP1646 - - - 440.000 - - TP1647 - - - 440.000 - - TP1648 - - - 440.000 - - TP1649 - - - 440.000 - - TP1650 - - - 440.000 - - TP1651 - - - 440.000 - - TP1652 - - - 440.000 - - TP1653 - - - 440.000 - - TP1654 - - - 440.000 - - TP1655 - - - 440.000 - - TP1656 - - - 440.000 - - TP1657 - - - 440.000 - - TP1658 - - - 440.000 - - TP1659 - - - 440.000 - - TP1660 - - - 440.000 - - TP1661 - - - 440.000 - - TP1662 - - - 440.000 - - TP1663 - - - 440.000 - - TP1664 - - - 440.000 - - TP1665 - - - 440.000 - - TP1666 - - - 440.000 - - TP1667 - - - 440.000 - - TP1668 - - - 440.000 - - TP1669 - - - 440.000 - - TP1670 - - - 440.000 - - TP1671 - - - 440.000 - - TP1672 - - - 440.000 - - TP1673 - - - 440.000 - - TP1674 - - - 440.000 - - TP1675 - - - 440.000 - - TP1676 - - - 440.000 - - TP1677 - - - 440.000 - - TP1678 - - - 440.000 - - TP1679 - - - 440.000 - - TP1680 - - - 440.000 - - TP1681 - - - 440.000 - - TP1682 - - - 440.000 - - TP1683 - - - 440.000 - - TP1684 - - - 440.000 - - TP1685 - - - 440.000 - - TP1686 - - - 440.000 - - TP1687 - - - 440.000 - - TP1688 - - - 440.000 - - TP1689 - - - 440.000 - - TP1690 - - - 440.000 - - TP1691 - - - 440.000 - - TP1692 - - - 440.000 - - TP1693 - - - 440.000 - - TP1694 - - - 440.000 - - TP1695 - - - 440.000 - - TP1696 - - - 440.000 - - TP1697 - - - 440.000 - - TP1698 - - - 440.000 - - TP1699 - - - 440.000 - - TP1700 - - - 440.000 - - TP1701 - - - 440.000 - - TP1702 - - - 440.000 - - TP1703 - - - 440.000 - - TP1704 - - - 440.000 - - TP1705 - - - 440.000 - - TP1706 - - - 440.000 - - TP1707 - - - 440.000 - - TP1708 - - - 440.000 - - TP1709 - - - 440.000 - - TP1710 - - - 440.000 - - TP1711 - - - 440.000 - - TP1712 - - - 440.000 - - TP1713 - - - 440.000 - - TP1714 - - - 440.000 - - TP1715 - - - 440.000 - - TP1716 - - - 440.000 - - TP1717 - - - 440.000 - - TP1718 - - - 440.000 - - TP1719 - - - 440.000 - - TP1720 - - - 440.000 - - TP1721 - - - 440.000 - - TP1722 - - - 440.000 - - TP1723 - - - 440.000 - - TP1724 - - - 440.000 - - TP1725 - - - 440.000 - - TP1726 - - - 440.000 - - TP1727 - - - 440.000 - - TP1728 - - - 440.000 - - TP1729 - - - 440.000 - - TP1730 - - - 440.000 - - TP1731 - - - 440.000 - - TP1732 - - - 440.000 - - TP1733 - - - 440.000 - - TP1734 - - - 440.000 - - TP1735 - - - 440.000 - - TP1736 - - - 440.000 - - TP1737 - - - 440.000 - - TP1738 - - - 440.000 - - TP1739 - - - 440.000 - - TP1740 - - - 440.000 - - TP1741 - - - 440.000 - - TP1742 - - - 440.000 - - TP1743 - - - 440.000 - - TP1744 - - - 440.000 - - TP1745 - - - 440.000 - - TP1746 - - - 440.000 - - TP1747 - - - 440.000 - - TP1748 - - - 440.000 - - TP1749 - - - 440.000 - - TP1750 - - - 440.000 - - TP1751 - - - 440.000 - - TP1752 - - - 440.000 - - TP1753 - - - 440.000 - - TP1754 - - - 440.000 - - TP1755 - - - 440.000 - - TP1756 - - - 440.000 - - TP1757 - - - 440.000 - - TP1758 - - - 440.000 - - TP1759 - - - 441.000 - - TP1760 - - - 441.000 - - TP1761 - - - 441.000 - - TP1762 - - - 441.000 - - TP1763 - - - 441.000 - - TP1764 - - - 441.000 - - TP1765 - - - 441.000 - - TP1766 - - - 441.000 - - TP1767 - - - 441.000 - - TP1768 - - - 441.000 - - TP1769 - - - 441.000 - - TP1770 - - - 441.000 - - TP1771 - - - 441.000 - - TP1772 - - - 441.000 - - TP1773 - - - 441.000 - - TP1774 - - - 441.000 - - TP1775 - - - 441.000 - - TP1776 - - - 441.000 - - TP1777 - - - 441.000 - - TP1778 - - - 441.000 - - TP1779 - - - 441.000 - - TP1780 - - - 441.000 - - TP1781 - - - 441.000 - - TP1782 - - - 441.000 - - TP1783 - - - 441.000 - - TP1784 - - - 441.000 - - TP1785 - - - 441.000 - - TP1786 - - - 441.000 - - TP1787 - - - 441.000 - - TP1788 - - - 441.000 - - TP1789 - - - 441.000 - - TP1790 - - - 441.000 - - TP1791 - - - 441.000 - - TP1792 - - - 441.000 - - TP1793 - - - 441.000 - - TP1794 - - - 441.000 - - TP1795 - - - 441.000 - - TP1796 - - - 441.000 - - TP1797 - - - 441.000 - - TP1798 - - - 441.000 - - TP1799 - - - 441.000 - - TP1800 - - - 441.000 - - TP1801 - - - 441.000 - - TP1802 - - - 441.000 - - TP1803 - - - 441.000 - - TP1804 - - - 441.000 - - TP1805 - - - 441.000 - - TP1806 - - - 441.000 - - TP1807 - - - 441.000 - - TP1808 - - - 441.000 - - TP1809 - - - 441.000 - - TP1810 - - - 441.000 - - TP1811 - - - 441.000 - - TP1812 - - - 441.000 - - TP1813 - - - 441.000 - - TP1814 - - - 441.000 - - TP1815 - - - 441.000 - - TP1816 - - - 441.000 - - TP1817 - - - 441.000 - - TP1818 - - - 441.000 - - TP1819 - - - 441.000 - - TP1820 - - - 441.000 - - TP1821 - - - 441.000 - - TP1822 - - - 441.000 - - TP1823 - - - 441.000 - - TP1824 - - - 441.000 - - TP1825 - - - 441.000 - - TP1826 - - - 441.000 - - TP1827 - - - 441.000 - - TP1828 - - - 441.000 - - TP1829 - - - 441.000 - - TP1830 - - - 441.000 - - TP1831 - - - 441.000 - - TP1832 - - - 441.000 - - TP1833 - - - 441.000 - - TP1834 - - - 441.000 - - TP1835 - - - 441.000 - - TP1836 - - - 441.000 - - TP1837 - - - 441.000 - - TP1838 - - - 441.000 - - TP1839 - - - 441.000 - - TP1840 - - - 441.000 - - TP1841 - - - 441.000 - - TP1842 - - - 441.000 - - TP1843 - - - 441.000 - - TP1844 - - - 441.000 - - TP1845 - - - 441.000 - - TP1846 - - - 441.000 - - TP1847 - - - 441.000 - - TP1848 - - - 441.000 - - TP1849 - - - 441.000 - - TP1850 - - - 441.000 - - TP1851 - - - 441.000 - - TP1852 - - - 441.000 - - TP1853 - - - 441.000 - - TP1854 - - - 441.000 - - TP1855 - - - 441.000 - - TP1856 - - - 441.000 - - TP1857 - - - 441.000 - - TP1858 - - - 441.000 - - TP1859 - - - 441.000 - - TP1860 - - - 441.000 - - TP1861 - - - 441.000 - - TP1862 - - - 441.000 - - TP1863 - - - 441.000 - - TP1864 - - - 441.000 - - TP1865 - - - 441.000 - - TP1866 - - - 441.000 - - TP1867 - - - 441.000 - - TP1868 - - - 441.000 - - TP1869 - - - 441.000 - - TP1870 - - - 441.000 - - TP1871 - - - 441.000 - - TP1872 - - - 441.000 - - TP1873 - - - 441.000 - - TP1874 - - - 441.000 - - TP1875 - - - 441.000 - - TP1876 - - - 441.000 - - TP1877 - - - 441.000 - - TP1878 - - - 441.000 - - TP1879 - - - 441.000 - - TP1880 - - - 441.000 - - TP1881 - - - 441.000 - - TP1882 - - - 441.000 - - TP1883 - - - 441.000 - - TP1884 - - - 441.000 - - TP1885 - - - 441.000 - - TP1886 - - - 441.000 - - TP1887 - - - 441.000 - - TP1888 - - - 441.000 - - TP1889 - - - 441.000 - - TP1890 - - - 441.000 - - TP1891 - - - 441.000 - - TP1892 - - - 441.000 - - TP1893 - - - 441.000 - - TP1894 - - - 441.000 - - TP1895 - - - 441.000 - - TP1896 - - - 441.000 - - TP1897 - - - 441.000 - - TP1898 - - - 441.000 - - TP1899 - - - 441.000 - - TP1900 - - - 441.000 - - TP1901 - - - 441.000 - - TP1902 - - - 441.000 - - TP1903 - - - 441.000 - - TP1904 - - - 441.000 - - TP1905 - - - 441.000 - - TP1906 - - - 441.000 - - TP1907 - - - 441.000 - - TP1908 - - - 441.000 - - TP1909 - - - 441.000 - - TP1910 - - - 441.000 - - TP1911 - - - 441.000 - - TP1912 - - - 441.000 - - TP1913 - - - 441.000 - - TP1914 - - - 441.000 - - TP1915 - - - 441.000 - - TP1916 - - - 441.000 - - TP1917 - - - 441.000 - - TP1918 - - - 441.000 - - TP1919 - - - 441.000 - - TP1920 - - - 441.000 - - TP1921 - - - 441.000 - - TP1922 - - - 441.000 - - TP1923 - - - 441.000 - - TP1924 - - - 441.000 - - TP1925 - - - 441.000 - - TP1926 - - - 441.000 - - TP1927 - - - 441.000 - - TP1928 - - - 441.000 - - TP1929 - - - 441.000 - - TP1930 - - - 441.000 - - TP1931 - - - 441.000 - - TP1932 - - - 441.000 - - TP1933 - - - 441.000 - - TP1934 - - - 441.000 - - TP1935 - - - 441.000 - - TP1936 - - - 441.000 - - TP1937 - - - 441.000 - - TP1938 - - - 441.000 - - TP1939 - - - 441.000 - - TP1940 - - - 441.000 - - TP1941 - - - 441.000 - - TP1942 - - - 441.000 - - TP1943 - - - 441.000 - - TP1944 - - - 441.000 - - TP1945 - - - 441.000 - - TP1946 - - - 441.000 - - TP1947 - - - 441.000 - - TP1948 - - - 441.000 - - TP1949 - - - 441.000 - - TP1950 - - - 441.000 - - TP1951 - - - 441.000 - - TP1952 - - - 441.000 - - TP1953 - - - 441.000 - - TP1954 - - - 441.000 - - TP1955 - - - 441.000 - - TP1956 - - - 441.000 - - TP1957 - - - 441.000 - - TP1958 - - - 441.000 - - TP1959 - - - 441.000 - - TP1960 - - - 441.000 - - TP1961 - - - 441.000 - - TP1962 - - - 441.000 - - TP1963 - - - 441.000 - - TP1964 - - - 441.000 - - TP1965 - - - 441.000 - - TP1966 - - - 441.000 - - TP1967 - - - 441.000 - - TP1968 - - - 441.000 - - TP1969 - - - 441.000 - - TP1970 - - - 441.000 - - TP1971 - - - 441.000 - - TP1972 - - - 441.000 - - TP1973 - - - 441.000 - - TP1974 - - - 441.000 - - TP1975 - - - 441.000 - - TP1976 - - - 441.000 - - TP1977 - - - 441.000 - - TP1978 - - - 441.000 - - TP1979 - - - 441.000 - - TP1980 - - - 441.000 - - TP1981 - - - 441.000 - - TP1982 - - - 441.000 - - TP1983 - - - 441.000 - - TP1984 - - - 441.000 - - TP1985 - - - 441.000 - - TP1986 - - - 441.000 - - TP1987 - - - 441.000 - - TP1988 - - - 441.000 - - TP1989 - - - 441.000 - - TP1990 - - - 441.000 - - TP1991 - - - 441.000 - - TP1992 - - - 441.000 - - TP1993 - - - 441.000 - - TP1994 - - - 441.000 - - TP1995 - - - 441.000 - - TP1996 - - - 441.000 - - TP1997 - - - 441.000 - - TP1998 - - - 441.000 - - TP1999 - - - 441.000 - - TP2000 - - - 441.000 - - TP2001 - - - 441.000 - - TP2002 - - - 441.000 - - TP2003 - - - 441.000 - - TP2004 - - - 441.000 - - TP2005 - - - 441.000 - - TP2006 - - - 441.000 - - TP2007 - - - 441.000 - - TP2008 - - - 441.000 - - TP2009 - - - 441.000 - - TP2010 - - - 441.000 - - TP2011 - - - 441.000 - - TP2012 - - - 441.000 - - TP2013 - - - 441.000 - - TP2014 - - - 441.000 - - TP2015 - - - 441.000 - - TP2016 - - - 441.000 - - TP2017 - - - 441.000 - - TP2018 - - - 441.000 - - TP2019 - - - 441.000 - - TP2020 - - - 441.000 - - TP2021 - - - 441.000 - - TP2022 - - - 441.000 - - TP2023 - - - 441.000 - - TP2024 - - - 441.000 - - TP2025 - - - 441.000 - - TP2026 - - - 441.000 - - TP2027 - - - 441.000 - - TP2028 - - - 441.000 - - TP2029 - - - 441.000 - - TP2030 - - - 441.000 - - TP2031 - - - 441.000 - - TP2032 - - - 441.000 - - TP2033 - - - 441.000 - - TP2034 - - - 441.000 - - TP2035 - - - 441.000 - - TP2036 - - - 441.000 - - TP2037 - - - 441.000 - - TP2038 - - - 441.000 - - TP2039 - - - 441.000 - - TP2040 - - - 441.000 - - TP2041 - - - 441.000 - - TP2042 - - - 441.000 - - TP2043 - - - 441.000 - - TP2044 - - - 441.000 - - TP2045 - - - 440.000 - - TP2046 - - - 440.000 - - TP2047 - - - 440.000 - - TP2048 - - - 440.000 - - TP2049 - - - 440.000 - - TP2050 - - - 440.000 - - TP2051 - - - 440.000 - - TP2052 - - - 440.000 - - TP2053 - - - 440.000 - - TP2054 - - - 440.000 - - TP2055 - - - 440.000 - - TP2056 - - - 440.000 - - TP2057 - - - 440.000 - - TP2058 - - - 440.000 - - TP2059 - - - 440.000 - - TP2060 - - - 440.000 - - TP2061 - - - 440.000 - - TP2062 - - - 440.000 - - TP2063 - - - 440.000 - - TP2064 - - - 440.000 - - TP2065 - - - 440.000 - - TP2066 - - - 440.000 - - TP2067 - - - 440.000 - - TP2068 - - - 440.000 - - TP2069 - - - 440.000 - - TP2070 - - - 440.000 - - TP2071 - - - 440.000 - - TP2072 - - - 440.000 - - TP2073 - - - 440.000 - - TP2074 - - - 440.000 - - TP2075 - - - 440.000 - - TP2076 - - - 440.000 - - TP2077 - - - 440.000 - - TP2078 - - - 440.000 - - TP2079 - - - 440.000 - - TP2080 - - - 440.000 - - TP2081 - - - 440.000 - - TP2082 - - - 440.000 - - TP2083 - - - 440.000 - - TP2084 - - - 440.000 - - TP2085 - - - 440.000 - - TP2086 - - - 440.000 - - TP2087 - - - 440.000 - - TP2088 - - - 440.000 - - TP2089 - - - 440.000 - - TP2090 - - - 440.000 - - TP2091 - - - 440.000 - - TP2092 - - - 440.000 - - TP2093 - - - 440.000 - - TP2094 - - - 440.000 - - TP2095 - - - 440.000 - - TP2096 - - - 440.000 - - TP2097 - - - 440.000 - - TP2098 - - - 440.000 - - TP2099 - - - 440.000 - - TP2100 - - - 440.000 - - TP2101 - - - 440.000 - - TP2102 - - - 440.000 - - TP2103 - - - 440.000 - - TP2104 - - - 440.000 - - TP2105 - - - 440.000 - - TP2106 - - - 440.000 - - TP2107 - - - 440.000 - - TP2108 - - - 440.000 - - TP2109 - - - 440.000 - - TP2110 - - - 440.000 - - TP2111 - - - 440.000 - - TP2112 - - - 440.000 - - TP2113 - - - 440.000 - - TP2114 - - - 440.000 - - TP2115 - - - 440.000 - - TP2116 - - - 440.000 - - TP2117 - - - 440.000 - - TP2118 - - - 440.000 - - TP2119 - - - 440.000 - - TP2120 - - - 447.000 - - TP2121 - - - 447.000 - - TP2122 - - - 446.000 - - TP2123 - - - 446.000 - - TP2124 - - - 446.000 - - TP2125 - - - 446.000 - - TP2126 - - - 446.000 - - TP2127 - - - 446.000 - - TP2128 - - - 446.000 - - TP2129 - - - 446.000 - - TP2130 - - - 446.000 - - TP2131 - - - 446.000 - - TP2132 - - - 446.000 - - TP2133 - - - 446.000 - - TP2134 - - - 446.000 - - TP2135 - - - 446.000 - - TP2136 - - - 446.000 - - TP2137 - - - 446.000 - - TP2138 - - - 446.000 - - TP2139 - - - 446.000 - - TP2140 - - - 446.000 - - TP2141 - - - 446.000 - - TP2142 - - - 446.000 - - TP2143 - - - 446.000 - - TP2144 - - - 446.000 - - TP2145 - - - 446.000 - - TP2146 - - - 446.000 - - TP2147 - - - 446.000 - - TP2148 - - - 446.000 - - TP2149 - - - 446.000 - - TP2150 - - - 446.000 - - TP2151 - - - 446.000 - - TP2152 - - - 446.000 - - TP2153 - - - 446.000 - - TP2154 - - - 446.000 - - TP2155 - - - 446.000 - - TP2156 - - - 446.000 - - TP2157 - - - 446.000 - - TP2158 - - - 446.000 - - TP2159 - - - 446.000 - - TP2160 - - - 446.000 - - TP2161 - - - 446.000 - - TP2162 - - - 446.000 - - TP2163 - - - 446.000 - - TP2164 - - - 446.000 - - TP2165 - - - 446.000 - - TP2166 - - - 446.000 - - TP2167 - - - 446.000 - - TP2168 - - - 446.000 - - TP2169 - - - 446.000 - - TP2170 - - - 446.000 - - TP2171 - - - 446.000 - - TP2172 - - - 446.000 - - TP2173 - - - 446.000 - - TP2174 - - - 446.000 - - TP2175 - - - 446.000 - - TP2176 - - - 446.000 - - TP2177 - - - 446.000 - - TP2178 - - - 446.000 - - TP2179 - - - 446.000 - - TP2180 - - - 446.000 - - TP2181 - - - 446.000 - - TP2182 - - - 446.000 - - TP2183 - - - 446.000 - - TP2184 - - - 446.000 - - TP2185 - - - 446.000 - - TP2186 - - - 446.000 - - TP2187 - - - 446.000 - - TP2188 - - - 446.000 - - TP2189 - - - 446.000 - - TP2190 - - - 446.000 - - TP2191 - - - 446.000 - - TP2192 - - - 446.000 - - TP2193 - - - 446.000 - - TP2194 - - - 446.000 - - TP2195 - - - 446.000 - - TP2196 - - - 446.000 - - TP2197 - - - 446.000 - - TP2198 - - - 446.000 - - TP2199 - - - 446.000 - - TP2200 - - - 446.000 - - TP2201 - - - 446.000 - - TP2202 - - - 446.000 - - TP2203 - - - 446.000 - - TP2204 - - - 446.000 - - TP2205 - - - 446.000 - - TP2206 - - - 446.000 - - TP2207 - - - 446.000 - - TP2208 - - - 446.000 - - TP2209 - - - 446.000 - - TP2210 - - - 446.000 - - TP2211 - - - 446.000 - - TP2212 - - - 446.000 - - TP2213 - - - 446.000 - - TP2214 - - - 446.000 - - TP2215 - - - 446.000 - - TP2216 - - - 446.000 - - TP2217 - - - 446.000 - - TP2218 - - - 446.000 - - TP2219 - - - 446.000 - - TP2220 - - - 446.000 - - TP2221 - - - 446.000 - - TP2222 - - - 446.000 - - TP2223 - - - 446.000 - - TP2224 - - - 446.000 - - TP2225 - - - 446.000 - - TP2226 - - - 446.000 - - TP2227 - - - 446.000 - - TP2228 - - - 446.000 - - TP2229 - - - 446.000 - - TP2230 - - - 446.000 - - TP2231 - - - 446.000 - - TP2232 - - - 446.000 - - TP2233 - - - 446.000 - - TP2234 - - - 446.000 - - TP2235 - - - 446.000 - - TP2236 - - - 446.000 - - TP2237 - - - 446.000 - - TP2238 - - - 446.000 - - TP2239 - - - 446.000 - - TP2240 - - - 446.000 - - TP2241 - - - 446.000 - - TP2242 - - - 446.000 - - TP2243 - - - 446.000 - - TP2244 - - - 446.000 - - TP2245 - - - 446.000 - - TP2246 - - - 446.000 - - TP2247 - - - 446.000 - - TP2248 - - - 446.000 - - TP2249 - - - 446.000 - - TP2250 - - - 446.000 - - TP2251 - - - 446.000 - - TP2252 - - - 446.000 - - TP2253 - - - 446.000 - - TP2254 - - - 446.000 - - TP2255 - - - 446.000 - - TP2256 - - - 446.000 - - TP2257 - - - 446.000 - - TP2258 - - - 446.000 - - TP2259 - - - 446.000 - - TP2260 - - - 446.000 - - TP2261 - - - 446.000 - - TP2262 - - - 446.000 - - TP2263 - - - 446.000 - - TP2264 - - - 446.000 - - TP2265 - - - 446.000 - - TP2266 - - - 446.000 - - TP2267 - - - 446.000 - - TP2268 - - - 446.000 - - TP2269 - - - 446.000 - - TP2270 - - - 446.000 - - TP2271 - - - 446.000 - - TP2272 - - - 446.000 - - TP2273 - - - 446.000 - - TP2274 - - - 446.000 - - TP2275 - - - 446.000 - - TP2276 - - - 446.000 - - TP2277 - - - 446.000 - - TP2278 - - - 446.000 - - TP2279 - - - 446.000 - - TP2280 - - - 446.000 - - TP2281 - - - 446.000 - - TP2282 - - - 446.000 - - TP2283 - - - 446.000 - - TP2284 - - - 446.000 - - TP2285 - - - 446.000 - - TP2286 - - - 446.000 - - TP2287 - - - 446.000 - - TP2288 - - - 446.000 - - TP2289 - - - 446.000 - - TP2290 - - - 446.000 - - TP2291 - - - 446.000 - - TP2292 - - - 446.000 - - TP2293 - - - 446.000 - - TP2294 - - - 446.000 - - TP2295 - - - 446.000 - - TP2296 - - - 446.000 - - TP2297 - - - 446.000 - - TP2298 - - - 446.000 - - TP2299 - - - 446.000 - - TP2300 - - - 446.000 - - TP2301 - - - 446.000 - - TP2302 - - - 446.000 - - TP2303 - - - 446.000 - - TP2304 - - - 446.000 - - TP2305 - - - 446.000 - - TP2306 - - - 446.000 - - TP2307 - - - 446.000 - - TP2308 - - - 446.000 - - TP2309 - - - 446.000 - - TP2310 - - - 446.000 - - TP2311 - - - 446.000 - - TP2312 - - - 446.000 - - TP2313 - - - 446.000 - - TP2314 - - - 446.000 - - TP2315 - - - 446.000 - - TP2316 - - - 446.000 - - TP2317 - - - 446.000 - - TP2318 - - - 446.000 - - TP2319 - - - 446.000 - - TP2320 - - - 446.000 - - TP2321 - - - 446.000 - - TP2322 - - - 446.000 - - TP2323 - - - 446.000 - - TP2324 - - - 446.000 - - TP2325 - - - 446.000 - - TP2326 - - - 446.000 - - TP2327 - - - 446.000 - - TP2328 - - - 446.000 - - TP2329 - - - 446.000 - - TP2330 - - - 446.000 - - TP2331 - - - 446.000 - - TP2332 - - - 446.000 - - TP2333 - - - 446.000 - - TP2334 - - - 446.000 - - TP2335 - - - 446.000 - - TP2336 - - - 446.000 - - TP2337 - - - 446.000 - - TP2338 - - - 446.000 - - TP2339 - - - 446.000 - - TP2340 - - - 446.000 - - TP2341 - - - 446.000 - - TP2342 - - - 446.000 - - TP2343 - - - 446.000 - - TP2344 - - - 446.000 - - TP2345 - - - 446.000 - - TP2346 - - - 446.000 - - TP2347 - - - 446.000 - - TP2348 - - - 446.000 - - TP2349 - - - 446.000 - - TP2350 - - - 446.000 - - TP2351 - - - 446.000 - - TP2352 - - - 446.000 - - TP2353 - - - 446.000 - - TP2354 - - - 446.000 - - TP2355 - - - 446.000 - - TP2356 - - - 446.000 - - TP2357 - - - 446.000 - - TP2358 - - - 446.000 - - TP2359 - - - 446.000 - - TP2360 - - - 446.000 - - TP2361 - - - 446.000 - - TP2362 - - - 446.000 - - TP2363 - - - 446.000 - - TP2364 - - - 446.000 - - TP2365 - - - 446.000 - - TP2366 - - - 446.000 - - TP2367 - - - 446.000 - - TP2368 - - - 446.000 - - TP2369 - - - 446.000 - - TP2370 - - - 446.000 - - TP2371 - - - 446.000 - - TP2372 - - - 446.000 - - TP2373 - - - 446.000 - - TP2374 - - - 446.000 - - TP2375 - - - 446.000 - - TP2376 - - - 446.000 - - TP2377 - - - 446.000 - - TP2378 - - - 446.000 - - TP2379 - - - 446.000 - - TP2380 - - - 446.000 - - TP2381 - - - 446.000 - - TP2382 - - - 446.000 - - TP2383 - - - 446.000 - - TP2384 - - - 446.000 - - TP2385 - - - 446.000 - - TP2386 - - - 446.000 - - TP2387 - - - 446.000 - - TP2388 - - - 446.000 - - TP2389 - - - 446.000 - - TP2390 - - - 446.000 - - TP2391 - - - 446.000 - - TP2392 - - - 446.000 - - TP2393 - - - 446.000 - - TP2394 - - - 446.000 - - TP2395 - - - 446.000 - - TP2396 - - - 446.000 - - TP2397 - - - 446.000 - - TP2398 - - - 446.000 - - TP2399 - - - 446.000 - - TP2400 - - - 446.000 - - TP2401 - - - 446.000 - - TP2402 - - - 446.000 - - TP2403 - - - 446.000 - - TP2404 - - - 446.000 - - TP2405 - - - 446.000 - - TP2406 - - - 446.000 - - TP2407 - - - 446.000 - - TP2408 - - - 446.000 - - TP2409 - - - 446.000 - - TP2410 - - - 446.000 - - TP2411 - - - 446.000 - - TP2412 - - - 446.000 - - TP2413 - - - 446.000 - - TP2414 - - - 446.000 - - TP2415 - - - 446.000 - - TP2416 - - - 446.000 - - TP2417 - - - 446.000 - - TP2418 - - - 446.000 - - TP2419 - - - 446.000 - - TP2420 - - - 446.000 - - TP2421 - - - 446.000 - - TP2422 - - - 446.000 - - TP2423 - - - 446.000 - - TP2424 - - - 446.000 - - TP2425 - - - 446.000 - - TP2426 - - - 446.000 - - TP2427 - - - 446.000 - - TP2428 - - - 446.000 - - TP2429 - - - 446.000 - - TP2430 - - - 446.000 - - TP2431 - - - 446.000 - - TP2432 - - - 446.000 - - TP2433 - - - 446.000 - - TP2434 - - - 446.000 - - TP2435 - - - 446.000 - - TP2436 - - - 446.000 - - TP2437 - - - 446.000 - - TP2438 - - - 446.000 - - TP2439 - - - 446.000 - - TP2440 - - - 446.000 - - TP2441 - - - 446.000 - - TP2442 - - - 446.000 - - TP2443 - - - 446.000 - - TP2444 - - - 446.000 - - TP2445 - - - 446.000 - - TP2446 - - - 446.000 - - TP2447 - - - 446.000 - - TP2448 - - - 446.000 - - TP2449 - - - 446.000 - - TP2450 - - - 446.000 - - TP2451 - - - 446.000 - - TP2452 - - - 446.000 - - TP2453 - - - 446.000 - - TP2454 - - - 446.000 - - TP2455 - - - 446.000 - - TP2456 - - - 446.000 - - TP2457 - - - 446.000 - - TP2458 - - - 446.000 - - TP2459 - - - 446.000 - - TP2460 - - - 446.000 - - TP2461 - - - 446.000 - - TP2462 - - - 446.000 - - TP2463 - - - 446.000 - - TP2464 - - - 446.000 - - TP2465 - - - 446.000 - - TP2466 - - - 446.000 - - TP2467 - - - 446.000 - - TP2468 - - - 446.000 - - TP2469 - - - 446.000 - - TP2470 - - - 446.000 - - TP2471 - - - 446.000 - - TP2472 - - - 446.000 - - TP2473 - - - 446.000 - - TP2474 - - - 446.000 - - TP2475 - - - 446.000 - - TP2476 - - - 446.000 - - TP2477 - - - 446.000 - - TP2478 - - - 446.000 - - TP2479 - - - 446.000 - - TP2480 - - - 446.000 - - TP2481 - - - 446.000 - - TP2482 - - - 446.000 - - TP2483 - - - 446.000 - - TP2484 - - - 446.000 - - TP2485 - - - 446.000 - - TP2486 - - - 446.000 - - TP2487 - - - 446.000 - - TP2488 - - - 446.000 - - TP2489 - - - 446.000 - - TP2490 - - - 446.000 - - TP2491 - - - 446.000 - - TP2492 - - - 446.000 - - TP2493 - - - 446.000 - - TP2494 - - - 446.000 - - TP2495 - - - 446.000 - - TP2496 - - - 446.000 - - TP2497 - - - 446.000 - - TP2498 - - - 446.000 - - TP2499 - - - 446.000 - - TP2500 - - - 446.000 - - TP2501 - - - 446.000 - - TP2502 - - - 446.000 - - TP2503 - - - 446.000 - - TP2504 - - - 446.000 - - TP2505 - - - 446.000 - - TP2506 - - - 446.000 - - TP2507 - - - 446.000 - - TP2508 - - - 446.000 - - TP2509 - - - 446.000 - - TP2510 - - - 446.000 - - TP2511 - - - 446.000 - - TP2512 - - - 446.000 - - TP2513 - - - 446.000 - - TP2514 - - - 446.000 - - TP2515 - - - 446.000 - - TP2516 - - - 446.000 - - TP2517 - - - 446.000 - - TP2518 - - - 446.000 - - TP2519 - - - 446.000 - - TP2520 - - - 446.000 - - TP2521 - - - 446.000 - - TP2522 - - - 446.000 - - TP2523 - - - 446.000 - - TP2524 - - - 446.000 - - TP2525 - - - 446.000 - - TP2526 - - - 446.000 - - TP2527 - - - 446.000 - - TP2528 - - - 446.000 - - TP2529 - - - 446.000 - - TP2530 - - - 446.000 - - TP2531 - - - 446.000 - - TP2532 - - - 446.000 - - TP2533 - - - 446.000 - - TP2534 - - - 446.000 - - TP2535 - - - 446.000 - - TP2536 - - - 446.000 - - TP2537 - - - 446.000 - - TP2538 - - - 446.000 - - TP2539 - - - 446.000 - - TP2540 - - - 446.000 - - TP2541 - - - 446.000 - - TP2542 - - - 446.000 - - TP2543 - - - 446.000 - - TP2544 - - - 446.000 - - TP2545 - - - 446.000 - - TP2546 - - - 446.000 - - TP2547 - - - 446.000 - - TP2548 - - - 446.000 - - TP2549 - - - 446.000 - - TP2550 - - - 446.000 - - TP2551 - - - 446.000 - - TP2552 - - - 446.000 - - TP2553 - - - 446.000 - - TP2554 - - - 446.000 - - TP2555 - - - 446.000 - - TP2556 - - - 446.000 - - TP2557 - - - 446.000 - - TP2558 - - - 446.000 - - TP2559 - - - 446.000 - - TP2560 - - - 446.000 - - TP2561 - - - 446.000 - - TP2562 - - - 446.000 - - TP2563 - - - 446.000 - - TP2564 - - - 446.000 - - TP2565 - - - 446.000 - - TP2566 - - - 446.000 - - TP2567 - - - 446.000 - - TP2568 - - - 446.000 - - TP2569 - - - 446.000 - - TP2570 - - - 446.000 - - TP2571 - - - 446.000 - - TP2572 - - - 446.000 - - TP2573 - - - 446.000 - - TP2574 - - - 446.000 - - TP2575 - - - 446.000 - - TP2576 - - - 446.000 - - TP2577 - - - 446.000 - - TP2578 - - - 446.000 - - TP2579 - - - 446.000 - - TP2580 - - - 446.000 - - TP2581 - - - 446.000 - - TP2582 - - - 446.000 - - TP2583 - - - 446.000 - - TP2584 - - - 446.000 - - TP2585 - - - 446.000 - - TP2586 - - - 446.000 - - TP2587 - - - 446.000 - - TP2588 - - - 446.000 - - TP2589 - - - 447.000 - - TP2590 - - - 447.000 - - TP2591 - - - 447.000 - - TP2592 - - - 447.000 - - TP2593 - - - 447.000 - - TP2594 - - - 447.000 - - TP2595 - - - 447.000 - - TP2596 - - - 447.000 - - TP2597 - - - 447.000 - - TP2598 - - - 447.000 - - TP2599 - - - 447.000 - - TP2600 - - - 447.000 - - TP2601 - - - 447.000 - - TP2602 - - - 447.000 - - TP2603 - - - 447.000 - - TP2604 - - - 447.000 - - TP2605 - - - 447.000 - - TP2606 - - - 447.000 - - TP2607 - - - 447.000 - - TP2608 - - - 447.000 - - TP2609 - - - 447.000 - - TP2610 - - - 447.000 - - TP2611 - - - 447.000 - - TP2612 - - - 447.000 - - TP2613 - - - 447.000 - - TP2614 - - - 447.000 - - TP2615 - - - 447.000 - - TP2616 - - - 447.000 - - TP2617 - - - 447.000 - - TP2618 - - - 447.000 - - TP2619 - - - 447.000 - - TP2620 - - - 447.000 - - TP2621 - - - 447.000 - - TP2622 - - - 447.000 - - TP2623 - - - 447.000 - - TP2624 - - - 447.000 - - TP2625 - - - 447.000 - - TP2626 - - - 446.000 - - TP2627 - - - 446.000 - - TP2628 - - - 446.000 - - TP2629 - - - 446.000 - - TP2630 - - - 446.000 - - TP2631 - - - 446.000 - - TP2632 - - - 446.000 - - TP2633 - - - 446.000 - - TP2634 - - - 446.000 - - TP2635 - - - 446.000 - - TP2636 - - - 446.000 - - TP2637 - - - 446.000 - - TP2638 - - - 446.000 - - TP2639 - - - 446.000 - - TP2640 - - - 446.000 - - TP2641 - - - 446.000 - - TP2642 - - - 446.000 - - TP2643 - - - 447.000 - - TP2644 - - - 447.000 - - TP2645 - - - 447.000 - - TP2646 - - - 447.000 - - TP2647 - - - 447.000 - - TP2648 - - - 447.000 - - TP2649 - - - 447.000 - - TP2650 - - - 447.000 - - TP2651 - - - 447.000 - - TP2652 - - - 447.000 - - TP2653 - - - 447.000 - - TP2654 - - - 447.000 - - TP2655 - - - 447.000 - - TP2656 - - - 447.000 - - TP2657 - - - 447.000 - - TP2658 - - - 447.000 - - TP2659 - - - 447.000 - - TP2660 - - - 447.000 - - TP2661 - - - 447.000 - - TP2662 - - - 447.000 - - TP2663 - - - 447.000 - - TP2664 - - - 447.000 - - TP2665 - - - 447.000 - - TP2666 - - - 447.000 - - TP2667 - - - 448.000 - - TP2668 - - - 448.000 - - TP2669 - - - 448.000 - - TP2670 - - - 448.000 - - TP2671 - - - 448.000 - - TP2672 - - - 448.000 - - TP2673 - - - 448.000 - - TP2674 - - - 448.000 - - TP2675 - - - 448.000 - - TP2676 - - - 448.000 - - TP2677 - - - 448.000 - - TP2678 - - - 448.000 - - TP2679 - - - 448.000 - - TP2680 - - - 448.000 - - TP2681 - - - 448.000 - - TP2682 - - - 448.000 - - TP2683 - - - 448.000 - - TP2684 - - - 448.000 - - TP2685 - - - 448.000 - - TP2686 - - - 448.000 - - TP2687 - - - 448.000 - - TP2688 - - - 448.000 - - TP2689 - - - 448.000 - - TP2690 - - - 448.000 - - TP2691 - - - 448.000 - - TP2692 - - - 448.000 - - TP2693 - - - 448.000 - - TP2694 - - - 448.000 - - TP2695 - - - 448.000 - - TP2696 - - - 448.000 - - TP2697 - - - 448.000 - - TP2698 - - - 448.000 - - TP2699 - - - 448.000 - - TP2700 - - - 448.000 - - TP2701 - - - 448.000 - - TP2702 - - - 448.000 - - TP2703 - - - 448.000 - - TP2704 - - - 448.000 - - TP2705 - - - 448.000 - - TP2706 - - - 448.000 - - TP2707 - - - 448.000 - - TP2708 - - - 448.000 - - TP2709 - - - 448.000 - - TP2710 - - - 448.000 - - TP2711 - - - 448.000 - - TP2712 - - - 448.000 - - TP2713 - - - 448.000 - - TP2714 - - - 448.000 - - TP2715 - - - 448.000 - - TP2716 - - - 448.000 - - TP2717 - - - 448.000 - - TP2718 - - - 448.000 - - TP2719 - - - 448.000 - - TP2720 - - - 448.000 - - TP2721 - - - 448.000 - - TP2722 - - - 448.000 - - TP2723 - - - 448.000 - - TP2724 - - - 448.000 - - TP2725 - - - 448.000 - - TP2726 - - - 448.000 - - TP2727 - - - 448.000 - - TP2728 - - - 448.000 - - TP2729 - - - 448.000 - - TP2730 - - - 448.000 - - TP2731 - - - 448.000 - - TP2732 - - - 448.000 - - TP2733 - - - 448.000 - - TP2734 - - - 448.000 - - TP2735 - - - 448.000 - - TP2736 - - - 448.000 - - TP2737 - - - 448.000 - - TP2738 - - - 448.000 - - TP2739 - - - 448.000 - - TP2740 - - - 448.000 - - TP2741 - - - 448.000 - - TP2742 - - - 448.000 - - TP2743 - - - 448.000 - - TP2744 - - - 448.000 - - TP2745 - - - 448.000 - - TP2746 - - - 448.000 - - TP2747 - - - 448.000 - - TP2748 - - - 448.000 - - TP2749 - - - 448.000 - - TP2750 - - - 448.000 - - TP2751 - - - 448.000 - - TP2752 - - - 448.000 - - TP2753 - - - 448.000 - - TP2754 - - - 448.000 - - TP2755 - - - 448.000 - - TP2756 - - - 448.000 - - TP2757 - - - 448.000 - - TP2758 - - - 448.000 - - TP2759 - - - 448.000 - - TP2760 - - - 448.000 - - TP2761 - - - 448.000 - - TP2762 - - - 448.000 - - TP2763 - - - 448.000 - - TP2764 - - - 448.000 - - TP2765 - - - 448.000 - - TP2766 - - - 448.000 - - TP2767 - - - 448.000 - - TP2768 - - - 448.000 - - TP2769 - - - 448.000 - - TP2770 - - - 448.000 - - TP2771 - - - 448.000 - - TP2772 - - - 448.000 - - TP2773 - - - 448.000 - - TP2774 - - - 448.000 - - TP2775 - - - 448.000 - - TP2776 - - - 448.000 - - TP2777 - - - 448.000 - - TP2778 - - - 448.000 - - TP2779 - - - 448.000 - - TP2780 - - - 448.000 - - TP2781 - - - 448.000 - - TP2782 - - - 448.000 - - TP2783 - - - 448.000 - - TP2784 - - - 448.000 - - TP2785 - - - 448.000 - - TP2786 - - - 448.000 - - TP2787 - - - 448.000 - - TP2788 - - - 448.000 - - TP2789 - - - 448.000 - - TP2790 - - - 448.000 - - TP2791 - - - 448.000 - - TP2792 - - - 448.000 - - TP2793 - - - 448.000 - - TP2794 - - - 448.000 - - TP2795 - - - 448.000 - - TP2796 - - - 448.000 - - TP2797 - - - 448.000 - - TP2798 - - - 449.000 - - TP2799 - - - 449.000 - - TP2800 - - - 449.000 - - TP2801 - - - 449.000 - - TP2802 - - - 449.000 - - TP2803 - - - 449.000 - - TP2804 - - - 449.000 - - TP2805 - - - 449.000 - - TP2806 - - - 449.000 - - TP2807 - - - 449.000 - - TP2808 - - - 449.000 - - TP2809 - - - 449.000 - - TP2810 - - - 449.000 - - TP2811 - - - 449.000 - - TP2812 - - - 449.000 - - TP2813 - - - 449.000 - - TP2814 - - - 449.000 - - TP2815 - - - 449.000 - - TP2816 - - - 449.000 - - TP2817 - - - 449.000 - - TP2818 - - - 449.000 - - TP2819 - - - 449.000 - - TP2820 - - - 449.000 - - TP2821 - - - 449.000 - - TP2822 - - - 449.000 - - TP2823 - - - 449.000 - - TP2824 - - - 449.000 - - TP2825 - - - 449.000 - - TP2826 - - - 449.000 - - TP2827 - - - 449.000 - - TP2828 - - - 449.000 - - TP2829 - - - 449.000 - - TP2830 - - - 449.000 - - TP2831 - - - 449.000 - - TP2832 - - - 449.000 - - TP2833 - - - 449.000 - - TP2834 - - - 449.000 - - TP2835 - - - 449.000 - - TP2836 - - - 449.000 - - TP2837 - - - 449.000 - - TP2838 - - - 449.000 - - TP2839 - - - 449.000 - - TP2840 - - - 449.000 - - TP2841 - - - 449.000 - - TP2842 - - - 449.000 - - TP2843 - - - 449.000 - - TP2844 - - - 449.000 - - TP2845 - - - 449.000 - - TP2846 - - - 449.000 - - TP2847 - - - 449.000 - - TP2848 - - - 449.000 - - TP2849 - - - 449.000 - - TP2850 - - - 449.000 - - TP2851 - - - 449.000 - - TP2852 - - - 449.000 - - TP2853 - - - 449.000 - - TP2854 - - - 449.000 - - TP2855 - - - 449.000 - - TP2856 - - - 449.000 - - TP2857 - - - 449.000 - - TP2858 - - - 449.000 - - TP2859 - - - 449.000 - - TP2860 - - - 449.000 - - TP2861 - - - 449.000 - - TP2862 - - - 449.000 - - TP2863 - - - 449.000 - - TP2864 - - - 449.000 - - TP2865 - - - 449.000 - - TP2866 - - - 449.000 - - TP2867 - - - 449.000 - - TP2868 - - - 449.000 - - TP2869 - - - 449.000 - - TP2870 - - - 449.000 - - TP2871 - - - 449.000 - - TP2872 - - - 449.000 - - TP2873 - - - 448.000 - - TP2874 - - - 448.000 - - TP2875 - - - 448.000 - - TP2876 - - - 448.000 - - TP2877 - - - 448.000 - - TP2878 - - - 448.000 - - TP2879 - - - 448.000 - - TP2880 - - - 448.000 - - TP2881 - - - 448.000 - - TP2882 - - - 448.000 - - TP2883 - - - 448.000 - - TP2884 - - - 448.000 - - TP2885 - - - 448.000 - - TP2886 - - - 448.000 - - TP2887 - - - 448.000 - - TP2888 - - - 448.000 - - TP2889 - - - 448.000 - - TP2890 - - - 448.000 - - TP2891 - - - 448.000 - - TP2892 - - - 448.000 - - TP2893 - - - 448.000 - - TP2894 - - - 448.000 - - TP2895 - - - 448.000 - - TP2896 - - - 448.000 - - TP2897 - - - 448.000 - - TP2898 - - - 448.000 - - TP2899 - - - 448.000 - - TP2900 - - - 448.000 - - TP2901 - - - 448.000 - - TP2902 - - - 448.000 - - TP2903 - - - 448.000 - - TP2904 - - - 448.000 - - TP2905 - - - 448.000 - - TP2906 - - - 448.000 - - TP2907 - - - 448.000 - - TP2908 - - - 448.000 - - TP2909 - - - 448.000 - - TP2910 - - - 448.000 - - TP2911 - - - 448.000 - - TP2912 - - - 448.000 - - TP2913 - - - 448.000 - - TP2914 - - - 448.000 - - TP2915 - - - 448.000 - - TP2916 - - - 448.000 - - TP2917 - - - 448.000 - - TP2918 - - - 448.000 - - TP2919 - - - 448.000 - - TP2920 - - - 448.000 - - TP2921 - - - 448.000 - - TP2922 - - - 448.000 - - TP2923 - - - 448.000 - - TP2924 - - - 448.000 - - TP2925 - - - 448.000 - - TP2926 - - - 448.000 - - TP2927 - - - 448.000 - - TP2928 - - - 448.000 - - TP2929 - - - 448.000 - - TP2930 - - - 448.000 - - TP2931 - - - 448.000 - - TP2932 - - - 448.000 - - TP2933 - - - 448.000 - - TP2934 - - - 448.000 - - TP2935 - - - 448.000 - - TP2936 - - - 448.000 - - TP2937 - - - 448.000 - - TP2938 - - - 448.000 - - TP2939 - - - 448.000 - - TP2940 - - - 448.000 - - TP2941 - - - 448.000 - - TP2942 - - - 448.000 - - TP2943 - - - 448.000 - - TP2944 - - - 448.000 - - TP2945 - - - 448.000 - - TP2946 - - - 448.000 - - TP2947 - - - 448.000 - - TP2948 - - - 448.000 - - TP2949 - - - 448.000 - - TP2950 - - - 448.000 - - TP2951 - - - 448.000 - - TP2952 - - - 448.000 - - TP2953 - - - 448.000 - - TP2954 - - - 448.000 - - TP2955 - - - 448.000 - - TP2956 - - - 448.000 - - TP2957 - - - 448.000 - - TP2958 - - - 448.000 - - TP2959 - - - 448.000 - - TP2960 - - - 448.000 - - TP2961 - - - 448.000 - - TP2962 - - - 448.000 - - TP2963 - - - 448.000 - - TP2964 - - - 448.000 - - TP2965 - - - 448.000 - - TP2966 - - - 448.000 - - TP2967 - - - 448.000 - - TP2968 - - - 448.000 - - TP2969 - - - 448.000 - - TP2970 - - - 448.000 - - TP2971 - - - 448.000 - - TP2972 - - - 448.000 - - TP2973 - - - 448.000 - - TP2974 - - - 448.000 - - TP2975 - - - 448.000 - - TP2976 - - - 448.000 - - TP2977 - - - 448.000 - - TP2978 - - - 448.000 - - TP2979 - - - 448.000 - - TP2980 - - - 448.000 - - TP2981 - - - 448.000 - - TP2982 - - - 448.000 - - TP2983 - - - 448.000 - - TP2984 - - - 448.000 - - TP2985 - - - 448.000 - - TP2986 - - - 448.000 - - TP2987 - - - 448.000 - - TP2988 - - - 448.000 - - TP2989 - - - 448.000 - - TP2990 - - - 448.000 - - TP2991 - - - 448.000 - - TP2992 - - - 448.000 - - TP2993 - - - 448.000 - - TP2994 - - - 448.000 - - TP2995 - - - 448.000 - - TP2996 - - - 449.000 - - TP2997 - - - 449.000 - - TP2998 - - - 449.000 - - TP2999 - - - 449.000 - - TP3000 - - - 449.000 - - TP3001 - - - 449.000 - - TP3002 - - - 449.000 - - TP3003 - - - 449.000 - - TP3004 - - - 449.000 - - TP3005 - - - 449.000 - - TP3006 - - - 449.000 - - TP3007 - - - 449.000 - - TP3008 - - - 449.000 - - TP3009 - - - 449.000 - - TP3010 - - - 449.000 - - TP3011 - - - 449.000 - - TP3012 - - - 449.000 - - TP3013 - - - 449.000 - - TP3014 - - - 449.000 - - TP3015 - - - 449.000 - - TP3016 - - - 449.000 - - TP3017 - - - 449.000 - - TP3018 - - - 449.000 - - TP3019 - - - 449.000 - - TP3020 - - - 449.000 - - TP3021 - - - 449.000 - - TP3022 - - - 449.000 - - TP3023 - - - 449.000 - - TP3024 - - - 449.000 - - TP3025 - - - 449.000 - - TP3026 - - - 449.000 - - TP3027 - - - 449.000 - - TP3028 - - - 449.000 - - TP3029 - - - 449.000 - - TP3030 - - - 449.000 - - TP3031 - - - 449.000 - - TP3032 - - - 449.000 - - TP3033 - - - 449.000 - - TP3034 - - - 449.000 - - TP3035 - - - 449.000 - - TP3036 - - - 449.000 - - TP3037 - - - 449.000 - - TP3038 - - - 449.000 - - TP3039 - - - 449.000 - - TP3040 - - - 449.000 - - TP3041 - - - 449.000 - - TP3042 - - - 449.000 - - TP3043 - - - 449.000 - - TP3044 - - - 449.000 - - TP3045 - - - 449.000 - - TP3046 - - - 449.000 - - TP3047 - - - 449.000 - - TP3048 - - - 449.000 - - TP3049 - - - 449.000 - - TP3050 - - - 449.000 - - TP3051 - - - 449.000 - - TP3052 - - - 449.000 - - TP3053 - - - 449.000 - - TP3054 - - - 449.000 - - TP3055 - - - 449.000 - - TP3056 - - - 449.000 - - TP3057 - - - 449.000 - - TP3058 - - - 449.000 - - TP3059 - - - 449.000 - - TP3060 - - - 449.000 - - TP3061 - - - 449.000 - - TP3062 - - - 449.000 - - TP3063 - - - 449.000 - - TP3064 - - - 449.000 - - TP3065 - - - 449.000 - - TP3066 - - - 449.000 - - TP3067 - - - 449.000 - - TP3068 - - - 449.000 - - TP3069 - - - 449.000 - - TP3070 - - - 449.000 - - TP3071 - - - 449.000 - - TP3072 - - - 449.000 - - TP3073 - - - 449.000 - - TP3074 - - - 449.000 - - TP3075 - - - 449.000 - - TP3076 - - - 449.000 - - TP3077 - - - 449.000 - - TP3078 - - - 449.000 - - TP3079 - - - 449.000 - - TP3080 - - - 449.000 - - TP3081 - - - 449.000 - - TP3082 - - - 449.000 - - TP3083 - - - 449.000 - - TP3084 - - - 449.000 - - TP3085 - - - 449.000 - - TP3086 - - - 449.000 - - TP3087 - - - 449.000 - - TP3088 - - - 449.000 - - TP3089 - - - 449.000 - - TP3090 - - - 449.000 - - TP3091 - - - 449.000 - - TP3092 - - - 449.000 - - TP3093 - - - 449.000 - - TP3094 - - - 449.000 - - TP3095 - - - 449.000 - - TP3096 - - - 449.000 - - TP3097 - - - 449.000 - - TP3098 - - - 449.000 - - TP3099 - - - 449.000 - - TP3100 - - - 449.000 - - TP3101 - - - 449.000 - - TP3102 - - - 449.000 - - TP3103 - - - 449.000 - - TP3104 - - - 449.000 - - TP3105 - - - 449.000 - - TP3106 - - - 449.000 - - TP3107 - - - 449.000 - - TP3108 - - - 449.000 - - TP3109 - - - 449.000 - - TP3110 - - - 449.000 - - TP3111 - - - 449.000 - - TP3112 - - - 449.000 - - TP3113 - - - 449.000 - - TP3114 - - - 449.000 - - TP3115 - - - 449.000 - - TP3116 - - - 449.000 - - TP3117 - - - 449.000 - - TP3118 - - - 449.000 - - TP3119 - - - 449.000 - - TP3120 - - - 449.000 - - TP3121 - - - 449.000 - - TP3122 - - - 449.000 - - TP3123 - - - 449.000 - - TP3124 - - - 449.000 - - TP3125 - - - 449.000 - - TP3126 - - - 449.000 - - TP3127 - - - 449.000 - - TP3128 - - - 449.000 - - TP3129 - - - 449.000 - - TP3130 - - - 449.000 - - TP3131 - - - 449.000 - - TP3132 - - - 449.000 - - TP3133 - - - 449.000 - - TP3134 - - - 449.000 - - TP3135 - - - 449.000 - - TP3136 - - - 449.000 - - TP3137 - - - 449.000 - - TP3138 - - - 449.000 - - TP3139 - - - 449.000 - - TP3140 - - - 449.000 - - TP3141 - - - 449.000 - - TP3142 - - - 449.000 - - TP3143 - - - 449.000 - - TP3144 - - - 449.000 - - TP3145 - - - 449.000 - - TP3146 - - - 449.000 - - TP3147 - - - 449.000 - - TP3148 - - - 449.000 - - TP3149 - - - 449.000 - - TP3150 - - - 449.000 - - TP3151 - - - 449.000 - - TP3152 - - - 449.000 - - TP3153 - - - 449.000 - - TP3154 - - - 449.000 - - TP3155 - - - 449.000 - - TP3156 - - - 449.000 - - TP3157 - - - 449.000 - - TP3158 - - - 449.000 - - TP3159 - - - 449.000 - - TP3160 - - - 449.000 - - TP3161 - - - 449.000 - - TP3162 - - - 449.000 - - TP3163 - - - 449.000 - - TP3164 - - - 449.000 - - TP3165 - - - 449.000 - - TP3166 - - - 449.000 - - TP3167 - - - 449.000 - - TP3168 - - - 449.000 - - TP3169 - - - 449.000 - - TP3170 - - - 449.000 - - TP3171 - - - 449.000 - - TP3172 - - - 449.000 - - TP3173 - - - 449.000 - - TP3174 - - - 449.000 - - TP3175 - - - 449.000 - - TP3176 - - - 449.000 - - TP3177 - - - 449.000 - - TP3178 - - - 449.000 - - TP3179 - - - 449.000 - - TP3180 - - - 449.000 - - TP3181 - - - 449.000 - - TP3182 - - - 449.000 - - TP3183 - - - 449.000 - - TP3184 - - - 449.000 - - TP3185 - - - 449.000 - - TP3186 - - - 449.000 - - TP3187 - - - 449.000 - - TP3188 - - - 449.000 - - TP3189 - - - 449.000 - - TP3190 - - - 449.000 - - TP3191 - - - 449.000 - - TP3192 - - - 449.000 - - TP3193 - - - 449.000 - - TP3194 - - - 449.000 - - TP3195 - - - 449.000 - - TP3196 - - - 449.000 - - TP3197 - - - 449.000 - - TP3198 - - - 449.000 - - TP3199 - - - 449.000 - - TP3200 - - - 449.000 - - TP3201 - - - 449.000 - - TP3202 - - - 449.000 - - TP3203 - - - 449.000 - - TP3204 - - - 449.000 - - TP3205 - - - 449.000 - - TP3206 - - - 449.000 - - TP3207 - - - 449.000 - - TP3208 - - - 449.000 - - TP3209 - - - 449.000 - - TP3210 - - - 449.000 - - TP3211 - - - 449.000 - - TP3212 - - - 449.000 - - TP3213 - - - 449.000 - - TP3214 - - - 449.000 - - TP3215 - - - 449.000 - - TP3216 - - - 449.000 - - TP3217 - - - 449.000 - - TP3218 - - - 449.000 - - TP3219 - - - 449.000 - - TP3220 - - - 449.000 - - TP3221 - - - 449.000 - - TP3222 - - - 449.000 - - TP3223 - - - 449.000 - - TP3224 - - - 449.000 - - TP3225 - - - 449.000 - - TP3226 - - - 449.000 - - TP3227 - - - 449.000 - - TP3228 - - - 449.000 - - TP3229 - - - 449.000 - - TP3230 - - - 449.000 - - TP3231 - - - 449.000 - - TP3232 - - - 449.000 - - TP3233 - - - 449.000 - - TP3234 - - - 449.000 - - TP3235 - - - 449.000 - - TP3236 - - - 449.000 - - TP3237 - - - 449.000 - - TP3238 - - - 449.000 - - TP3239 - - - 449.000 - - TP3240 - - - 449.000 - - TP3241 - - - 449.000 - - TP3242 - - - 449.000 - - TP3243 - - - 449.000 - - TP3244 - - - 449.000 - - TP3245 - - - 449.000 - - TP3246 - - - 449.000 - - TP3247 - - - 449.000 - - TP3248 - - - 449.000 - - TP3249 - - - 449.000 - - TP3250 - - - 449.000 - - TP3251 - - - 449.000 - - TP3252 - - - 449.000 - - TP3253 - - - 449.000 - - TP3254 - - - 449.000 - - TP3255 - - - 449.000 - - TP3256 - - - 449.000 - - TP3257 - - - 449.000 - - TP3258 - - - 449.000 - - TP3259 - - - 449.000 - - TP3260 - - - 449.000 - - TP3261 - - - 449.000 - - TP3262 - - - 449.000 - - TP3263 - - - 449.000 - - TP3264 - - - 449.000 - - TP3265 - - - 449.000 - - TP3266 - - - 449.000 - - TP3267 - - - 449.000 - - TP3268 - - - 449.000 - - TP3269 - - - 449.000 - - TP3270 - - - 449.000 - - TP3271 - - - 449.000 - - TP3272 - - - 449.000 - - TP3273 - - - 449.000 - - TP3274 - - - 449.000 - - TP3275 - - - 449.000 - - TP3276 - - - 449.000 - - TP3277 - - - 449.000 - - TP3278 - - - 449.000 - - TP3279 - - - 449.000 - - TP3280 - - - 449.000 - - TP3281 - - - 449.000 - - TP3282 - - - 449.000 - - TP3283 - - - 449.000 - - TP3284 - - - 449.000 - - TP3285 - - - 449.000 - - TP3286 - - - 449.000 - - TP3287 - - - 449.000 - - TP3288 - - - 449.000 - - TP3289 - - - 449.000 - - TP3290 - - - 449.000 - - TP3291 - - - 449.000 - - TP3292 - - - 449.000 - - TP3293 - - - 449.000 - - TP3294 - - - 449.000 - - TP3295 - - - 449.000 - - TP3296 - - - 449.000 - - TP3297 - - - 449.000 - - TP3298 - - - 449.000 - - TP3299 - - - 449.000 - - TP3300 - - - 449.000 - - TP3301 - - - 449.000 - - TP3302 - - - 449.000 - - TP3303 - - - 449.000 - - TP3304 - - - 449.000 - - TP3305 - - - 449.000 - - TP3306 - - - 449.000 - - TP3307 - - - 449.000 - - TP3308 - - - 449.000 - - TP3309 - - - 449.000 - - TP3310 - - - 449.000 - - TP3311 - - - 449.000 - - TP3312 - - - 449.000 - - TP3313 - - - 449.000 - - TP3314 - - - 449.000 - - TP3315 - - - 450.000 - - TP3316 - - - 450.000 - - TP3317 - - - 450.000 - - TP3318 - - - 450.000 - - TP3319 - - - 450.000 - - TP3320 - - - 450.000 - - TP3321 - - - 450.000 - - TP3322 - - - 450.000 - - TP3323 - - - 450.000 - - TP3324 - - - 450.000 - - TP3325 - - - 450.000 - - TP3326 - - - 450.000 - - TP3327 - - - 450.000 - - TP3328 - - - 450.000 - - TP3329 - - - 450.000 - - TP3330 - - - 450.000 - - TP3331 - - - 450.000 - - TP3332 - - - 450.000 - - TP3333 - - - 450.000 - - TP3334 - - - 450.000 - - TP3335 - - - 450.000 - - TP3336 - - - 450.000 - - TP3337 - - - 450.000 - - TP3338 - - - 450.000 - - TP3339 - - - 450.000 - - TP3340 - - - 450.000 - - TP3341 - - - 450.000 - - TP3342 - - - 450.000 - - TP3343 - - - 450.000 - - TP3344 - - - 450.000 - - TP3345 - - - 450.000 - - TP3346 - - - 450.000 - - TP3347 - - - 450.000 - - TP3348 - - - 450.000 - - TP3349 - - - 450.000 - - TP3350 - - - 450.000 - - TP3351 - - - 450.000 - - TP3352 - - - 450.000 - - TP3353 - - - 450.000 - - TP3354 - - - 450.000 - - TP3355 - - - 450.000 - - TP3356 - - - 450.000 - - TP3357 - - - 450.000 - - TP3358 - - - 443.000 - - TP3359 - - - 443.000 - - TP3360 - - - 443.000 - - TP3361 - - - 443.000 - - TP3362 - - - 443.000 - - TP3363 - - - 443.000 - - TP3364 - - - 443.000 - - TP3365 - - - 443.000 - - TP3366 - - - 443.000 - - TP3367 - - - 443.000 - - TP3368 - - - 443.000 - - TP3369 - - - 443.000 - - TP3370 - - - 456.000 - - TP3371 - - - 456.000 - - TP3372 - - - 456.000 - - TP3373 - - - 456.000 - - TP3374 - - - 456.000 - - TP3375 - - - 456.000 - - TP3376 - - - 456.000 - - TP3377 - - - 456.000 - - TP3378 - - - 456.000 - - TP3379 - - - 456.000 - - TP3380 - - - 456.000 - - TP3381 - - - 456.000 - - TP3382 - - - 456.000 - - TP3383 - - - 456.000 - - TP3384 - - - 456.000 - - TP3385 - - - 456.000 - - TP3386 - - - 456.000 - - TP3387 - - - 456.000 - - TP3388 - - - 456.000 - - TP3389 - - - 456.000 - - TP3390 - - - 456.000 - - TP3391 - - - 456.000 - - TP3392 - - - 456.000 - - TP3393 - - - 456.000 - - TP3394 - - - 456.000 - - TP3395 - - - 456.000 - - TP3396 - - - 456.000 - - TP3397 - - - 456.000 - - TP3398 - - - 456.000 - - TP3399 - - - 456.000 - - TP3400 - - - 456.000 - - TP3401 - - - 456.000 - - TP3402 - - - 455.000 - - TP3403 - - - 455.000 - - TP3404 - - - 455.000 - - TP3405 - - - 455.000 - - TP3406 - - - 455.000 - - TP3407 - - - 455.000 - - TP3408 - - - 455.000 - - TP3409 - - - 455.000 - - TP3410 - - - 455.000 - - TP3411 - - - 455.000 - - TP3412 - - - 455.000 - - TP3413 - - - 455.000 - - TP3414 - - - 455.000 - - TP3415 - - - 455.000 - - TP3416 - - - 455.000 - - TP3417 - - - 455.000 - - TP3418 - - - 455.000 - - TP3419 - - - 455.000 - - TP3420 - - - 455.000 - - TP3421 - - - 455.000 - - TP3422 - - - 455.000 - - TP3423 - - - 455.000 - - TP3424 - - - 455.000 - - TP3425 - - - 455.000 - - TP3426 - - - 455.000 - - TP3427 - - - 455.000 - - TP3428 - - - 455.000 - - TP3429 - - - 455.000 - - TP3430 - - - 455.000 - - TP3431 - - - 455.000 - - TP3432 - - - 455.000 - - TP3433 - - - 456.000 - - TP3434 - - - 456.000 - - TP3435 - - - 456.000 - - TP3436 - - - 456.000 - - TP3437 - - - 456.000 - - TP3438 - - - 456.000 - - TP3439 - - - 456.000 - - TP3440 - - - 456.000 - - TP3441 - - - 456.000 - - TP3442 - - - 456.000 - - TP3443 - - - 456.000 - - TP3444 - - - 456.000 - - TP3445 - - - 456.000 - - TP3446 - - - 456.000 - - TP3447 - - - 456.000 - - TP3448 - - - 456.000 - - TP3449 - - - 456.000 - - TP3450 - - - 456.000 - - TP3451 - - - 456.000 - - TP3452 - - - 456.000 - - TP3453 - - - 456.000 - - TP3454 - - - 456.000 - - TP3455 - - - 456.000 - - TP3456 - - - 456.000 - - TP3457 - - - 456.000 - - TP3458 - - - 456.000 - - TP3459 - - - 456.000 - - TP3460 - - - 456.000 - - TP3461 - - - 456.000 - - TP3462 - - - 456.000 - - TP3463 - - - 456.000 - - TP3464 - - - 456.000 - - TP3465 - - - 456.000 - - TP3466 - - - 456.000 - - TP3467 - - - 456.000 - - TP3468 - - - 456.000 - - TP3469 - - - 456.000 - - TP3470 - - - 456.000 - - TP3471 - - - 456.000 - - TP3472 - - - 456.000 - - TP3473 - - - 456.000 - - TP3474 - - - 456.000 - - TP3475 - - - 456.000 - - TP3476 - - - 456.000 - - TP3477 - - - 456.000 - - TP3478 - - - 456.000 - - TP3479 - - - 456.000 - - TP3480 - - - 456.000 - - TP3481 - - - 456.000 - - TP3482 - - - 456.000 - - TP3483 - - - 456.000 - - TP3484 - - - 456.000 - - TP3485 - - - 456.000 - - TP3486 - - - 456.000 - - TP3487 - - - 456.000 - - TP3488 - - - 456.000 - - TP3489 - - - 456.000 - - TP3490 - - - 456.000 - - TP3491 - - - 456.000 - - TP3492 - - - 456.000 - - TP3493 - - - 456.000 - - TP3494 - - - 456.000 - - TP3495 - - - 456.000 - - TP3496 - - - 456.000 - - TP3497 - - - 456.000 - - TP3498 - - - 456.000 - - TP3499 - - - 456.000 - - TP3500 - - - 456.000 - - TP3501 - - - 456.000 - - TP3502 - - - 456.000 - - TP3503 - - - 456.000 - - TP3504 - - - 456.000 - - TP3505 - - - 456.000 - - TP3506 - - - 456.000 - - TP3507 - - - 456.000 - - TP3508 - - - 456.000 - - TP3509 - - - 456.000 - - TP3510 - - - 456.000 - - TP3511 - - - 456.000 - - TP3512 - - - 456.000 - - TP3513 - - - 456.000 - - TP3514 - - - 456.000 - - TP3515 - - - 456.000 - - TP3516 - - - 456.000 - - TP3517 - - - 456.000 - - TP3518 - - - 456.000 - - TP3519 - - - 456.000 - - TP3520 - - - 456.000 - - TP3521 - - - 456.000 - - TP3522 - - - 456.000 - - TP3523 - - - 456.000 - - TP3524 - - - 456.000 - - TP3525 - - - 456.000 - - TP3526 - - - 456.000 - - TP3527 - - - 456.000 - - TP3528 - - - 456.000 - - TP3529 - - - 456.000 - - TP3530 - - - 456.000 - - TP3531 - - - 456.000 - - TP3532 - - - 456.000 - - TP3533 - - - 456.000 - - TP3534 - - - 456.000 - - TP3535 - - - 456.000 - - TP3536 - - - 456.000 - - TP3537 - - - 456.000 - - TP3538 - - - 456.000 - - TP3539 - - - 456.000 - - TP3540 - - - 456.000 - - TP3541 - - - 456.000 - - TP3542 - - - 456.000 - - TP3543 - - - 456.000 - - TP3544 - - - 456.000 - - TP3545 - - - 456.000 - - TP3546 - - - 456.000 - - TP3547 - - - 456.000 - - TP3548 - - - 456.000 - - TP3549 - - - 456.000 - - TP3550 - - - 456.000 - - TP3551 - - - 456.000 - - TP3552 - - - 456.000 - - TP3553 - - - 456.000 - - TP3554 - - - 456.000 - - TP3555 - - - 456.000 - - TP3556 - - - 456.000 - - TP3557 - - - 456.000 - - TP3558 - - - 456.000 - - TP3559 - - - 456.000 - - TP3560 - - - 456.000 - - TP3561 - - - 456.000 - - TP3562 - - - 456.000 - - TP3563 - - - 456.000 - - TP3564 - - - 456.000 - - TP3565 - - - 456.000 - - TP3566 - - - 456.000 - - TP3567 - - - 456.000 - - TP3568 - - - 456.000 - - TP3569 - - - 456.000 - - TP3570 - - - 456.000 - - TP3571 - - - 456.000 - - TP3572 - - - 456.000 - - TP3573 - - - 456.000 - - TP3574 - - - 456.000 - - TP3575 - - - 456.000 - - TP3576 - - - 456.000 - - TP3577 - - - 456.000 - - TP3578 - - - 456.000 - - TP3579 - - - 456.000 - - TP3580 - - - 456.000 - - TP3581 - - - 456.000 - - TP3582 - - - 456.000 - - TP3583 - - - 456.000 - - TP3584 - - - 456.000 - - TP3585 - - - 456.000 - - TP3586 - - - 456.000 - - TP3587 - - - 456.000 - - TP3588 - - - 456.000 - - TP3589 - - - 456.000 - - TP3590 - - - 456.000 - - TP3591 - - - 456.000 - - TP3592 - - - 456.000 - - TP3593 - - - 456.000 - - TP3594 - - - 456.000 - - TP3595 - - - 456.000 - - TP3596 - - - 456.000 - - TP3597 - - - 456.000 - - TP3598 - - - 456.000 - - TP3599 - - - 456.000 - - TP3600 - - - 456.000 - - TP3601 - - - 456.000 - - TP3602 - - - 456.000 - - TP3603 - - - 456.000 - - TP3604 - - - 456.000 - - TP3605 - - - 456.000 - - TP3606 - - - 456.000 - - TP3607 - - - 456.000 - - TP3608 - - - 456.000 - - TP3609 - - - 456.000 - - TP3610 - - - 456.000 - - TP3611 - - - 456.000 - - TP3612 - - - 456.000 - - TP3613 - - - 456.000 - - TP3614 - - - 456.000 - - TP3615 - - - 456.000 - - TP3616 - - - 456.000 - - TP3617 - - - 456.000 - - TP3618 - - - 456.000 - - TP3619 - - - 456.000 - - TP3620 - - - 456.000 - - TP3621 - - - 456.000 - - TP3622 - - - 456.000 - - TP3623 - - - 456.000 - - TP3624 - - - 456.000 - - TP3625 - - - 456.000 - - TP3626 - - - 456.000 - - TP3627 - - - 456.000 - - TP3628 - - - 456.000 - - TP3629 - - - 456.000 - - TP3630 - - - 456.000 - - TP3631 - - - 456.000 - - TP3632 - - - 456.000 - - TP3633 - - - 456.000 - - TP3634 - - - 456.000 - - TP3635 - - - 456.000 - - TP3636 - - - 456.000 - - TP3637 - - - 456.000 - - TP3638 - - - 456.000 - - TP3639 - - - 456.000 - - TP3640 - - - 456.000 - - TP3641 - - - 456.000 - - TP3642 - - - 456.000 - - TP3643 - - - 456.000 - - TP3644 - - - 456.000 - - TP3645 - - - 456.000 - - TP3646 - - - 456.000 - - TP3647 - - - 456.000 - - TP3648 - - - 456.000 - - TP3649 - - - 456.000 - - TP3650 - - - 456.000 - - TP3651 - - - 456.000 - - TP3652 - - - 456.000 - - TP3653 - - - 456.000 - - TP3654 - - - 456.000 - - TP3655 - - - 456.000 - - TP3656 - - - 456.000 - - TP3657 - - - 456.000 - - TP3658 - - - 456.000 - - TP3659 - - - 456.000 - - TP3660 - - - 456.000 - - TP3661 - - - 456.000 - - TP3662 - - - 456.000 - - TP3663 - - - 456.000 - - TP3664 - - - 456.000 - - TP3665 - - - 456.000 - - TP3666 - - - 456.000 - - TP3667 - - - 456.000 - - TP3668 - - - 456.000 - - TP3669 - - - 456.000 - - TP3670 - - - 456.000 - - TP3671 - - - 456.000 - - TP3672 - - - 456.000 - - TP3673 - - - 456.000 - - TP3674 - - - 456.000 - - TP3675 - - - 456.000 - - TP3676 - - - 456.000 - - TP3677 - - - 456.000 - - TP3678 - - - 456.000 - - TP3679 - - - 456.000 - - TP3680 - - - 456.000 - - TP3681 - - - 456.000 - - TP3682 - - - 456.000 - - TP3683 - - - 456.000 - - TP3684 - - - 456.000 - - TP3685 - - - 456.000 - - TP3686 - - - 456.000 - - TP3687 - - - 456.000 - - TP3688 - - - 456.000 - - TP3689 - - - 456.000 - - TP3690 - - - 456.000 - - TP3691 - - - 456.000 - - TP3692 - - - 456.000 - - TP3693 - - - 456.000 - - TP3694 - - - 456.000 - - TP3695 - - - 456.000 - - TP3696 - - - 456.000 - - TP3697 - - - 456.000 - - TP3698 - - - 456.000 - - TP3699 - - - 456.000 - - TP3700 - - - 456.000 - - TP3701 - - - 456.000 - - TP3702 - - - 456.000 - - TP3703 - - - 456.000 - - TP3704 - - - 456.000 - - TP3705 - - - 456.000 - - TP3706 - - - 456.000 - - TP3707 - - - 456.000 - - TP3708 - - - 456.000 - - TP3709 - - - 456.000 - - TP3710 - - - 456.000 - - TP3711 - - - 456.000 - - TP3712 - - - 456.000 - - TP3713 - - - 456.000 - - TP3714 - - - 456.000 - - TP3715 - - - 456.000 - - TP3716 - - - 456.000 - - TP3717 - - - 456.000 - - TP3718 - - - 456.000 - - TP3719 - - - 456.000 - - TP3720 - - - 456.000 - - TP3721 - - - 456.000 - - TP3722 - - - 456.000 - - TP3723 - - - 456.000 - - TP3724 - - - 456.000 - - TP3725 - - - 456.000 - - TP3726 - - - 456.000 - - TP3727 - - - 456.000 - - TP3728 - - - 456.000 - - TP3729 - - - 456.000 - - TP3730 - - - 456.000 - - TP3731 - - - 456.000 - - TP3732 - - - 456.000 - - TP3733 - - - 456.000 - - TP3734 - - - 456.000 - - TP3735 - - - 456.000 - - TP3736 - - - 456.000 - - TP3737 - - - 456.000 - - TP3738 - - - 456.000 - - TP3739 - - - 456.000 - - TP3740 - - - 456.000 - - TP3741 - - - 456.000 - - TP3742 - - - 456.000 - - TP3743 - - - 456.000 - - TP3744 - - - 456.000 - - TP3745 - - - 456.000 - - TP3746 - - - 456.000 - - TP3747 - - - 456.000 - - TP3748 - - - 456.000 - - TP3749 - - - 456.000 - - TP3750 - - - 456.000 - - TP3751 - - - 456.000 - - TP3752 - - - 456.000 - - TP3753 - - - 456.000 - - TP3754 - - - 456.000 - - TP3755 - - - 456.000 - - TP3756 - - - 456.000 - - TP3757 - - - 456.000 - - TP3758 - - - 456.000 - - TP3759 - - - 456.000 - - TP3760 - - - 456.000 - - TP3761 - - - 456.000 - - TP3762 - - - 456.000 - - TP3763 - - - 456.000 - - TP3764 - - - 456.000 - - TP3765 - - - 456.000 - - TP3766 - - - 456.000 - - TP3767 - - - 456.000 - - TP3768 - - - 456.000 - - TP3769 - - - 456.000 - - TP3770 - - - 456.000 - - TP3771 - - - 456.000 - - TP3772 - - - 456.000 - - TP3773 - - - 456.000 - - TP3774 - - - 456.000 - - TP3775 - - - 456.000 - - TP3776 - - - 456.000 - - TP3777 - - - 456.000 - - TP3778 - - - 456.000 - - TP3779 - - - 456.000 - - TP3780 - - - 456.000 - - TP3781 - - - 456.000 - - TP3782 - - - 456.000 - - TP3783 - - - 456.000 - - TP3784 - - - 456.000 - - TP3785 - - - 456.000 - - TP3786 - - - 456.000 - - TP3787 - - - 456.000 - - TP3788 - - - 456.000 - - TP3789 - - - 456.000 - - TP3790 - - - 456.000 - - TP3791 - - - 456.000 - - TP3792 - - - 456.000 - - TP3793 - - - 456.000 - - TP3794 - - - 456.000 - - TP3795 - - - 456.000 - - TP3796 - - - 456.000 - - TP3797 - - - 456.000 - - TP3798 - - - 456.000 - - TP3799 - - - 456.000 - - TP3800 - - - 456.000 - - TP3801 - - - 456.000 - - TP3802 - - - 456.000 - - TP3803 - - - 456.000 - - TP3804 - - - 456.000 - - TP3805 - - - 456.000 - - TP3806 - - - 456.000 - - TP3807 - - - 456.000 - - TP3808 - - - 456.000 - - TP3809 - - - 456.000 - - TP3810 - - - 456.000 - - TP3811 - - - 456.000 - - TP3812 - - - 456.000 - - TP3813 - - - 456.000 - - TP3814 - - - 456.000 - - TP3815 - - - 456.000 - - TP3816 - - - 456.000 - - TP3817 - - - 456.000 - - TP3818 - - - 456.000 - - TP3819 - - - 456.000 - - TP3820 - - - 456.000 - - TP3821 - - - 456.000 - - TP3822 - - - 456.000 - - TP3823 - - - 456.000 - - TP3824 - - - 456.000 - - TP3825 - - - 456.000 - - TP3826 - - - 456.000 - - TP3827 - - - 456.000 - - TP3828 - - - 456.000 - - TP3829 - - - 456.000 - - TP3830 - - - 456.000 - - TP3831 - - - 456.000 - - TP3832 - - - 456.000 - - TP3833 - - - 456.000 - - TP3834 - - - 456.000 - - TP3835 - - - 456.000 - - TP3836 - - - 456.000 - - TP3837 - - - 456.000 - - TP3838 - - - 456.000 - - TP3839 - - - 456.000 - - TP3840 - - - 456.000 - - TP3841 - - - 456.000 - - TP3842 - - - 456.000 - - TP3843 - - - 456.000 - - TP3844 - - - 456.000 - - TP3845 - - - 456.000 - - TP3846 - - - 456.000 - - TP3847 - - - 456.000 - - TP3848 - - - 456.000 - - TP3849 - - - 456.000 - - TP3850 - - - 456.000 - - TP3851 - - - 456.000 - - TP3852 - - - 456.000 - - TP3853 - - - 456.000 - - TP3854 - - - 456.000 - - TP3855 - - - 456.000 - - TP3856 - - - 456.000 - - TP3857 - - - 456.000 - - TP3858 - - - 456.000 - - TP3859 - - - 456.000 - - TP3860 - - - 456.000 - - TP3861 - - - 456.000 - - TP3862 - - - 456.000 - - TP3863 - - - 456.000 - - TP3864 - - - 456.000 - - TP3865 - - - 456.000 - - TP3866 - - - 456.000 - - TP3867 - - - 456.000 - - TP3868 - - - 456.000 - - TP3869 - - - 456.000 - - TP3870 - - - 456.000 - - TP3871 - - - 456.000 - - TP3872 - - - 456.000 - - TP3873 - - - 456.000 - - TP3874 - - - 456.000 - - TP3875 - - - 456.000 - - TP3876 - - - 456.000 - - TP3877 - - - 456.000 - - TP3878 - - - 456.000 - - TP3879 - - - 456.000 - - TP3880 - - - 456.000 - - TP3881 - - - 456.000 - - TP3882 - - - 456.000 - - TP3883 - - - 456.000 - - TP3884 - - - 456.000 - - TP3885 - - - 456.000 - - TP3886 - - - 456.000 - - TP3887 - - - 456.000 - - TP3888 - - - 456.000 - - TP3889 - - - 456.000 - - TP3890 - - - 456.000 - - TP3891 - - - 456.000 - - TP3892 - - - 456.000 - - TP3893 - - - 456.000 - - TP3894 - - - 456.000 - - TP3895 - - - 456.000 - - TP3896 - - - 456.000 - - TP3897 - - - 456.000 - - TP3898 - - - 456.000 - - TP3899 - - - 456.000 - - TP3900 - - - 456.000 - - TP3901 - - - 456.000 - - TP3902 - - - 456.000 - - TP3903 - - - 456.000 - - TP3904 - - - 456.000 - - TP3905 - - - 456.000 - - TP3906 - - - 456.000 - - TP3907 - - - 456.000 - - TP3908 - - - 456.000 - - TP3909 - - - 456.000 - - TP3910 - - - 456.000 - - TP3911 - - - 456.000 - - TP3912 - - - 456.000 - - TP3913 - - - 456.000 - - TP3914 - - - 456.000 - - TP3915 - - - 456.000 - - TP3916 - - - 456.000 - - TP3917 - - - 456.000 - - TP3918 - - - 456.000 - - TP3919 - - - 456.000 - - TP3920 - - - 456.000 - - TP3921 - - - 456.000 - - TP3922 - - - 456.000 - - TP3923 - - - 456.000 - - TP3924 - - - 456.000 - - TP3925 - - - 456.000 - - TP3926 - - - 456.000 - - TP3927 - - - 456.000 - - TP3928 - - - 456.000 - - TP3929 - - - 456.000 - - TP3930 - - - 456.000 - - TP3931 - - - 456.000 - - TP3932 - - - 456.000 - - TP3933 - - - 456.000 - - TP3934 - - - 456.000 - - TP3935 - - - 456.000 - - TP3936 - - - 456.000 - - TP3937 - - - 456.000 - - TP3938 - - - 457.000 - - TP3939 - - - 457.000 - - TP3940 - - - 456.000 - - TP3941 - - - 456.000 - - TP3942 - - - 457.000 - - TP3943 - - - 457.000 - - TP3944 - - - 457.000 - - TP3945 - - - 457.000 - - TP3946 - - - 457.000 - - TP3947 - - - 457.000 - - TP3948 - - - 457.000 - - TP3949 - - - 457.000 - - TP3950 - - - 457.000 - - TP3951 - - - 457.000 - - TP3952 - - - 457.000 - - TP3953 - - - 457.000 - - TP3954 - - - 457.000 - - TP3955 - - - 456.000 - - TP3956 - - - 457.000 - - TP3957 - - - 458.000 - - TP3958 - - - 458.000 - - TP3959 - - - 458.000 - - TP3960 - - - 457.000 - - TP3961 - - - 456.000 - - TP3962 - - - 456.000 - - TP3963 - - - 456.000 - - TP3964 - - - 456.000 - - TP3965 - - - 456.000 - - TP3966 - - - 456.000 - - TP3967 - - - 456.000 - - TP3968 - - - 456.000 - - TP3969 - - - 456.000 - - TP3970 - - - 456.000 - - TP3971 - - - 456.000 - - TP3972 - - - 456.000 - - TP3973 - - - 456.000 - - TP3974 - - - 456.000 - - TP3975 - - - 456.000 - - TP3976 - - - 456.000 - - TP3977 - - - 456.000 - - TP3978 - - - 456.000 - - TP3979 - - - 456.000 - - TP3980 - - - 456.000 - - TP3981 - - - 456.000 - - TP3982 - - - 456.000 - - TP3983 - - - 456.000 - - TP3984 - - - 456.000 - - TP3985 - - - 456.000 - - TP3986 - - - 456.000 - - TP3987 - - - 456.000 - - TP3988 - - - 456.000 - - TP3989 - - - 456.000 - - TP3990 - - - 456.000 - - TP3991 - - - 456.000 - - TP3992 - - - 456.000 - - TP3993 - - - 456.000 - - TP3994 - - - 456.000 - - TP3995 - - - 456.000 - - TP3996 - - - 456.000 - - TP3997 - - - 456.000 - - TP3998 - - - 456.000 - - TP3999 - - - 456.000 - - TP4000 - - - 456.000 - - TP4001 - - - 456.000 - - TP4002 - - - 456.000 - - TP4003 - - - 456.000 - - TP4004 - - - 456.000 - - TP4005 - - - 456.000 - - TP4006 - - - 456.000 - - TP4007 - - - 456.000 - - TP4008 - - - 456.000 - - TP4009 - - - 456.000 - - TP4010 - - - 456.000 - - TP4011 - - - 456.000 - - TP4012 - - - 456.000 - - TP4013 - - - 456.000 - - TP4014 - - - 456.000 - - TP4015 - - - 456.000 - - TP4016 - - - 456.000 - - TP4017 - - - 456.000 - - TP4018 - - - 456.000 - - TP4019 - - - 456.000 - - TP4020 - - - 456.000 - - TP4021 - - - 456.000 - - TP4022 - - - 456.000 - - TP4023 - - - - diff --git a/reference/wbt-201.tk1 b/reference/wbt-201.tk1 deleted file mode 100644 index c1bc918af..000000000 Binary files a/reference/wbt-201.tk1 and /dev/null differ diff --git a/testo.d/classic-3.test b/testo.d/classic-3.test index 0e7f31a09..138b9d3c0 100644 --- a/testo.d/classic-3.test +++ b/testo.d/classic-3.test @@ -13,20 +13,6 @@ gpsbabel -i gpx -f ${TMPDIR}/alltypes.gpx -x nuketypes,waypoints,tracks -o gpx - gpsbabel -i gpx -f ${TMPDIR}/wpts.gpx -f ${TMPDIR}/trks.gpx -f ${TMPDIR}/rtes.gpx -o gpx -F ${TMPDIR}/merged.gpx compare ${TMPDIR}/alltypes.gpx ${TMPDIR}/merged.gpx -# -# WBT-200 tests -# -rm -f ${TMPDIR}/wbt-200.* -gpsbabel -i wbt-bin -f ${REFERENCE}/wbt-200.bin -o gpx -F ${TMPDIR}/wbt-200.gpx -compare ${REFERENCE}/wbt-200.gpx ${TMPDIR}/wbt-200.gpx - -# -# WBT-201 tests -# -rm -f ${TMPDIR}/wbt-201.* -gpsbabel -t -w -i wbt-bin -f ${REFERENCE}/wbt-201.tk1 -o gpx -F ${TMPDIR}/wbt-201.gpx -compare ${REFERENCE}/wbt-201.gpx ${TMPDIR}/wbt-201.gpx - # # gzipped file i/o (reading only) # diff --git a/vecs.cc b/vecs.cc index 02ee26c70..143d10418 100644 --- a/vecs.cc +++ b/vecs.cc @@ -84,10 +84,7 @@ extern ff_vecs_t mtk_fvecs; extern ff_vecs_t mtk_m241_vecs; extern ff_vecs_t mtk_m241_fvecs; #endif // MAXIMAL_ENABLED -extern ff_vecs_t wbt_svecs; #if MAXIMAL_ENABLED -extern ff_vecs_t wbt_fvecs; -//extern ff_vecs_t wbt_fvecs; extern ff_vecs_t vcf_vecs; extern ff_vecs_t gtm_vecs; #if CSVFMTS_ENABLED @@ -140,10 +137,7 @@ struct Vecs::Impl { LegacyFormat mtk_m241_fmt {mtk_m241_vecs}; LegacyFormat mtk_m241_ffmt {mtk_m241_fvecs}; #endif // MAXIMAL_ENABLED - LegacyFormat wbt_sfmt {wbt_svecs}; #if MAXIMAL_ENABLED - LegacyFormat wbt_ffmt {wbt_fvecs}; -//LegacyFormat wbt_ffmt {wbt_fvecs}; LegacyFormat vcf_fmt {vcf_vecs}; UnicsvFormat unicsv_fmt; LegacyFormat gtm_fmt {gtm_vecs}; @@ -326,28 +320,7 @@ struct Vecs::Impl { nullptr, }, #endif // MAXIMAL_ENABLED - { - &wbt_sfmt, - "wbt", - "Wintec WBT-100/200 GPS Download", - nullptr, - nullptr, - }, #if MAXIMAL_ENABLED - { - &wbt_ffmt, - "wbt-bin", - "Wintec WBT-100/200 Binary File Format", - "bin", - nullptr, - }, - { - &wbt_ffmt, - "wbt-tk1", - "Wintec WBT-201/G-Rays 2 Binary File Format", - "tk1", - nullptr, - }, { &vcf_fmt, "vcard", diff --git a/wbt-200.cc b/wbt-200.cc deleted file mode 100644 index f88b54286..000000000 --- a/wbt-200.cc +++ /dev/null @@ -1,1101 +0,0 @@ -/* - * Serial download of track data from a Wintec WBT-200. - * - * Copyright (C) 2006 Andy Armstrong - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include // for array -#include // for isprint -#include // for va_end, va_list, va_start -#include // for uint32_t, int32_t, int16_t, uint16_t -#include // for size_t, snprintf, fread, fclose, feof, vprintf, FILE -#include // for strtod, strtoul -#include // for strlen, memcmp, memcpy - -#include // for QByteArray -#include // for QDate -#include // for QDateTime -#include // for QString -#include // for QTime -#include // for QVector -#include // for UTC -#include // for qPrintable - -#include "defs.h" -#include "gbser.h" // for gbser_set_port, gbser_deinit, gbser_flush, gbser_init, gbser_print, gbser_read_line, gbser_read_wait, gbser_readc_wait, gbser_OK - - -#define MYNAME "WBT-100/200" -#define NL "\x0D\x0A" - -#define WBT200BAUD 9600 - -#define WBT201BAUD 57600 -#define WBT201CHUNK 4096 - -#define TIMEOUT 5000 - -#define RECLEN_V1 12 -#define RECLEN_V2 16 - -#define RECLEN_WBT201 16 - -/* tk1 file format stuff */ - -#define TK1_MAGIC "WintecLogFormat" -#define TK1_DATA_OFFSET 0x0400 -#define TK1_END_FLAG 0x04000000ul - -/* Used to sanity check data - from - * http://hypertextbook.com/facts/2001/DanaWollman.shtml - * The MAXALT check doesn't need to be enabled unless there's - * a format with larger records than V2. - */ -/*#define MAXALT 120000*/ - -#define _MAX(a, b) ((a) > (b) ? (a) : (b)) -#define RECLEN_MAX _MAX(RECLEN_V1, RECLEN_V2) - -/* Flags for WBT201 */ -enum { - WBT201_TRACK_START = 0x01, - WBT201_WAYPOINT = 0x02, - WBT201_OVER_SPEED = 0x04 -}; - -#define BUFSPEC(b) b, sizeof(b) - -/* The formats here must be in ascending record length order so that - * each format identification attempt can read more data from the - * device if necessary. If that proves to be a bad order to try the - * heuristics the format matching code will have to be rejigged. - */ -static struct { - size_t reclen; -} fmt_version[] = { - { RECLEN_V1 }, - { RECLEN_V2 }, - { 0 } -}; - -/* Number of lines to skip while waiting for an ACK from a command. I've seen - * conversations with up to 30 lines of cruft before the response so 60 isn't - * too crazy. - */ -#define RETRIES 60 - -/* - * For WBT-200 protocol documentation see: - * http://hexten.net/wiki/index.php/WBT-200_Comms_Protocol - */ - -static void* fd; -static FILE* fl; -static char* opt_erase; - -enum wintec_gps_types { - UNKNOWN, WBT200, WBT201, WSG1000 -}; - -static wintec_gps_types dev_type = UNKNOWN; - -struct buf_chunk { - struct buf_chunk* next; - size_t size; - size_t used; - /* data follows in memory */ -}; - -#define buf_CHUNK_DATA(c) \ - ((void *) ((struct buf_chunk *) (c) + 1)) - -#define buf_CHUNK_PTR(c, offset) \ - ((void *) ((char *) buf_CHUNK_DATA(c) + (offset))) - -struct buf_head { - struct buf_chunk* head; - struct buf_chunk* tail; - size_t alloc; - size_t used; - /* read position */ - struct buf_chunk* current; - unsigned long offset; - /* shoehorned in here primarily out of laziness */ - unsigned checksum; -}; - -struct read_state { - route_head* route_head_; - unsigned wpn, tpn; - - struct buf_head data; -}; - -[[gnu::format(printf, 2, 3)]] static void db(int l, const char* msg, ...) -{ - va_list ap; - va_start(ap, msg); - if (global_opts.debug_level >= l) { - vprintf(msg, ap); - } - va_end(ap); -} - -/* Growable buffer support. TODO: Put this in a separate file and - * tidy up its interface. - */ - -static void buf_init(struct buf_head* h, size_t alloc) -{ - h->head = nullptr; - h->tail = nullptr; - h->alloc = alloc; - h->used = 0; - h->checksum = 0; - h->offset = 0; -} - -static void buf_empty(struct buf_head* h) -{ - struct buf_chunk* next; - for (struct buf_chunk* chunk = h->head; chunk; chunk = next) { - next = chunk->next; - xfree(chunk); - } - h->head = nullptr; - h->tail = nullptr; - h->used = 0; - h->checksum = 0; -} - -static void buf_rewind(struct buf_head* h) -{ - h->current = h->head; - h->offset = 0; -} - -static size_t buf_read(struct buf_head* h, void* data, size_t len) -{ - char* bp = (char*) data; - size_t got = 0; - - while (len != 0 && h->current != nullptr) { - size_t avail = h->current->used - h->offset; - if (avail > len) { - avail = len; - } - - /* Allow NULL buffer pointer to skip bytes */ - if (nullptr != bp) { - memcpy(bp, buf_CHUNK_PTR(h->current, h->offset), avail); - bp += avail; - } - - h->offset += avail; - len -= avail; - got += avail; - - if (h->offset == h->current->used) { - h->current = h->current->next; - h->offset = 0; - } - } - - return got; -} - -static void buf_extend(struct buf_head* h, size_t amt) -{ - size_t sz = amt + sizeof(struct buf_chunk); - - auto* c = (struct buf_chunk*) xmalloc(sz); - c->next = nullptr; - c->size = amt; - c->used = 0; - - if (nullptr == h->head) { - h->head = c; - } else { - h->tail->next = c; - } - - h->tail = c; -} - -static void buf_update_checksum(struct buf_head* h, const void* data, size_t len) -{ - auto* cp = static_cast(data); - - db(4, "Updating checksum with %p, %zu, before: %02x ", - data, len, h->checksum); - for (unsigned i = 0; i < len; i++) { - h->checksum ^= cp[i]; - } - db(4, "after: %02x\n", h->checksum); -} - -static void buf_write(struct buf_head* h, const void* data, size_t len) -{ - const char* bp = (const char*) data; - - buf_update_checksum(h, data, len); - - h->used += len; - - if (nullptr == h->tail) { - buf_extend(h, h->alloc); - } - - for (;;) { - size_t avail = h->tail->size - h->tail->used; - if (avail > len) { - avail = len; - } - - memcpy((char*) buf_CHUNK_PTR(h->tail, h->tail->used), bp, avail); - h->tail->used += avail; - bp += avail; - len -= avail; - if (len == 0) { - break; - } - buf_extend(h, h->alloc); - } -} - -static void rd_drain() -{ - if (gbser_flush(fd)) { - fatal(MYNAME ": Comm error\n"); - } -} - -static void rd_line(char* buf, int len) -{ - int rc; - if (rc = gbser_read_line(fd, buf, len, TIMEOUT, 0x0A, 0x0D), rc != gbser_OK) { - fatal(MYNAME ": Read error (%d)\n", rc); - } - db(3, "Got response: \"%s\"\n", buf); -} - -static void wr_cmd(const char* cmd) -{ - int rc; - db(3, "Sending: %s\n", cmd); - if (rc = gbser_print(fd, cmd), gbser_OK != rc) { - fatal(MYNAME ": Write error (%d)\n", rc); - } -} - -static void wr_cmdl(const char* cmd) -{ - wr_cmd(cmd); - wr_cmd(NL); -} - -static int expect(const char* str) -{ - int state = 0; - int errors = 5; /* allow this many errors */ - - for (int i = 0; i < 5000; i++) { - /* reached end of string */ - if (str[state] == '\0') { - return 1; - } - - int c = gbser_readc_wait(fd, 500); - if (c < 0) { - db(3, "Got error: %d\n", c); - if (--errors <= 0) { - return 0; - } - } else { - db(3, "Got char: %02x '%c'\n", c, isprint(c) ? c : '.'); - if (c == str[state]) { - state++; /* carry on */ - } else { - state = 0; /* go back to start */ - } - } - } - - return 0; -} - -static int wbt200_try() -{ - int rc; - - db(1, "Trying WBT100/200\n"); - - if ((rc = gbser_set_port(fd, WBT200BAUD, 8, 0, 1))) { - db(1, "Set baud rate to %d failed (%d)\n", WBT200BAUD, rc); - return 0; - } - - wr_cmdl("$PFST,NORMAL"); - return expect("$PFST"); -} - -static int wbt201_try() -{ - int rc; - - db(1, "Trying WBT201/G-Rays 2\n"); - - if ((rc = gbser_set_port(fd, WBT201BAUD, 8, 0, 1))) { - db(1, "Set baud rate to %d failed (%d)\n", WBT201BAUD, rc); - return 0; - } - - wr_cmdl("@AL"); - return expect("@AL"); -} - -static int wsg1000_try() -{ - int rc; - - db(1, "Trying WSG 1000/G-Rays 2\n"); - - if ((rc = gbser_set_port(fd, WBT201BAUD, 8, 0, 1))) { - db(1, "Set baud rate to %d failed (%d)\n", WBT201BAUD, rc); - return 0; - } - - wr_cmdl("@AL,2,3"); - return expect("@AL,2,3,OK"); -} - -static wintec_gps_types guess_device() -{ - db(1, "Guessing device...\n"); - for (int i = 0; i < 5; i++) { - if (wbt200_try()) { - return WBT200; - } - if (wbt201_try()) { - return WBT201; - } - if (wsg1000_try()) { - return WSG1000; - } - } - return UNKNOWN; - -} - -static void rd_init(const QString& fname) -{ - db(1, "Opening port...\n"); - if ((fd = gbser_init(qPrintable(fname))) == nullptr) { - fatal(MYNAME ": Can't initialise port \"%s\"\n", qPrintable(fname)); - } - - dev_type = guess_device(); - if (UNKNOWN == dev_type) { - fatal(MYNAME ": Can't determine device type\n"); - } -} - -static void rd_deinit() -{ - db(1, "Closing port...\n"); - gbser_deinit(fd); - fd = nullptr; -} - -static int rd_buf(void* buf, int len) -{ - int rc; - if (rc = gbser_read_wait(fd, buf, len, TIMEOUT), rc < 0) { - fatal(MYNAME ": Read error (%d)\n", rc); - } else if (rc < len) { - db(2, MYNAME ": Read timeout, got %i of %i bytes\n", rc, len); - return 0; - } - return 1; -} - -static void file_init(const QString& fname) -{ - db(1, "Opening file...\n"); - if ((fl = ufopen(fname, "rb")) == nullptr) { - fatal(MYNAME ": Can't open file '%s'\n", qPrintable(fname)); - } -} - -static void file_deinit() -{ - db(1, "Closing file...\n"); - fclose(fl); -} - -static int starts_with(const char* buf, const char* pat) -{ - size_t pat_len = strlen(pat); - return (pat_len <= strlen(buf)) - ? (memcmp(buf, pat, pat_len) == 0) - : 0; -} - -/* Send a command then wait for a line starting with the command string - * to be returned. - */ -static int do_cmd(const char* cmd, const char* expect, char* buf, int len) -{ - rd_drain(); - wr_cmdl(cmd); - - db(2, "Cmd: %s\n", cmd); - - /* We may need to skip a load of data to start with - the unit streams - * NMEA data all the time so it's highly likely that it'll be in the - * middle of an NMEA sentence when we start listening. - */ - for (int trycount = 0; trycount < RETRIES; trycount++) { - rd_line(buf, len); - db(3, "Got: %s\n", buf); - if (starts_with(buf, expect)) { - db(2, "Matched: %s\n", buf); - return strlen(expect); - } - db(2, "Skip %d: %s\n", trycount, buf); - } - - fatal(MYNAME ": Bad response from unit\n"); - return 0; /* keep compiler quiet */ -} - -/* Issue a command that expects the same string to be echoed - * back as an ACK - */ -static int do_simple(const char* cmd, char* buf, int len) -{ - return do_cmd(cmd, cmd, buf, len); -} - -static char* get_param(const char* cmd, char* buf, int len) -{ - int cl = do_simple(cmd, buf, len); - return buf + cl + 1; -} - -static int get_param_int(const char* cmd) -{ - char buf[80]; - return xstrtoi(get_param(cmd, buf, sizeof(buf)), nullptr, 10); -} - -static double get_param_float(const char* cmd) -{ - char buf[80]; - return strtod(get_param(cmd, buf, sizeof(buf)), nullptr); -} - -/* Decompose binary date into discreet fields */ -std::array split_date(uint32_t tim) -{ - int sec = (((tim) >> 0) & 0x3F); - int min = (((tim) >> 6) & 0x3F); - int hour = (((tim) >> 12) & 0x1F); - int mday = (((tim) >> 17) & 0x1F); - int mon = (((tim) >> 22) & 0x0F); - int year = (((tim) >> 26) & 0x3F); - return {sec, min, hour, mday, mon, year}; -} - -static QDateTime decode_date(uint32_t tim) -{ - auto [sec, min, hour, mday, mon, year] = split_date(tim); - return {QDate(year + 2000, mon, mday), QTime(hour, min, sec), Qt::UTC}; -} - -static bool check_date(uint32_t tim) -{ - auto [sec, min, hour, mday, mon, year] = split_date(tim); - - /* Sanity check the date. We don't allow years prior to 2004 because zero in - * those bits will usually indicate that we have an altitude instead of a - * date (i.e. that the data is the new format that uses 16 byte records). - */ - return sec < 60 && min < 60 && hour < 24 && - mday > 0 && mday <= 31 && mon > 0 && mon <= 12 && year >= 4; -} - -static Waypoint* make_point(double lat, double lon, double alt, const QDateTime& tim, const char* fmt, int index) -{ - auto* wpt = new Waypoint; - - wpt->latitude = lat; - wpt->longitude = lon; - wpt->altitude = alt; - wpt->SetCreationTime(tim); - wpt->shortname = QString::asprintf(fmt, index); - - return wpt; -} - -static Waypoint* make_waypoint(struct read_state* st, double lat, double lon, double alt, const QDateTime& tim) -{ - return make_point(lat, lon, alt, tim, "WP%04d", ++st->wpn); -} - -static Waypoint* make_trackpoint(struct read_state* st, double lat, double lon, double alt, const QDateTime& tim) -{ - return make_point(lat, lon, alt, tim, "TP%04d", ++st->tpn); -} - -static int wbt200_data_chunk(struct read_state* st, const void* buf, int fmt) -{ - double alt; - const char* bp = (const char*) buf; - size_t buf_used = fmt_version[fmt].reclen; - - uint32_t tim = le_read32(bp + 0); - - double lat = (double)((int32_t) le_read32(bp + 4)) / 10000000; - double lon = (double)((int32_t) le_read32(bp + 8)) / 10000000; - - /* Handle extra fields in longer records here. */ - if (buf_used >= 16) { - alt = (double) le_read32(bp + 12) / 10; - } else { - alt = unknown_alt; - } - - QDateTime rtim = decode_date(tim); - - if (lat >= 100) { - /* Start new track in the northern hemisphere */ - lat -= 100; - st->route_head_ = nullptr; - } else if (lat <= -100) { - /* Start new track in the southern hemisphere */ - /* This fix courtesy of Anton Frolich */ - lat += 100; - st->route_head_ = nullptr; - } - - Waypoint* tpt = make_trackpoint(st, lat, lon, alt, rtim); - - if (nullptr == st->route_head_) { - db(1, "New Track\n"); - st->route_head_ = new route_head; - track_add_head(st->route_head_); - } - - track_add_wpt(st->route_head_, tpt); - - return 1; -} - -/* Return true iff the data appears valid with the specified record length */ -static bool is_valid(struct buf_head* h, int fmt) -{ - char buf[RECLEN_MAX]; - size_t reclen = fmt_version[fmt].reclen; - - buf_rewind(h); - - db(2, "Checking %zu bytes of data against format %d\n", h->used, fmt); - - for (;;) { - size_t got = buf_read(h, buf, reclen); - /* Don't mind odd bytes at the end - we may - * be examining an incomplete dataset. - */ - if (got != reclen) { - break; - } - - uint32_t tim = le_read32(buf + 0); - if (!check_date(tim)) { - return false; - } - - if (reclen > 12) { -#ifdef MAXALT - uint32_t alt = le_read32(buf + 12); - if (alt > MAXALT * 10) { - return false; - } -#endif - } - } - - return true; -} - -static void wbt200_process_data(struct read_state* pst, int fmt) -{ - char buf[RECLEN_MAX]; - size_t reclen = fmt_version[fmt].reclen; - - buf_rewind(&pst->data); - - db(2, "Processing %zu bytes of data using format %d\n", pst->data.used, fmt); - - for (;;) { - size_t got = buf_read(&pst->data, buf, reclen); - if (got != reclen) { - break; - } - wbt200_data_chunk(pst, buf, fmt); - } -} - -static void state_init(struct read_state* pst) -{ - pst->route_head_ = nullptr; - pst->wpn = 0; - pst->tpn = 0; - - buf_init(&pst->data, RECLEN_V1 * RECLEN_V2); -} - -static void state_empty(struct read_state* pst) -{ - buf_empty(&pst->data); - state_init(pst); -} - -static int want_bytes(struct buf_head* h, size_t len) -{ - char buf[512]; - - db(3, "Reading %zu bytes from device\n", len); - - while (len > 0) { - size_t want = sizeof(buf); - if (want > len) { - want = len; - } - if (!rd_buf(buf, want)) { - return 0; - } - buf_write(h, buf, want); - len -= want; - } - return 1; -} - -static void wbt200_data_read() -{ - /* Awooga! Awooga! Statically allocated buffer danger! - * Actually, it's OK because rd_line can read arbitrarily - * long lines returning only the first N characters - */ - char line_buf[100]; - int fmt; - struct read_state st; - - state_init(&st); - - /* We could potentially parse the version string to find out which - * data format to use - but it's not clear how the version string - * will increment in the future - so just now it's more future- - * proof to rely on analysing the data. We need to be able to do - * that with files anyway - because they're not versioned. - */ - do_simple("$PFST,FIRMWAREVERSION", BUFSPEC(line_buf)); - - do_simple("$PFST,NORMAL", BUFSPEC(line_buf)); - do_simple("$PFST,READLOGGER", BUFSPEC(line_buf)); - - /* Now we're into binary mode */ - rd_buf(line_buf, 6); /* six byte header */ - unsigned long count = le_read16(line_buf + 2) + 1; - if (count == 0x10000) { - count = 0; - } - - db(3, "%lu points available\n", count); - - /* Loop through the known formats requesting more data from the - * device each time. When the device contains only a single - * point the first format will get a false positive - so we'll - * lose the altitude data. - */ - for (fmt = 0; fmt_version[fmt].reclen != 0; fmt++) { - size_t reclen = fmt_version[fmt].reclen; - size_t want = reclen * count; - - if (want < st.data.used) { - fatal(MYNAME ": Internal error: formats not ordered in ascending size order\n"); - } - - db(3, "Want %zu bytes of data\n", want); - - /* Top up the buffer */ - want_bytes(&st.data, want - st.data.used); - - /* And see if it's valid */ - if (is_valid(&st.data, fmt)) { - break; - } - } - - if (fmt_version[fmt].reclen == 0) { - fatal(MYNAME ": Can't autodetect data format\n"); - } - - wbt200_process_data(&st, fmt); - - /* Erase data? */ - - if (*opt_erase != '0') { - int f; - db(1, "Erasing data\n"); - for (f = 27; f <= 31; f++) { - snprintf(line_buf, sizeof(line_buf), "$PFST,REMOVEFILE,%d", f); - do_cmd(line_buf, "$PFST,REMOVEFILE", BUFSPEC(line_buf)); - } - db(1, "Reclaiming free space\n"); - for (f = 0; f <= 3; f++) { - snprintf(line_buf, sizeof(line_buf), "$PFST,FFSRECLAIM,%d", f); - do_cmd(line_buf, "$PFST,FFSRECLAIM", BUFSPEC(line_buf)); - } - } - - do_simple("$PFST,NORMAL", BUFSPEC(line_buf)); - - state_empty(&st); -} - -static int all_null(const void* buf, const int len) -{ - const char* bp = (const char*) buf; - - for (int i = 0; i < len; i++) { - if (bp[i]) { - return 0; - } - } - - return 1; -} - -static int wbt201_data_chunk(struct read_state* st, const void* buf) -{ - const char* bp = (const char*) buf; - - /* Zero records are skipped */ - if (all_null(buf, RECLEN_WBT201)) { - return 1; - } - - uint16_t flags = le_read16(bp + 0); - uint32_t tim = le_read32(bp + 2); - - if (TK1_END_FLAG == tim) { - /* EOF? (TK1 files only as far as I know) */ - return 0; - } - - double lat = (double)((int32_t) le_read32(bp + 6)) / 10000000; - double lon = (double)((int32_t) le_read32(bp + 10)) / 10000000; - auto alt = (double)((int16_t) le_read16(bp + 14)); - - QDateTime rtim = decode_date(tim); - - if ((flags & WBT201_WAYPOINT) && (global_opts.masked_objective & WPTDATAMASK)) { - Waypoint* wpt = make_waypoint(st, lat, lon, alt, rtim); - waypt_add(wpt); - } - - if (global_opts.masked_objective & TRKDATAMASK) { - if (flags & WBT201_TRACK_START) { - st->route_head_ = nullptr; - } - - Waypoint* tpt = make_trackpoint(st, lat, lon, alt, rtim); - - if (nullptr == st->route_head_) { - db(1, "New Track\n"); - st->route_head_ = new route_head; - track_add_head(st->route_head_); - } - - track_add_wpt(st->route_head_, tpt); - } - - return 1; -} - -static void wbt201_process_chunk(struct read_state* st) -{ - char buf[RECLEN_WBT201]; - - db(2, "Processing %zu bytes of data\n", st->data.used); - - while (buf_read(&st->data, buf, sizeof(buf)) == sizeof(buf) - && wbt201_data_chunk(st, buf)) { - /* do nothing */ - } -} - -static int wbt201_read_chunk(struct read_state* st, unsigned pos, unsigned limit) -{ - char cmd_buf[30]; - char line_buf[100]; - char* op; - static const char* cs_prefix = "@AL,CS,"; - - unsigned want = limit - pos; - if (want > WBT201CHUNK) { - want = WBT201CHUNK; - } - - db(3, "Reading bytes at %u (0x%x), limit = %u (0x%x), want = %u (0x%x)\n", - pos, pos, limit, limit, want, want); - - buf_empty(&st->data); - - rd_drain(); - snprintf(cmd_buf, sizeof(cmd_buf), "@AL,5,3,%u", pos); - wr_cmdl(cmd_buf); - - - if (!want_bytes(&st->data, want)) { - return 0; - } - - /* checksum */ - rd_line(BUFSPEC(line_buf)); - - if (!starts_with(line_buf, cs_prefix)) { - db(2, "Bad checksum response\n"); - return 0; - } - - char* lp = line_buf + strlen(cs_prefix); - unsigned long cs = strtoul(lp, &op, 16); - if (*lp == ',' || *op != ',') { - db(2, "Badly formed checksum\n"); - return 0; - } - - if (cs != st->data.checksum) { - db(2, "Checksums don't match. Got %02lx, expected %02x\n", cs, st->data.checksum); - return 0; - } - - /* ack */ - /* rd_line(BUFSPEC(line_buf)); - return starts_with(line_buf, cmd_buf); - */ - if (dev_type == WBT201) { - rd_line(BUFSPEC(line_buf)); - return starts_with(line_buf, cmd_buf); - } - return 1; - -} - -static void wbt201_data_read() -{ - char line_buf[100]; - struct read_state st; - - /* Read various device information. We don't use much of this yet - - * just log_addr_start and log_addr_end - but it's useful to have it - * here for debug and documentation purposes. - */ - const char* tmp = get_param("@AL,7,1", BUFSPEC(line_buf)); - db(1, "Reading device \"%s\"\n", tmp); - - double ver_hw = get_param_float("@AL,8,1"); - double ver_sw = get_param_float("@AL,8,2"); - double ver_fmt = get_param_float("@AL,8,3"); - - db(2, "versions: hw=%f, sw=%f, fmt=%f\n", - ver_hw, ver_sw, ver_fmt); - - unsigned log_addr_start = get_param_int("@AL,5,1"); /* we read from here... */ - unsigned log_addr_end = get_param_int("@AL,5,2"); /* ...to here, but ... */ - unsigned log_area_start = get_param_int("@AL,5,9"); /* ...we need these when ... */ - unsigned log_area_end = get_param_int("@AL,5,10"); /* ...the gps wrote more then it fits in memory */ - - db(2, "Log addr=(%d..%d), area=(%d..%d)\n", - log_addr_start, log_addr_end, - log_area_start, log_area_end); - - state_init(&st); - - unsigned tries = 10; - - /* If the WBT-201 device logs more then the memory can handle it continues to write at the beginning of the memory, - * thus overwriting the oldest tracks. In this case log_addr_end is smaller then log_addr_start and we need to read - * from log_addr_start to log_area_end and then from log_area_start to log_addr_end. - */ - - unsigned wantbytes = (log_addr_start < log_addr_end) ? log_addr_end - log_addr_start : log_area_end - (log_addr_start - log_addr_end); - unsigned read_pointer = log_addr_start; - unsigned read_limit = (log_addr_start < log_addr_end) ? log_addr_end : log_area_end; - - db(2, "Want %d bytes from device\n", wantbytes); - while (wantbytes > 0) { - db(2, "Read params: Want %d bytes, read_pointer = %d, read_limit = %d\n", wantbytes, read_pointer, read_limit); - if (wbt201_read_chunk(&st, read_pointer, read_limit)) { - buf_rewind(&st.data); - wbt201_process_chunk(&st); - wantbytes -= st.data.used; - read_pointer += st.data.used; - if (read_pointer >= log_area_end) { - read_pointer = log_area_start; - read_limit = log_addr_end; - } - } else { - if (--tries == 0) { - fatal(MYNAME ": Too many data errors during read\n"); - } - } - } - - if (*opt_erase != '0') { - /* erase device */ - do_simple("@AL,5,6", BUFSPEC(line_buf)); - } - - state_empty(&st); - do_simple("@AL,2,1", BUFSPEC(line_buf)); -} - -static void file_read() -{ - char buf[512]; - struct read_state st; - - const char* tk1_magic = TK1_MAGIC; - size_t tk1_magic_len = strlen(tk1_magic) + 1; - - state_init(&st); - - /* Read the whole file into the buffer */ - size_t rc = fread(buf, 1, sizeof(buf), fl); - while (rc != 0) { - buf_write(&st.data, buf, rc); - rc = fread(buf, 1, sizeof(buf), fl); - } - - if (!feof(fl)) { - fatal(MYNAME ": Read error\n"); - } - - /* Although wbt-tk1 and wbt-bin are enumerated as distinct formats - * we handle them both here and autodetect which type we have. - */ - - /* WBT201 TK1 format? */ - - buf_rewind(&st.data); - buf_read(&st.data, buf, tk1_magic_len); - if (memcmp(buf, tk1_magic, tk1_magic_len) == 0) { - db(1, "Got TK1 file\n"); - buf_rewind(&st.data); - /* Seek */ - buf_read(&st.data, nullptr, TK1_DATA_OFFSET); - wbt201_process_chunk(&st); - } else { - db(1, "Got bin file\n"); - - /* Try to guess the data format */ - int fmt; - for (fmt = 0; fmt_version[fmt].reclen != 0; fmt++) { - size_t reclen = fmt_version[fmt].reclen; - if ((st.data.used % reclen) == 0 && is_valid(&st.data, fmt)) { - break; - } - } - - if (fmt_version[fmt].reclen == 0) { - fatal(MYNAME ": Can't autodetect data format\n"); - } - - wbt200_process_data(&st, fmt); - } - - state_empty(&st); -} - -static void data_read() -{ - switch (dev_type) { - case WBT200: - wbt200_data_read(); - break; - case WBT201: - wbt201_data_read(); - break; - case WSG1000: - wbt201_data_read(); - break; - - default: - fatal(MYNAME ": Unknown device type (internal)\n"); - break; - } -} - -/* wbt */ - -static QVector wbt_sargs = { - { - "erase", &opt_erase, "Erase device data after download", - "0", ARGTYPE_BOOL, ARG_NOMINMAX, nullptr - }, -}; - -/* master process: don't convert anything */ - -ff_vecs_t wbt_svecs = { - ff_type_serial, - { ff_cap_read, ff_cap_read, ff_cap_none }, - rd_init, - nullptr, - rd_deinit, - nullptr, - data_read, - nullptr, - nullptr, - &wbt_sargs, - NULL_POS_OPS -}; - -/* used for wbt-bin /and/ wbt-tk1 */ - -static QVector wbt_fargs = { -}; - -/* master process: don't convert anything */ - -ff_vecs_t wbt_fvecs = { - ff_type_file, - { ff_cap_none, ff_cap_read, ff_cap_none }, - file_init, - nullptr, - file_deinit, - nullptr, - file_read, - nullptr, - nullptr, - &wbt_fargs, - NULL_POS_OPS -}; diff --git a/xmldoc/formats/options/wbt-erase.xml b/xmldoc/formats/options/wbt-erase.xml deleted file mode 100644 index 95424f0dd..000000000 --- a/xmldoc/formats/options/wbt-erase.xml +++ /dev/null @@ -1 +0,0 @@ -This option erases the track log from the device after download. diff --git a/xmldoc/formats/wbt-bin.xml b/xmldoc/formats/wbt-bin.xml deleted file mode 100644 index 3d3839b8c..000000000 --- a/xmldoc/formats/wbt-bin.xml +++ /dev/null @@ -1,11 +0,0 @@ -File protocol for the Wintec WBT-200 -and Wintec WBT-201 (sometimes called the G-Rays 2)GPS data loggers. This format reads the binary file format created -by Wintec's Windows application. - -Wintec WBT-201 - - - Command showing conversion of a Wintec binary file to GPX - gpsbabel -i wbt-bin -f tracks.bin -o -gpx -F out.gpx - diff --git a/xmldoc/formats/wbt-tk1.xml b/xmldoc/formats/wbt-tk1.xml deleted file mode 100644 index f3d0c0222..000000000 --- a/xmldoc/formats/wbt-tk1.xml +++ /dev/null @@ -1,10 +0,0 @@ -File protocol for the Wintec WBT-201 / G-Rays 2 -GPS data logger. This format reads the binary file format created -by Wintec's Time Machine X application. - -Wintec WBT-201 - - - Command showing conversion of a Wintec binary file to GPX - gpsbabel -w -t -i wbt-tk1 -f tracks.tk1 -o gpx -F out.gpx - diff --git a/xmldoc/formats/wbt.xml b/xmldoc/formats/wbt.xml deleted file mode 100644 index 8205d64f0..000000000 --- a/xmldoc/formats/wbt.xml +++ /dev/null @@ -1,27 +0,0 @@ -Serial download protocol for the -Wintec WBT-200 and -Wintec WBT-201 -Wintec WBT-1000 -GPS data loggers. Although untested it is expected that this will also support the WBT-100. - -Wintec WBT-201 - - - Command showing WBT-200 download and erase over Bluetooth on Mac OS X - gpsbabel -t -w -i wbt,erase -f /dev/cu.WBT200-SPPslave-1 -o gpx -F out.gpx - - - -Internally, this is actually a serial device that has a serial/USB adapter -built into it. It uses the CP210x chip by Silicon labs. You will probably -need a driver for this chip. The product ships with one for Windows. -The Linux 210x driver seems to work fine. Mac users will need to download -the Mac driver for CP210x. - - - -GPSBabel does not try to offer an interface to configure these units. That -is left to the Windows software that comes with it or tools like the -WBT 201 Viewer for Mac OS/X -and Linux. -