Initial import from bzr repo at http://wilmer.gaa.st/selphy/

This commit is contained in:
Solomon Peachy 2016-01-31 09:23:51 -05:00
commit 15cfc5b2a9
5 changed files with 679 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.bzr

5
Makefile Normal file
View File

@ -0,0 +1,5 @@
selphy: selphy.go
go build selphy.go
clean:
rm -f selphy

40
README Normal file
View File

@ -0,0 +1,40 @@
ABOUT
=====
This is a simple client implementation of the CPNP protocol used by the
Canon Selphy CP-900 printer, and possibly others. I'm not aware of any
protocol spec being available, but it was pretty simple to reverse-
engineer.
The protocol is fairly similar to the BJNP protocol used by normal Canon
printers. I've peeked at http://sourceforge.net/projects/cups-bjnp/ here
and there for hints and ideas.
INSTALL & USAGE
===============
This should be pretty simple. Just build it, there are no special
dependencies other than a Go compiler, obviously.
See --help for available flags. You can use --printer_ip/_mac to specify the
printer to send your job to. By default, the tool will send a discovery
packet to 255.255.255.255 and send the job to whichever printer responds
first (and since regular non-photo printers speak a slightly different
protocol, that's often going to be just fine). If you're trying to send a
job to a printer not on your local network/broadcast domain, you can use
--printer_ip.
The program is pretty spammy at runtime, I haven't really tried cleaning
it up yet. Also, I haven't been able to use it much yet, so maybe it won't
work for you at all.
AUTHOR
======
Questions, complaints, suggestions and misc. fan-mail are welcome by
e-mail: wilmer@gaast.net .
I hope I'll manage to respond, but I'm not very good at e-mail these
days. :-(

506
selphy.go Normal file
View File

@ -0,0 +1,506 @@
/*********************************************************************\
* *
* selphy.go *
* Client implementation of the Canon Selphy CP900 network protocol *
* *
* Copyright 2013 Wilmer van der Gaast <wilmer@gaast.net> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of version 2 of the GNU General Public *
* License as published by the Free Software Foundation. *
* *
* 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. *
* *
\*********************************************************************/
/* Maybe needless to say, this is my first time using Go. Apologies for
not being bothered to split this into multiple files. */
package main
import (
"bytes"
"encoding/binary"
"encoding/hex"
"flag"
"fmt"
"image"
_ "image/jpeg"
"net"
"os"
"os/user"
"path/filepath"
"runtime"
"strings"
"time"
"unicode/utf16"
)
const (
CPNP_ADDR = "255.255.255.255"
CPNP_PORT = 8609
CPNP_MSG_DISCOVER = 0x101
CPNP_MSG_STARTTCP = 0x110
CPNP_MSG_ID = 0x130
CPNP_MSG_STATUS = 0x120
CPNP_MSG_DATA = 0x121
)
type cmd_handler func(head []byte, body []byte)
func cpnp_packet(command int, payload []byte) []byte {
ret := make([]byte, 16, 10240)
copy(ret[0:], []byte("CPNP"))
binary.BigEndian.PutUint16(ret[4:], uint16(command))
binary.BigEndian.PutUint16(ret[14:], uint16(len(payload)))
ret = ret[:len(ret) + len(payload)]
copy(ret[16:], payload)
return ret
}
type device struct {
mac []byte
udps *net.UDPConn
dest *net.UDPAddr
tcps *net.TCPConn
tcpd *net.TCPAddr
tcpbuf []byte
cmdseq uint16
jobseq uint16
handlers map[uint16]cmd_handler
props map[string]string
last_status []byte
chunk []byte
job *imgreader
cb func()
}
func new_device(printer_mac, printer_ip *string) (*device) {
var err error
c := new(device)
if *printer_mac != "" {
c.mac, err = hex.DecodeString(strings.Replace(*printer_mac, ":", "", -1))
checkError(err)
}
c.dest, err = net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", *printer_ip, CPNP_PORT))
checkError(err)
c.udps, err = net.ListenUDP("udp", nil)
checkError(err)
c.handlers = make(map[uint16]cmd_handler)
c.props = make(map[string]string)
return c
}
func (c *device) send(msg []byte, h cmd_handler) {
var err error
c.cmdseq++
binary.BigEndian.PutUint16(msg[8:], c.cmdseq)
c.handlers[c.cmdseq] = h
if (c.tcps != nil) {
/* Job number is sent in the TCP start response, and is (I
suppose) used to track state instead of just the TCP
port number. */
binary.BigEndian.PutUint16(msg[10:], c.jobseq)
_, err = c.tcps.Write(msg)
} else {
_, err = c.udps.WriteTo(msg, c.dest)
}
checkError(err)
}
func (c *device) wait() {
for {
if (c.tcps != nil) {
c.wait_tcp()
} else {
c.wait_udp()
}
}
}
func (c *device) wait_udp() {
buf := make([]byte, 5120, 5120)
n, err := c.udps.Read(buf[0:])
checkError(err)
if (bytes.Compare(buf[0:4], []byte("CPNP")) != 0) {
fmt.Println("UDP protocol error!")
} else {
c.handle_message(buf[0:n])
}
}
func (c *device) wait_tcp() {
buf := make([]byte, 5120, 5120)
n, err := c.tcps.Read(buf[0:])
checkError(err)
c.tcpbuf = c.tcpbuf[0:len(c.tcpbuf)+n]
copy(c.tcpbuf[len(c.tcpbuf)-n:], buf[0:n])
if (len(c.tcpbuf) < 16) {
return
}
if (bytes.Compare(c.tcpbuf[0:4], []byte("CPNP")) != 0) {
fmt.Println("TCP protocol error!")
return
}
msglen := 16 + binary.BigEndian.Uint32(c.tcpbuf[12:])
if (len(c.tcpbuf) < int(msglen)) {
return
}
c.handle_message(c.tcpbuf[0:msglen])
buf = make([]byte, 0, 5120)
copy(buf[0:], c.tcpbuf[msglen:])
c.tcpbuf = buf
}
func (c *device) handle_message(buf []byte) {
cmdseq := binary.BigEndian.Uint16(buf[8:])
c.handlers[cmdseq](buf[0:16], buf[16:])
delete(c.handlers, cmdseq)
}
func (c *device) discover(cb func()) {
c.cb = cb
p := cpnp_packet(CPNP_MSG_DISCOVER, []byte{})
c.send(p, c.discover_reply)
}
func (c *device) discover_reply(head []byte, body []byte) {
if body[4] == 6 {
mac := ""
for i := 0; i < 6; i ++ {
mac += fmt.Sprintf(":%02x", body[6+i])
}
mac = mac[1:]
fmt.Println("Found printer with MAC address", mac)
} /* else meh? */
if c.mac != nil && bytes.Compare(c.mac, body[6:12]) != 0 {
fmt.Println("Not the MAC address we're looking for, " +
"waiting for more responses")
return
}
var ip net.IP = body[6+body[4]:6+body[4]+body[5]]
fmt.Println("Switching to IP address", ip.String())
c.dest.IP = ip
p := cpnp_packet(CPNP_MSG_ID, []byte{0, 0, 0, 0})
c.send(p, c.id_reply)
}
func (c *device) id_reply(head []byte, body []byte) {
props := string(body[2:])
for _, bit := range strings.Split(props, ";") {
if len(bit) > 0 {
kv := strings.Split(bit, ":")
c.props[kv[0]] = kv[1]
}
}
p := cpnp_packet(CPNP_MSG_STATUS, []byte{})
c.send(p, c.status_reply)
}
func (c *device) status_reply(head []byte, body []byte) {
/* Might tell us stuff like "go away I'm busy!"? */
c.cb()
}
func (c *device) start_job(job *imgreader) {
c.job = job
u, _ := user.Current()
_, fn := filepath.Split(job.fn)
b := make([]byte, 0x188)
utf16_write(b[0x008:0x048], "selphy.go")
utf16_write(b[0x048:0x088], u.Username)
utf16_write(b[0x088:0x188], fn)
p := cpnp_packet(CPNP_MSG_STARTTCP, b)
c.send(p, c.start_tcp)
}
func (c *device) start_tcp(head []byte, body []byte) {
c.jobseq = binary.BigEndian.Uint16(head[10:])
port := binary.BigEndian.Uint16(body[4:])
if port == 0 {
/* TODO: Throw a big fat error. */
fmt.Println("Help! No TCP port to connect to..")
return
}
fmt.Printf("Should connect to TCP %s:%d ... ", c.dest.IP, port)
c.tcpd = new(net.TCPAddr)
c.tcpd.IP = c.dest.IP
c.tcpd.Port = int(port)
var e error
c.tcps, e = net.DialTCP("tcp", nil, c.tcpd)
checkError(e)
fmt.Println("Done")
c.tcpbuf = make([]byte, 0, 51200)
c.print_poll()
}
func (c *device) print_poll() {
p := cpnp_packet(CPNP_MSG_STATUS, []byte{})
c.send(p, c.print_data_request)
}
func (c *device) send_flags() {
b := make([]byte, 0x40)
binary.LittleEndian.PutUint32(b[0x04:], uint32(len(b)))
binary.LittleEndian.PutUint32(b[0x0c:], 1) // ?
if (c.job.border) {
binary.LittleEndian.PutUint32(b[0x12:], 3)
} else {
binary.LittleEndian.PutUint32(b[0x12:], 2)
}
p := cpnp_packet(CPNP_MSG_DATA, b)
c.send(p, c.send_flags_cb)
}
func (c *device) send_flags_cb(head []byte, body []byte) {
c.print_poll()
}
func (c *device) send_chunk() {
len := len(c.chunk)
if len > 4096 {
len = 4096
}
p := cpnp_packet(CPNP_MSG_DATA, c.chunk[0:len])
c.send(p, c.send_chunk_cb)
c.chunk = c.chunk[len:]
}
func (c *device) send_chunk_cb(head []byte, body []byte) {
if len(c.chunk) > 0 {
c.send_chunk()
} else {
c.print_poll()
}
}
func (c *device) job_done(head []byte, body []byte) {
c.tcps.Close()
c.tcpd = nil
c.tcps = nil
c.cb()
}
func (c *device) print_data_request(head []byte, body []byte) {
state := int(body[0x12])
fmt.Println("state", state)
/* It frequently seems to repeat the last status response, I suppose
that means it's still processing. Give it half a second. */
if bytes.Compare(c.last_status, body) == 0 {
time.Sleep(200 * time.Millisecond)
c.print_poll()
return
}
c.last_status = body
switch (state) {
case 0x00:
/* Wait */
time.Sleep(500 * time.Millisecond)
c.print_poll()
case 0x01:
/* Job flags */
fmt.Println("Sending flags")
c.send_flags()
case 0x02:
/* File data request */
offset := binary.LittleEndian.Uint32(body[0x18:])
length := binary.LittleEndian.Uint32(body[0x1c:])
fmt.Println("Will send", length, "bytes starting from", offset)
/* Save the whole chunk and have it sent in 4KB steps. */
c.chunk = c.job.get_chunk(offset, length)
c.send_chunk()
case 0x03:
/* DONE! */
fmt.Println("Job done, closing connection.")
b := make([]byte, 0x40)
binary.LittleEndian.PutUint32(b[0x04:], uint32(len(b)))
b[2] = 0x03 // Echo status code? No clue..
p := cpnp_packet(CPNP_MSG_DATA, b)
c.send(p, c.job_done)
}
}
func utf16_write(buf []byte, val string) {
enc := utf16.Encode([]rune(val))
for i, c := range enc {
binary.BigEndian.PutUint16(buf[2*i:], uint16(c))
}
}
type imgreader struct {
fn string
fp *os.File
w, h int
fsize int64
border bool
}
func new_imgreader(fn string) (*imgreader) {
r := new(imgreader)
r.fn = fn
r.fp, _ = os.Open(r.fn)
fi, _ := r.fp.Stat()
r.fsize = fi.Size()
cfg, f, e := image.DecodeConfig(r.fp)
checkError(e)
fmt.Printf("File %s, %s file, %d bytes, %d×%d\n", fn, f, r.fsize, cfg.Width, cfg.Height)
r.w = cfg.Width
r.h = cfg.Height
return r
}
func (r *imgreader) file_header(offset uint32, length uint32) ([]byte) {
buf := make([]byte, 0x68)
buf[0x02] = 1
binary.LittleEndian.PutUint32(buf[0x04:], length + uint32(len(buf)))
buf[0x0c] = 1
binary.LittleEndian.PutUint32(buf[0x14:], uint32(r.fsize))
binary.LittleEndian.PutUint32(buf[0x18:], uint32(r.w))
binary.LittleEndian.PutUint32(buf[0x1c:], uint32(r.h))
binary.LittleEndian.PutUint32(buf[0x60:], offset)
binary.LittleEndian.PutUint32(buf[0x64:], length)
return buf
}
func (r *imgreader) get_chunk(offset uint32, length uint32) ([]byte) {
head := r.file_header(offset, length)
buf := make([]byte, len(head) + int(length))
copy(buf[0:], head)
r.fp.Seek(int64(offset), 0)
_, err := r.fp.Read(buf[len(head):])
checkError(err)
/* Read might have read less than the number of bytes requested, but
that's okay, IIRC the original implementation has 0/junk-padded
chunk as well after EOF.
Note that the printer does parse the JPEG as it comes in, and
will stop asking for more chunks when it doesn't need more
(skipping thumbnail info at the end or whatever it was?). */
return buf
}
type printer struct {
dev *device
jobs []*imgreader
}
func new_printer() (*printer) {
p := new(printer)
p.jobs = make([]*imgreader, 0, 10)
return p
}
func (p *printer) add_job(job *imgreader) {
p.jobs = append(p.jobs, job)
}
func (p *printer) start() {
p.dev.discover(p.start_job)
p.dev.wait()
}
func (p *printer) start_job() {
fmt.Println("It's a", p.dev.props["DES"])
if len(p.jobs) == 0 {
fmt.Println("Ran out of stuff to do, exiting")
os.Exit(0)
}
job := p.jobs[0]
fmt.Println("Will send", job.fn)
p.dev.start_job(job)
p.jobs = p.jobs[1:]
}
func main() {
printer_mac := flag.String("printer_mac", "", "MAC address of printer")
printer_ip := flag.String("printer_ip", CPNP_ADDR, "IP addres of printer")
border := flag.Bool("border", false, "Allow white borders, don't crop")
flag.Parse()
p := new_printer()
for _, fn := range flag.Args() {
job := new_imgreader(fn)
job.border = *border
p.add_job(job)
}
p.dev = new_device(printer_mac, printer_ip)
p.start()
os.Exit(0)
}
func checkError(err error) {
if err != nil {
_, file, line, _ := runtime.Caller(1)
fmt.Fprintln(os.Stderr, "Fatal error at ", file, "line", line, err.Error())
os.Exit(1)
}
}

127
send-protocol.txt Normal file
View File

@ -0,0 +1,127 @@
This file contains fragments of a traffic dump of a photo print job (just
the TCP portion of it) and some notes as I was reverse-engineering the
reasonably simple protocol.
> 43:50:4e:50:01:20:00:00:00:05:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:05:00:01:00:00:00:40 00:00:01:10:04:04:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01:00:00:00:00:00:00:00:00:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
...
> 43:50:4e:50:01:20:00:00:00:06:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:06:00:01:00:00:00:40 00:00:01:10:04:04:00:00:00:00:00:00:00:00:00:00:00:00:01:00:01:00:00:00:00:00:00:00:98:8f:01:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
0x12 == 01 -> request metatada only?
18F98 = 102296
8F98 = 36760
190 = 400
> 43:50:4e:50:01:21:00:00:00:07:00:01:00:00:00:40 00:00:00:00:40:00:00:00:00:00:00:00:01:00:00:00:00:00:02:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
OR for bordered: :03:
< 43:50:4e:50:81:21:00:00:00:07:00:01:00:00:00:04 00:00:00:40
> 43:50:4e:50:01:20:00:00:00:08:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:08:00:01:00:00:00:40 00:00:01:10:04:04:00:00:00:00:00:00:00:00:00:00:00:00:01:00:01:00:00:00:00:00:00:00:98:8f:01:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
> 43:50:4e:50:01:20:00:00:00:09:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:09:00:01:00:00:00:40 00:00:01:10:04:04:00:00:00:00:00:00:00:00:00:00:00:00:02:00:00:00:00:00:10:00:00:00:01:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
> 43:50:4e:50:01:21:00:00:00:0a:00:01:00:00:00:69 00:00:01:00:69:00:00:00:00:00:00:00:01:00:00:00:00:00:00:00:96:7a:1f:00:20:0a:00:00:98:07:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:10:00:00:00:01:00:00:00:00
:fsize------:xsize------:ysize------: :IMAGE DATA (00 for empty preamble? No, that was in fact at 0x10)
< 43:50:4e:50:81:21:00:00:00:0a:00:01:00:00:00:04 00:00:00:69 bytes received?
> 43:50:4e:50:01:20:00:00:00:0b:00:01:00:00:00:00 (1s delay!)
< 43:50:4e:50:81:20:00:00:00:0b:00:01:00:00:00:40 00:00:01:10:04:04:00:00:00:00:00:00:00:00:00:00:00:00:02:00:00:00:00:00:10:00:00:00:01:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:0c:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:0c:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:0d:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:0d:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
...
> 43:50:4e:50:01:20:00:00:00:1a:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:1a:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:00:00:00:98:8f:01:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
Seems to ask for 1f898 == 102296 bytes of data, coming up next.
> 43:50:4e:50:01:21:00:00:00:1b:00:01:00:00:10:00 00:00:01:00:00:90:01:00:00:00:00:00:01:00:00:00:00:00:00:00:96:7a:1f:00:20:0a:00:00:98:07:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:98:8f:01:00:ff:d8:ff:e1:45:ab:45:78:69:66:00:00:4d:4d:00:2a:00:00:00:08:00:0a:01:12:00:03:00:00:00:01:00:00:00:00:02:13:00:03:00:00:00:01:00:01:00:00:01:1a:00:05:00:00:00:01:00:00:01:8e:01:1b:00:05:00:00:00:01:00:00:01:96:01:28:00:03:00:00:00:01:00:02:00:00:01:32:00:02:00:00:00:14:00:00:01:9e:01:0f:00:02:00:00:00:08:00:00:01:b2:01:10:00:02:00:00:00:0d:00:00:01:ba:87:69:00:04:00:00:00:01:00:00:01:c7:88:25:00:04:00:00:00:01:00:00:05:30:00:00:06:cd:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:48:00:00:00:01:00:00:00:48:00:00:00:01:32:30:31:33:3a:30:35:3a:31:32:20:31:39:3a:32:31:3a:32:30:00:53:61:6d:73:75:6e:67:00:47:61:6c:61:78:79:20:4e:65:78:75:73:00:00:25:90:00:00:07:00:00:00:04:30:32:32:30:a0:00:00:07:00:00:00:04:00:00:00:00:a0:01:00:03:00:00:00:01:00:01:00:00:91:01:00:07:00:00:00:04:01:02:03:00:91:02:00:05:00:00:00:01:00:00:04:79:a0:02:00:04:00:00:00:01:00:00:0a:20:a0:03:00:04:00:00:00:01:00:00:07:98:90:03:00:02:00:00:00:14:00:00:04:81:90:04:00:02:00:00:00:14:00:00:04:95:82:9a:00:05:00:00:00:01:00:00:04:a9:82:9d:00:05:00:00:00:01:00:00:04:b1:88:22:00:03:00:00:00:01:00:03:00:00:88:27:00:03:00:00:00:03:00:00:04:b9:92:01:00:0a:00:00:00:01:00:00:04:bf:92:02:00:05:00:00:00:01:00:00:04:c7:92:03:00:0a:00:00:00:01:00:00:04:cf:92:04:00:0a:00:00:00:01:00:00:04:d7:92:05:00:05:00:00:00:01:00:00:04:df:92:06:00:05:00:00:00:01:00:00:04:e7:92:07:00:03:00:00:00:01:00:04:00:00:92:08:00:03:00:00:00:01:00:01:00:00:92:09:00:03:00:00:00:01:00:10:00:00:92:0a:00:05:00:00:00:01:00:00:04:ef:a2:0b:00:05:00:00:00:01:00:00:04:f7:a2:15:00:05:00:00:00:01:00:00:04:ff:a2:17:00:03:00:00:00:01:00:02:00:00:a3:01:00:07:00:00:00:01:01:00:00:00:a4:01:00:03:00:00:00:01:00:01:00:00:a4:02:00:03:00:00:00:01:00:00:00:00:a4:03:00:03:00:00:00:01:00:00:00:00:a4:04:00:05:00:00:00:01:00:00:05:07:a4:06:00:03:00:00:00:01:00:00:00:00:a4:08:00:03:00:00:00:01:00:00:00:00:a4:09:00:03:00:00:00:01:00:00:00:00:a4:0a:00:03:00:00:00:01:00:00:00:00:a4:0c:00:03:00:00:00:01:00:00:00:00:a4:20:00:02:00:00:00:21:00:00:05:0f:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01:32:30:31:33:3a:30:35:3a:31:32:20:31:39:3a:32:31:3a:32:30:00:32:30:31:33:3a:30:35:3a:31:32:20:31:39:3a:32:31:3a:32:30:00:00:00:1b:84:00:0f:42:40:00:00:01:13:00:00:00:64:00:32:00:00:00:00:00:00:1b:7b:00:00:03:e8:00:00:01:13:00:00:00:64:00:00:00:00:00:00:00:01:00:00:00:00:00:00:00:0a:00:00:01:13:00:00:00:64:00:00:00:00:00:00:00:01:00:00:0d:66:00:00:03:e8:00:00:00:00:00:00:00:01:00:00:00:00:00:00:00:00:00:01:00:00:00:01:00:00:4f:41:45:4c:30:31:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:....
:fsize------:xsize------:ysize------: :IMAGE DATA------....
< 43:50:4e:50:81:21:00:00:00:1b:00:01:00:00:00:04 00:00:10:00 4096 bytes received
> 43:50:4e:50:01:21:00:00:00:1c:00:01:00:00:10:00 cc:b3:cd:ca:bf:91:82:96:a5:a8:a7:b7:bf:c7:80:5a:46:5f:c3:b7:ba:c6:be:c8:d0:bf:cb:af:86:6e:5b:56:b0:ab:b0:bd:b8:a0:b6:93:b2:94:86:4d:3e:32:34:28:2a:35:34:41:b9:c1:a5:b6:b1:b2:c0:c3:c4:91:a8:b8:bc:b7:b5:bb:b4:b0:9f:4e:49:66:3d:38:52:c4:b3:a2:b4:b8:95:be:c8:af:bd:77:9a:b7:9e:aa:a4:a9:b3:ae:a4:ce:95:b7:b3:a7:a0:c0:a8:a4:b6:a4:bb:99:b2:b1:a8:c0:d1:ad:be:ae:a4:cf:9d:ab:af:9a:cc:c1:ac:b6:d4:b0:a6:6e:71:8b:b0:ca:c7:bd:b5:af:9e:8d:81:6c:4f:51:3c:40:21:42:56:a8:d5:b5:c4:a2:bb:c4:c1:be:c0:b2:ac:cb:cc:a9:91:c8:7c:ca:d3:cc:bf:d4:77:51:43:c4:c3:a9:b0:cd:c8:ba:bd:ca:a3:9e:82:6f:5e:7e:c5:98:b3:b5:a6:b5:b5:be:a8:ba:69:44:41:38:2d:2a:34:3c:2b:54:ce:b2:bb:ce:c2:a0:bb:c1:c4:b8:ab:b4:6d:76:96:b1:b6:c0:c0:46:4a:52:34:38:3f:b0:ac:b6:b4:a2:b7:a8:b8:cb:a2:bf:bc:a7:b2:a5:95:ba:b6:ae:a3:a8:bf:ba:c4:b6:9f:c3:c0:ce:ab:b6:b8:af:b7:c3:c1:bd:b0:8f:b5:bb:af:c5:c8:ca:98:a7:98:98:a1:c4:ab:a8:ce:67:52:93:c0:c2:b6:ae:a7:a2:a1:99:93:87:77:6d:6e:5c:22:33:46:63:b9:bd:d0:c1:94:c5:c2:d4:c4:c6:c4:a1:b0:c0:ba:8b:c7:db:c7:b3:bf:b1:65:4d:3e:9e:ca:88:b1:b3:b4:bc:be:c1:ac:8c:a2:6c:58:b9:b7:ae:b7:b3:b0:b3:b1:b6:a9:cb:59:3f:38:33:2b:2a:34:2c:37:b6:b0:c7:a4:c0:c1:ce:c5:ae:c2:c3:b3:c4:b7:a7:b2:bd:bd:b9:c5:4c:4d:4c:6b:31:38:4c:b7:b4:bf:b0:a3:b7:c5:b2:b8:8c:c1:be:b0:c2:bc:b3:a8:9e:b5:a3:79:b3:ae:c4:9d:ba:bd:98:af:b0:bb:aa:c4:c9:b6:b5:b1:ab:c5:c0:b4:cc:c8:9a:a4:74:9d:b7:c9:b5:a2:de:ad:4c:84:a8:c0:ba:ad:ad:aa:a2:9d:98:91:92:8b:7e:71:69:58:3c:55:b4:c5:a5:94:cb:af:b5:b3:b9:cc:bf:c4:90:a2:b2:cd:ab:a4:75:c6:c5:ae:8d:59:48:45:b3:b4:c8:a3:bc:ae:a7:a2:c9:b0:b5:81:67:55:c8:b2:a1:a3:c9:b7:ac:ba:c2:b9:be:5c:43:2f:31:33:31:36:2f:3d:c3:b2:c0:bb:b0:c0:c0:bf:b5:c0:bd:c7:c0:cb:a3:a8:a3:c1:ae:bd:50:4e:4b:50:4d:2f:37:74:83:b3:bb:ac:ab:b9:b3:c4:b9:ac:99:ab:ad:a1:9c:c3:b3:ad:b5:c5:b7:b8:9f:be:c0:9d:9c:b2:c3:a5:ae:be:ce:ae:bb:97:cf:c1:b2:c2:be:c6:d3:89:b8:a3:bb:c7:d0:d3:ca:d1:75:92:ad:b5:b4:ad:b0:ae:9d:98:93:91:93:8b:81:75:69:70:4e:ff:db:00:84:00:0d:09:0a:0b:0a:08:0d:0b:0a:0b:0e:0e:0d:0f:13:20:15:13:12:12:13:27:1c:1e:17:20:2e:29:31:30:2e:29:2d:2c:33:3a:4a:3e:33:36:46:37:2c:2d:40:57:41:46:4c:4e:52:53:52:32:3e:5a:61:5a:50:60:4a:51:52:4f:01:0e:0e:0e:13:11:13:26:15:15:26:4f:35:2d:35:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:4f:ff:c4:01:a2:00:00:01:05:01:01:01:01:01:01:00:00:00:00:00:00:00:00:01:02:03:04:05:06:07:08:09:0a:0b:10:00:02:01:03:03:02:04:03:05:05:04:04:00:00:01:7d:01:02:03:00:04:11:05:12:21:31:41:06:13:51:61:07:22:71:14:32:81:91:a1:08:23:42:b1:c1:15:52:d1:f0:24:33:62:72:82:09:0a:16:17:18:19:1a:25:26:27:28:29:2a:34:35:36:37:38:39:3a:43:44:45:46:47:48:49:4a:53:54:55:56:57:58:59:5a:63:64:65:66:67:68:69:6a:73:74:75:76:77:78:79:7a:83:84:85:86:87:88:89:8a:92:93:94:95:96:97:98:99:9a:a2:a3:a4:a5:a6:a7:a8:a9:aa:b2:b3:b4:b5:b6:b7:b8:b9:ba:c2:c3:c4:c5:c6:c7:c8:c9:ca:d2:d3:d4:d5:d6:d7:d8:d9:da:e1:e2:e3:e4:e5:e6:e7:e8:e9:ea:f1:f2:f3:f4:f5:f6:f7:f8:f9:fa:01:00:03:01:01:01:01:01:01:01:01:01:00:00:00:00:00:00:01:02:03:04:05:06:07:08:09:0a:0b:11:00:02:01:02:04:04:03:04:07:05:04:04:00:01:02:77:00:01:02:03:11:04:05:21:31:06:12:41:51:07:61:71:13:22:32:81:08:14:42:91:a1:b1:c1:09:23:33:52:f0:15:62:72:d1:0a:16:24:34:e1:25:f1:17:18:19:1a:26:27:28:29:2a:35:36:37:38:39:3a:43:44:45:46:47:48:49:4a:53:54:55:56:57:58:59:5a:63:64:65:66:67:68:69:6a:73:74:75:76:77:78:79:7a:82:83:84:85:86:87:88:89:8a:92:93:94:95:96:97:98:99:9a:a2:a3:a4:a5:a6:a7:a8:a9:aa:b2:b3:b4:b5:b6:b7:b8:b9:ba:c2:c3:c4:c5:c6:c7:c8:c9:ca:d2:d3:d4:d5:d6:d7:d8:d9:da:e2:e3:e4:e5:e6:e7:e8:e9:ea:f2:f3:f4:f5:f6:f7:f8:f9:fa:ff:dd:00:04:00:05:ff:c0:00:11:08:00:78:00:a0:03:01:22:00:02:11:01:03:11:01:ff:da:00:0c:03:01:00:02:11:03:11:00:3f:00:d1:d3:6f:57:51:b1:49:c0:1b:9b:87:cf:38:60:46:70:3f:2f:cc:55:cc:ba:c8:df:2e:d5:51:b8:12:7a:8a:e4:f4:2b:c1:67:a8:ec:94:e2:2b:9f:94:93:d9:bb:7e:7f:d7:da:ba:d8:b2:63:2a:ce:5b:23:20:83:c1:a0:27:1e:56:2a:71:85:6c:64:1c:f1:d3:af:f9:e2:94:b0:ca:85:e7:3d:c1:eb:eb:fe:7d:ea:30:49:2b:95:4c:70:30:3a:8f:6f:5f:d2:9c:a4:08:ca:84:f9:57:ee:a9:1f:a0:38:a0:91:ca:db:55:08:0c:46:32:4b:71:9e:3d:4d:39:37:aa:8c:11:b8:8c:f4:c6:00:1d:3e:be:d4:6e:5c:95:da:18:03:8e:bf:e7:9a:76:e0:1f:fd:5e:59:7a:e0:fe:18:cf:e7:40:08:8b:b4:3e:07:2e:72:46:4e:0f:6f:fe:b5:2b:c9:0c:4c:4e:55:70:30:18:90:31:d7:fa:66:9a:f2:05:9f:ca:08:c7:39:23:6f:7c:f4:e7:b7:ff:00:ae:b3:f5:68:1e:73:05:99:2e:b1:cc:58:9c:00:31:....
raw file data
< 43:50:4e:50:81:21:00:00:00:1c:00:01:00:00:00:04 00:00:10:00 4096 bytes received
> 43:50:4e:50:01:20:00:00:00:34:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:34:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:00:00:00:98:8f:01:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:35:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:35:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:98:8f:01:00:98:8f:01:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:21:00:00:00:36:00:01:00:00:10:00 00:00:01:00:00:90:01:00:00:00:00:00:01:00:00:00:00:00:00:00:96:7a:1f:00:20:0a:00:00:98:07:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:98:8f:01:00:98:8f:01:00:5e:f9:27:bd:66:4b:e3:7d:53:c4:76:f1:2d:ad:94:10:22:b1:0f:6f:2a:12:07:6c:83:fd:71:50:4f:e1:eb:6b:8b:84:8e:5d:3e:f1:a3:94:1d:f2:c0:09:54:23:b9:39:e8:68:b1:2f:63:a5:b6:d7:35:1d:6c:9b:fd:3a:e2:d2:ec:8c:6f:08:98:39:f6:e6:a0:bf:d0:74:ed:53:50:96:ff:00:57:f0:7c:37:1a:84:30:fc:91:33:6d:3b:7b:e7:b7:e7:58:37:be:12:86:d7:ca:30:5e:35:99:04:16:91:58:82:c3:eb:9a:e8:13:5e:5b:2f:92:e3:79:9d:62:02:49:c9:f9:88:f5:fa:51:76:16:6c:e2:3c:4a:9e:37:d2:b4:d1:26:87:f0:54:3d:bb:4d:93:e4:cf:1c:8a:e3:e9:9f:5f:6e:2b:95:8b:f6:68:d5:7e:23:c6:ba:b7:8f:fe:18:69:a2:66:b9:2f:6b:69:a8:4f:b5:91:ba:86:27:23:f2:3e:95:ec:5a:6f:8d:bf:b3:95:e7:81:66:bb:91:80:09:0a:b8:0a:17:bf:24:e0:55:af:f8:4a:21:ba:84:4d:26:8e:61:dc:72:b1:95:07:04:1f:6c:f3:ef:59:b4:d9:49:24:7f:ff:d7:fa:17:c2:ff:00:b3:f7:c4:fb:6b:b9:2f:75:8f:17:d9:5a:85:6f:2a:c7:4f:b0:07:30:27:a7:a6:07:4f:d6:bb:4d:37:c1:1e:27:d1:f4:23:a3:f8:87:c6:fa:86:e7:94:b3:c1:14:01:94:af:b3:e3:3f:ca:ae:5d:5f:5d:dd:42:e2:cb:51:96:16:91:f6:85:8c:00:db:89:f7:fe:b5:7e:ce:e3:5d:92:51:6d:a8:5e:dc:90:80:00:f2:4a:ac:99:fe:95:92:56:3c:b3:cc:3c:51:f0:3b:c1:1e:34:bd:7b:59:7c:55:af:5c:45:74:31:73:61:77:ab:32:23:0f:4c:54:be:19:f8:25:a6:fc:2d:d5:16:ff:00:e1:b7:85:62:b1:90:47:b6:55:17:85:9a:75:c6:36:e4:f2:2b:d4:93:49:b4:5b:b9:2f:b5:28:39:45:c8:99:98:1c:1f:4c:7f:5a:96:2f:14:e8:33:dc:25:9d:95:cc:32:19:13:e6:81:67:00:fd:71:54:c0:c1:d3:2d:fc:43:a9:ab:0f:11:78:65:ec:92:33:85:dd:70:25:0f:f5:c5:4f:71:a6:a5:94:2f:3d:9f:85:24:d4:1a:33:f2:c3:16:37:01:9e:d9:eb:f9:d5:fd:7b:4f:d1:af:61:37:37:da:95:c4:31:ab:0f:dc:a8:60:b9:f5:e3:91:f5:e2:a4:f0:4f:88:be:1a:22:cd:a7:0f:12:47:61:34:24:a3:2d:d4:ec:ec:e3:d4:67:eb:d7:34:f9:58:1c:3f:88:2e:3e:3f:ea:17:11:db:fc:2e:f8:51:a7:d9:db:e7:7c:97:fa:bd:ca:f5:ee:a1:33:d0:7e:75:a5:e1:df:17:dc:4b:ab:8d:0f:e2:8e:9f:a5:0b:f6:88:6c:8b:4e:93:72:c8:47:5c:fa:1f:6a:ed:e1:f0:97:c3:bf:1a:5a:35:9d:e7:8c:f5:2b:bb:78:e5:db:25:9d:a5:c7:96:1c:67:83:90:41:c7:b8:ab:96:3e:17:f8:73:e0:b4:68:fc:33:e0:9d:ec:80:95:69:6e:4b:33:9e:e4:b3:64:fe:27:34:72:a2:1b:6d:9c:34:da:5e:87:7d:34:b0:69:fe:01:8d:66:04:05:12:03:21:c7:be:3a:71:57:b4:8f:06:68:fa:2c:ed:a8:6a:3e:15:86:40:39:70:f3:31:da:de:81:4e:45:76:a7:e2:2c:16:88:f6:76:9a:79:82:73:6a:18:24:30:2b:f9:7d:ba:9f:e7:58:70:78:8b:e2:74:d2:5f:1d:63:c5:f6:e2:d8:2f:fa:35:b4:7a:76:0a:af:a9:c9:ce:71:c7:1c:71:f8:50:96:a3:51:33:6f:2f:9f:4f:bc:b7:d3:f4:7f:0c:47:69:6f:2c:a0:a1:8d:37:73:eb:e9:8f:6a:b9:a8:b6:93:63:67:24:de:2b:b9:81:62:8c:6f:65:59:00:3f:80:1f:ca:b9:eb:fd:5f:5d:b6:b8:78:67:f1:dd:e4:8e:c3:31:93:00:c4:40:f6:38:1d:3e:b5:9b:3e:9d:3e:b1:7d:1d:b4:c2:0b:f9:43:ae:65:ba:bc:11:22:7f:b5:86:1c:fd:29:49:2b:94:7f:ff:d0:fb:5f:43:f8:83:e1:d8:b3:17:86:34:54:fb:38:52:4c:f2:c4:77:97:f4:e7:91:56:64:f1:08:bb:b7:dc:ea:a8:c1:09:78:c4:99:65:38:e2:b2:b4:cf:87:5a:94:8c:eb:fd:a3:1c:6c:65:c7:98:b9:2b:9f:5e:0e:0f:d2:ba:4d:3b:c0:7a:75:bb:49:15:d5:e8:33:10:04:8c:80:02:df:53:51:66:8f:3a:da:1c:7b:f8:80:34:13:dd:c5:32:c8:d0:49:ca:46:72:47:d4:7e:15:cf:f8:83:e2:52:68:f6:50:eb:5e:28:59:da:06:24:09:6c:6c:9d:fa:fb:28:39:af:53:bc:f0:ce:8d:6f:1b:47:65:a1:c2:82:56:c3:14:84:00:4f:7c:d5:1d:b6:fa:3a:a8:b8:ba:b6:83:63:8d:a2:38:d5:00:23:e9:42:6c:4d:33:86:d3:7c:33:37:8f:34:68:75:5d:0e:1b:a8:6d:d8:16:b7:92:fe:d1:a1:60:d8:c6:4a:9e:4f:5a:c6:ba:f8:11:af:25:f3:c1:2f:89:a1:91:08:cb:38:85:82:ee:3d:57:8e:71:ef:5e:83:e2:6f:8a:3e:26:b7:b4:93:ec:9a:3a:5d:32:82:63:8e:37:03:71:c7:07:24:e2:b1:db:e2:95:fb:69:46:6d:4a:da:1b:32:f6:fb:2e:61:55:0c:db:58:60:e5:ba:83:49:ee:09:58:c3:f0:67:c1:5d:27:c2:ba:74:d1:49:26:98:9a:a5:cc:98:bc:b8:b6:83:6c:4d:1f:3c:29:fb:d9:c6:3e:a6:ba:7d:0e:1d:6a:fa:49:34:7f:ec:9d:4e:c0:59:8c:59:6a:0a:db:a0:94:e3:01:b8:3c:63:ae:0d:65:5b:da:68:b2:b0:77:b9:75:7c:1f:df:25:c1:0b:1a:f5:da:79:c7:1e:f5:83:f1:2b:f6:97:d2:fe:19:ea:b6:5e:0a:f0:9f:85:35:6f:15:eb:17:d6:cd:24:1a:7e:95:68:f2:17:60:3e:45:dc:38:00:9f:e2:3c:01:40:34:92:3a:7d:73:e0:55:ed:8f:87:53:5d:f1:a6:ab:7b:e2:dd:48:5e:89:e2:82:52:e9:14:6b:ec:32:00:18:ac:db:5d:3f:c5:9a:45:c4:b7:1f:0d:3e:19:68:f6:57:72:a6:56:f9:ef:91:e5:41:d5:86:cd:dc:7d:6b:c7:af:fe:16:ff:00:c1:41:7f:69:bf:26:4f:8b:de:26:b6:f8:7f:e1:99:26:22:4d:26:d6:4d:b7
:fsize------:xsize------:ysize------: :IMAGE DATA------....
> 43:50:4e:50:01:20:00:00:00:4f:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:4f:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:98:8f:01:00:98:8f:01:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:50:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:50:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:30:1f:03:00:d0:a0:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
A0D0 = 41168
2*18F98+A0D0 = 3C000 = 245760
> 43:50:4e:50:01:21:00:00:00:51:00:01:00:00:10:00 00:00:01:00:38:a1:00:00:00:00:00:00:01:00:00:00:00:00:00:00:96:7a:1f:00:20:0a:00:00:98:07:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:30:1f:03:00:d0:a0:00:00:71:73:6a:6e:09:79:99:40:09:b4:67:03:db:9c:57:a2:78:8f:c1:66:f7:4b:4b:7f:0d:c1:6d:60:11:94:49:31:5f:99:f1:f4:ef:f5:a6:e9:5f:0f:f5:69:25:6d:3e:ee:53:32:c2:07:9d:3d:dc:40:09:47:55:c7:e3:c6:68:b2:64:34:d1:e5:57:9f:1f:7c:45:e1:1b:6b:9b:ef:15:de:bc:f6:e2:45:db:1c:76:6c:f2:05:03:9e:4f:19:fd:2b:57:c3:1f:1d:34:ef:89:da:12:5d:7f:c2:27:7b:3d:9f:98:42:41:75:1b:43:31:5e:dd:38:ae:f7:56:f0:ff:00:82:74:90:a9:a8:d9:d9:bc:82:4f:9a:09:57:cc:19:ea:46:3d:2a:9f:87:3c:49:e1:dd:5a:06:8d:ec:62:d2:7c:a9:8a:47:10:0a:06:3b:67:d2:93:d0:49:d8:8b:c3:f3:f8:41:15:63:ff:00:84:3a:7d:3e:72:db:9c:b9:20:f3:d3:be:7f:1a:dd:d1:7c:63:e0:bd:4e:fe:f7:49:d3:58:e9:d7:76:31:a9:92:46:b7:c0:98:fa:83:fc:5f:fd:7a:e6:7c:67:a4:f8:83:53:95:61:b1:f1:4d:ad:b4:cc:41:12:ce:ea:09:51:d8:55:8b:4f:02:6b:73:e9:a3:fb:4e:78:4b:ef:53:ba:06:25:9b:1d:f3:49:34:c2:ec:ff:d4:fd:0c:d5:35:a8:ca:c3:25:cd:ed:d3:c6:e7:00:41:6d:9c:af:d7:a0:c5:61:f8:b3:c7:be:11:f0:6c:51:5e:5c:47:7f:77:20:73:8b:68:50:34:99:f6:39:02:b9:7f:19:f8:0b:c4:17:56:0b:65:6f:f1:4a:f3:4d:85:cb:35:cb:ab:12:0a:f4:f2:eb:02:7f:04:ea:5a:85:9c:7a:19:d6:a1:bb:92:18:8a:c3:70:4b:a9:43:eb:cf:e1:45:9b:38:13:3a:cd:63:e3:c7:82:64:55:86:78:35:09:5a:50:32:d2:a1:55:8c:11:c8:62:0d:73:32:dd:d8:6a:d7:22:f3:c3:10:c7:6f:9f:94:ca:91:ed:3f:fd:7f:ad:55:b2:f8:59:a9:69:cc:d2:f8:bb:c4:b0:cb:1a:02:c9:6d:69:01:32:48:3d:0d:5c:d2:35:e7:b5:bf:48:bc:39:e1:d7:84:c1:20:dd:2d:d4:05:8b:0f:4f:61:43:d0:a4:d3:3a:cd:03:48:d7:ef:20:80:d8:4b:23:3a:4a:a8:ed:2b:b1:1b:40:19:cf:bd:6b:f8:97:c2:df:db:88:96:3e:20:bb:79:de:33:86:86:36:21:47:6c:8a:c9:97:c6:de:24:bd:bc:8a:c2:4b:5f:2e:d6:6f:90:49:02:95:20:9e:fc:71:5a:b1:6a:91:4e:ed:04:cc:ed:32:c6:01:32:12:5d:80:e8:69:27:72:1d:ae:62:78:9b:5b:8f:45:85:62:8b:40:57:86:24:00:bb:83:b9:5b:b7:bf:35:9b:a2:f8:c2:c6:ee:72:75:ab:5b:4b:62:47:c8:09:ce:07:be:7b:d7:75:6d:34:3a:8e:9b:25:b6:a7:a4:c5:23:32:9d:92:3c:7f:32:8e:df:5a:c3:d3:fe:1e:68:72:5e:13:0c:30:c7:29:c3:3b:b4:65:b9:27:a7:3c:0a:63:49:16:b4:e8:74:2d:18:cb:79:60:a8:64:61:be:55:86:10:4f:d3:af:5c:55:99:2f:16:5d:3a:4b:cf:ec:94:8a:25:50:51:ee:70:ac:e3:fa:53:e1:d1:b4:e8:27:7d:3e:7f:10:69:76:d2:c6:43:4a:12:65:69:9b:1d:b6:e6:a1:bf:f0:1f:85:f5:eb:84:6d:6b:5a:bb:b9:80:75:c3:ed:0a:7a:f0:3f:2a:4d:d8:69:ea:72:1e:26:f8:ab:a5:59:44:34:d4:d3:f4:a8:a4:98:6e:8a:d6:e2:db:cc:2d:ee:72:31:54:34:6f:10:49:6b:62:ee:7c:39:0b:c6:41:66:75:5c:f1:e9:c5:76:c9:f0:fb:e1:82:19:62:36:d3:5e:b0:27:2d:34:81:9f:e9:f4:a7:5a:58:45:a5:bc:50:68:7a:5c:10:c7:b0:a3:a9:4c:f1:db:af:7a:49:b6:c7:b1:ff:d5:fb:97:c0:9a:e3:dc:18:ae:a3:d1:ad:e3:cc:63:cb:89:6d:f1:b7:9e:bf:5a:de:b8:d2:2f:75:25:9a:fd:b5:ab:db:39:8a:82:91:45:39:d8:84:9c:74:e8:4e:39:aa:32:0d:69:59:62:84:2a:b2:8f:dd:ac:6a:38:fc:aa:9d:ca:78:f4:33:d9:da:ea:16:d2:5c:3c:ca:4f:da:46:d5:44:eb:db:be:3f:9d:07:16:88:b1:ab:e8:9a:b4:11:1b:eb:3d:4a:f7:51:ba:62:04:56:de:62:c4:a0:0f:f6:ab:1d:b4:2d:42:da:e3:fb:7b:c4:9a:24:32:dc:45:85:81:e6:93:2c:a8:4f:dc:e3:86:c7:ad:6e:b6:91:e3:19:6d:8c:d0:69:d7:20:b3:7c:9b:d3:72:83:eb:f4:a9:63:f0:8d:ed:b4:e7:57:f1:45:dc:cc:a9:b5:d6:27:3b:92:32:3b:80:39:a0:13:b9:cf:ea:cf:75:ae:19:34:c9:b4:d1:37:9a:80:2c:76:f1:15:db:ef:c5:64:c1:f0:fa:cd:ee:66:b6:b8:f0:dd:bb:dc:e7:21:59:32:ea:bd:bd:c5:7a:36:97:ad:69:1a:ac:ad:16:99:ae:4b:14:8a:df:3e:2c:ca:ef:1e:9c:ff:00:3a:b1:e2:1d:43:55:d1:9a:2b:cd:39:95:72:37:5c:31:8b:74:92:a8:fe:10:69:3b:03:57:3c:c6:2f:87:1f:10:b5:1d:59:62:b1:d3:a4:7b:65:5d:a6:45:9f:02:25:e9:c7:ad:6e:f8:63:c0:7e:18:f8:75:a8:dd:6b:ba:95:85:af:89:75:05:8c:16:57:b8:57:92:dd:4e:32:31:8c:fb:66:ba:6d:9a:cc:f6:44:dd:09:ad:23:95:7e:47:82:4e:57:3e:84:71:59:da:5f:80:bc:13:06:b1:ff:00:09:15:e6:a8:d6:b7:21:8f:98:ea:c0:34:bf:ef:12:79:f5:a1:d9:21:92:5b:b6:a3:e3:18:2e:6d:ac:fe:1d:26:8b:66:ee:51:e4:32:85:91:78:e1:c6:3f:3c:e6:bc:af:e3:0f:ec:89:e2:7d:5e:38:75:f9:3e:23:db:ea:f2:5a:b1:fb:15:ad:ed:8b:34:a3:bf:2e:a7:f5:ae:eb:c6:7f:b4:5f:84:be:1d:78:9d:f4:af:1c:eb:16:7a:76:8f:73:09:5b:1d:4e:79:4a:ef:9b:b8:7e:ca:b8:ef:5c:ee:97:fb:42:68:1a:cc:7f:68:f0:5f:88:d3:54:96:6b:a3:1c:72:40:fe:6c:28:3a:63:23:b7:bd:44:a4:85:6b:33:c2:3c:75:f0:df:f6:c1:ba:b5:8a:c6:cb:4f:96:0b:04:81:96:37:f0:ed:d3:09:14:8e:f9:eb:f8:55:af:80
:fsize------:xsize------:ysize------: :IMAGE DATA------....
...
> 43:50:4e:50:01:21:00:00:00:5b:00:01:00:00:01:38 f3:8b:bb:9e:a0:1c:f4:fa:53:35:dd:57:43:f0:17:80:a3:d7:2f:74:29:ad:af:8c:84:58:e9:56:d1:79:92:bc:99:e0:ed:c7:03:be:71:5d:4f:8d:bc:17:e1:bd:37:c1:cd:22:6b:37:77:32:29:8f:11:24:8c:a4:a8:ef:9e:b5:bd:a2:e8:5a:66:8d:e0:58:bc:4d:3d:ab:7d:b8:c7:88:9a:e0:ef:6d:c4:7c:a3:d7:ad:34:c1:d8:f0:8f:0e:cb:fb:5a:f8:f6:e0:eb:26:4d:3e:c2:dd:9c:08:ec:a5:b6:0c:24:4f:42:18:fc:a7:1d:71:8a:f6:bf:08:f8:67:c5:9a:70:8e:63:a7:68:49:79:34:01:a4:7b:7b:63:18:2f:db:27:27:9a:bd:a8:f8:85:bc:0f:e1:23:e2:bf:88:66:18:20:45:44:30:d9:c7:99:24:99:b8:08:ab:ea:4d:41:6f:e3:1d:4f:54:85:66:f0:fc:30:69:b2:05:3b:a0:9a:df:7b:e7:1d:09:f5:f5:15:69:a6:89:2d:58:7c:3b:f1:15:ec:82:fb:5b:d5:12:e2:48:59:b2:60:3b:43:13:db:1c:70:3b:55:0f:10:5b:69:fa:24:d1:e9:17:4e:c9:2b:36:13:24:92:c7:19:c5:60:78:bf:c5:7f:10:34:1d:42:ca:0d:5f:e2:f5:86:90:75:05:91:ad:ed:85:b6:df:91:06:5d:b3:d0:11:9a:e5:b4:7f:8e:9e:11:d4:ad:ef:af:74:9d:7c:78:ae:e6:cd:5a:66:91:33:19:9b:1d:95:98:73:cf:a5:26:ac:c6:ae:d1
< 43:50:4e:50:81:21:00:00:00:5b:00:01:00:00:00:04 00:00:01:38
> 43:50:4e:50:01:20:00:00:00:5c:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:5c:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:30:1f:03:00:d0:a0:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:5d:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:5d:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
...
> 43:50:4e:50:01:20:00:00:00:5f:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:5f:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:00:00:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
REWINDS?
> 43:50:4e:50:01:21:00:00:00:60:00:01:00:00:10:00 00:00:01:00:68:80:00:00:00:00:00:00:01:00:00:00:00:00:00:00:96:7a:1f:00:20:0a:00:00:98:07:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:80:00:00:ff:d8:ff:e1:45:ab:45:78:69:66:00:00:4d:4d:00:2a:00:00:00:08:00:0a:01:12:00:03:00:00:00:01:00:00:00:00:02:13:00:03:00:00:00:01:00:01:00:00:01:1a:00:05:00:00:00:01:00:00:01:8e:01:1b:00:05:00:00:00:01:00:00:01:96:01:28:00:03:00:00:00:01:00:02:00:00:01:32:00:02:00:00:00:14:00:00:01:9e:01:0f:00:02:00:00:00:08:00:00:01:b2:01:10:00:02:00:00:00:0d:00:00:01:ba:87:69:00:04:00:00:00:01:00:00:01:c7:88:25:00:04:00:00:00:01:00:00:05:30:00:00:06:cd:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:48:00:00:00:01:00:00:00:48:00:00:00:01:32:30:31:33:3a:30:35:3a:31:32:20:31:39:3a:32:31:3a:32:30:00:53:61:6d:73:75:6e:67:00:47:61:6c:61:78:79:20:4e:65:78:75:73:00:00:25:90:00:00:07:00:00:00:04:30:32:32:30:a0:00:00:07:00:00:00:04:00:00:00:00:a0:01:00:03:00:00:00:01:00:01:00:00:91:01:00:07:00:00:00:04:01:02:03:00:91:02:00:05:00:00:00:01:00:00:04:79:a0:02:00:04:00:00:00:01:00:00:0a:20:a0:03:00:04:00:00:00:01:00:00:07:98:90:03:00:02:00:00:00:14:00:00:04:81:90:04:00:02:00:00:00:14:00:00:04:95:82:9a:00:05:00:00:00:01:00:00:04:a9:82:9d:00:05:00:00:00:01:00:00:04:b1:88:22:00:03:00:00:00:01:00:03:00:00:88:27:00:03:00:00:00:03:00:00:04:b9:92:01:00:0a:00:00:00:01:00:00:04:bf:92:02:00:05:00:00:00:01:00:00:04:c7:92:03:00:0a:00:00:00:01:00:00:04:cf:92:04:00:0a:00:00:00:01:00:00:04:d7:92:05:00:05:00:00:00:01:00:00:04:df:92:06:00:05:00:00:00:01:00:00:04:e7:92:07:00:03:00:00:00:01:00:04:00:00:92:08:00:03:00:00:00:01:00:01:00:00:92:09:00:03:00:00:00:01:00:10:00:00:92:0a:00:05:00:00:00:01:00:00:04:ef:a2:0b:00:05:00:00:00:01:00:00:04:f7:a2:15:00:05:00:00:00:01:00:00:04:ff:a2:17:00:03:00:00:00:01:00:02:00:00:a3:01:00:07:00:00:00:01:01:00:00:00:a4:01:00:03:00:00:00:01:00:01:00:00:a4:02:00:03:00:00:00:01:00:00:00:00:a4:03:00:03:00:00:00:01:00:00:00:00:a4:04:00:05:00:00:00:01:00:00:05:07:a4:06:00:03:00:00:00:01:00:00:00:00:a4:08:00:03:00:00:00:01:00:00:00:00:a4:09:00:03:00:00:00:01:00:00:00:00:a4:0a:00:03:00:00:00:01:00:00:00:00:a4:0c:00:03:00:00:00:01:00:00:00:00:a4:20:00:02:00:00:00:21:00:00:05:0f:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01:32:30:31:33:3a:30:35:3a:31:32:20:31:39:3a:32:31:3a:32:30:00:32:30:31:33:3a:30:35:3a:31:32:20:31:39:3a:32:31:3a:32:30:00:00:00:1b:84:00:0f:42:40:00:00:01:13:00:00:00:64:00:32:00:00:00:00:00:00:1b:7b:00:00:03:e8:00:00:01:13:00:00:00:64:00:00:00:00:00:00:00:01:00:00:00:00:00:00:00:0a:00:00:01:13:00:00:00:64:00:00:00:00:00:00:00:01:00:00:0d:66:00:00:03:e8:00:00:00:00:00:00:00:01:00:00:00:00:00:00:00:00:00:01:00:00:00:01:00:00:4f:41:45:4c:30:31:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
< 43:50:4e:50:81:21:00:00:00:60:00:01:00:00:00:04 00:00:10:00
...
> 43:50:4e:50:01:21:00:00:00:67:00:01:00:00:10:00 bc:3d:35:84:73:2c:5a:80:89:d1:13:05:dc:7a:0a:e2:93:c6:1e:05:f0:55:c4:b7:b7:be:0d:f1:0e:a3:2c:16:c5:32:b6:26:25:0a:39:c6:5b:a8:e3:a8:ab:9a:67:8e:34:bf:1e:78:3a:ff:00:51:f0:c6:b9:fd:91:3a:c6:5a:e8:5d:41:be:58:53:fe:79:81:d0:13:83:cf:e5:57:1d:10:ac:ce:8e:d3:c7:3f:0f:bc:4f:13:5e:e9:2b:6d:34:71:bb:46:59:13:8c:83:c9:a4:b9:d2:fc:37:a0:c5:2d:f8:d2:56:4f:b4:b0:da:d1:a7:fa:c6:23:a5:71:de:16:f8:71:e1:8d:17:c2:f6:f6:fa:3a:df:6a:72:5b:40:0f:95:6b:70:a8:81:4f:39:cf:7a:d7:f0:e5:fd:a5:fe:a9:f6:fd:53:c1:17:42:2b:40:14:3c:ba:af:c8:84:77:c7:f8:52:6f:51:24:d9:ab:7b:61:e0:cd:6a:68:ed:75:6b:8b:6b:09:27:4d:d1:0d:db:24:f4:c0:3e:d4:ba:3b:dc:f8:67:5c:1a:75:9e:fb:8b:48:9f:09:79:a8:dd:28:40:72:79:fa:13:cf:d3:14:dd:53:5e:f8:49:e2:eb:58:e1:d5:c4:31:9b:70:c0:c7:24:64:95:19:e8:09:5e:47:7c:d7:01:e2:0f:00:78:63:56:b0:d5:13:5c:8e:e5:2d:2d:4b:36:9f:71:14:fc:ce:ab:ca:f0:a7:f0:c6:3d:0d:36:db:40:95:cd:3b:6f:82:ba:e4:bf:12:35:4f:12:6a:f7:af:7b:7b:79:3b:dc:80:67:49:03:a1:ce:14:1e:cb:83:c0:ed:5b:8d:a7:78:8f:4c:b4:11:d9:78:25:84:e6:41:bd:5b:52:42:c5:7f:90:18:ac:7f:07:fc:33:d3:75:3b:cb:0b:c8:75:3b:9b:7d:f6:c4:4a:60:d4:0b:80:be:a4:75:cf:b1:ae:e3:43:d3:3c:25:61:23:5c:5b:6a:52:c9:0c:23:69:b9:95:4b:7c:dd:3d:3d:6a:1b:48:a4:ae:8e:5b:45:d4:35:7d:67:c7:c7:46:d2:7c:03:26:9e:be:48:6b:cb:db:99:d4:89:4f:a2:e3:af:15:ab:ac:78:56:c7:54:18:d3:e1:54:95:41:13:99:0f:11:b0:fe:31:eb:50:4f:a5:7c:15:b7:d7:6e:46:b5:a8:6b:31:ef:52:f3:5f:09:5d:63:dc:7b:0c:74:c5:61:5b:c9:e1:df:0d:43:73:a2:f8:43:5c:d5:6e:e0:96:41:e5:cf:73:7c:25:79:01:e3:e5:1d:40:e3:a5:5c:6c:26:9a:67:ff:d0:fb:db:4c:d3:fc:2f:e0:dd:33:51:d6:bc:61:aa:41:7b:6d:13:19:65:22:dc:91:12:ed:e7:8e:ff:00:41:54:f5:7f:8a:9f:04:34:8f:08:b7:8a:75:13:7f:69:a5:48:fb:61:b8:8a:d9:d8:33:9f:45:eb:fa:52:eb:7a:c6:81:a5:f8:51:74:0d:7b:5f:4b:49:a7:28:e7:2b:ba:48:57:dd:7d:31:9c:e7:d4:d6:87:80:bc:53:f0:fa:db:55:78:f4:2b:68:75:59:90:22:87:69:43:28:1d:db:69:18:1f:4a:e5:93:b1:cc:95:8e:49:be:32:fc:3e:8b:c1:b2:eb:de:11:9c:25:dc:a4:2d:9c:ba:bd:9b:ee:90:67:ef:6d:c7:4a:bd:f0:4f:53:f1:cf:c5:3d:7a:e2:f2:fa:e6:d9:6d:91:b7:48:63:b5:75:56:20:71:f3:30:1f:90:af:44:9b:e2:ab:9d:45:b4:e8:3c:25:00:db:21:08:f0:c1:1a:9d:de:83:8c:e3:1e:ff:00:85:5b:b3:f1:6e:b5:7f:11:8e:e3:45:78:63:07:1b:63:61:84:f7:ec:7f:4a:49:d9:8d:ab:15:6f:6d:1e:c6:63:69:1d:aa:cc:e1:72:cd:b7:86:19:ae:37:c6:d7:f6:f7:3a:94:49:a9:eb:8d:14:b2:39:48:6d:a0:b6:c2:e7:d2:bd:1c:bd:ea:ba:cf:f6:98:20:01:30:8b:22:64:b1:fa:f5:ac:5d:57:c1:b1:78:8f:59:86:f7:5c:ba:8d:d6:d8:ef:8b:c8:38:1c:fe:15:77:42:6a:c5:2f:0d:78:28:59:40:b7:d6:7a:b3:dc:19:46:63:67:b7:c0:43:f4:eb:58:de:21:f8:15:f0:ef:ed:d2:6b:17:d2:b4:3a:a4:ac:65:92:ee:d5:8c:6b:bb:be:e1:df:35:dd:ea:ba:ed:8e:81:6a:f3:47:15:c4:c9:1c:44:46:21:80:bb:7e:42:bc:dc:7c:58:4d:67:e2:2d:b6:93:e3:3d:03:51:b7:d1:ef:53:cb:6b:89:b4:c7:40:ad:8e:ae:48:e1:7f:0a:57:40:f5:32:f4:cf:0d:7c:3f:f0:a5:f4:1a:c4:9e:23:b5:d4:2e:ed:e7:76:96:58:89:0e:3a:fc:b8:1c:74:c8:af:46:f0:e7:8b:34:ed:7e:15:4d:12:22:91:9c:33:19:63:23:ad:55:b7:d7:fe:13:d9:f8:82:e6:d3:c3:9e:12:8a:7f:b1:a2:13:76:d0:2a:c4:58:8e:83:bb:0c:7b:62:b9:cf:17:fc:6f:f1:6e:b5:e3:04:d0:bc:27:a4:d8:d8:e8:71:58:e2:e1:a1:b3:1b:a5:98:f7:0d:d0:28:1f:ae:6b:2a:93:49:1a:d3:8d:cc:7f:89:5f:1f:b4:4d:03:54:d5:34:34:b3:96:7b:9b:7b:69:22:b6:b8:27:11:39:2b:eb:ec:4f:38:ef:5f:17:7c:4f:d6:22:b7:8a:79:04:84:b1:8d:89:02:4c:80:c7:ff:00:af:5f:46:7e:d4:1a:4d:86:9f:e1:5d:27:c6:33:4a:19:52:76:82:20:84:00:73:d4:fb:e3:1f:ad:7c:a1:f1:0f:58:d3:af:ae:65:b5:49:a2:5d:b2:15:98:b3:80:47:b7:d2:b8:dc:ae:cf:d0:72:5a:2a:38:74:cf:ff:d1:f1:1f:17:ea:6b:72:72:91:b2:b2:93:b9:b7:75:ae:1b:58:d4:58:29:22:5c:82:a7:62:86:ef:5d:9f:89:12:18:52:47:12:06:05:cb:70:3f:87:d6:b8:2d:7d:23:da:84:c6:54:23:16:57:2b:d3:3c:57:97:17:a1:fa:da:8a:48:e7:2e:af:a6:46:91:b7:02:d2:1f:9b:71:e7:38:ac:5b:e2:f3:b0:11:48:a1:50:62:45:db:8c:7d:2b:66:f2:dd:5e:67:88:43:f7:06:41:eb:c6:3a:d6:45:d9:d8:c5:4a:60:67:96:00:73:4a:4f:43:19:d9:23:32:3b:5f:26:e5:d8:29:2c:e4:03:ce:72:2b:ed:ef:f8:22:df:c1:ab:ff:00:1a:fc:71:d7:3e:2e:4b:14:42:c3:c3:da:64:96:c2:4b:88:b7:29:9e:41:80:17:df:05:bf:c8:af:8a:b7:03:1b:cd:0a:1d:d1:a9:da:58:f3:9a:fd:71:ff:00:82:46:7c:28:83:e1:a7:ec:9a:7c:52:75:30:66:f1:4e:ab:f6:d3:19:88:8f:95:57:68:3f:98:6f:c2:8a:6a:ec:f0:33:aa:ca:96:0e:4b:be:87:be:ea:7e:08:96:ff:00:53:b7:bb:7d:56:78:66:81:58:44:89:70:51:09:3d:f6:f4:6a:c4:f1:0f:c3:bf:16:6b:36:7f:60:8f:c4:17:13:ab:b0:69:f7:c9:8d:80:1f:d4:67:b5:77:c9:a3:41:ae:c4:75:19:ee:59:24:85:57:ca:05:7a:e7:27:f9
< 43:50:4e:50:81:21:00:00:00:67:00:01:00:00:00:04 00:00:10:00
> 43:50:4e:50:01:21:00:00:00:68:00:01:00:00:00:68 db:31:f5:15:4b:78:8c:ae:06:e0:7e:62:4f:24:93:55:e3:8c:47:13:4c:b2:b3:6e:70:0a:b1:cb:7f:fa:aa:69:2d:c5:c0:2c:43:15:0d:92:1b:90:4d:16:e8:16:51:87:c8:67:da:58:8c:0c:fa:56:32:6d:1a:46:29:22:39:51:ae:55:5a:40:84:20:25:78:e7:9a:89:55:34:e8:23:88:46:66:db:21:2a:a4:e3:03:d7:f0:ad:05:89:5a:e1:95:5b:2a:1b:1d:7a:d5:7d:5e
< 43:50:4e:50:81:21:00:00:00:68:00:01:00:00:00:04 00:00:00:68
> 43:50:4e:50:01:20:00:00:00:69:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:69:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:00:00:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:6a:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:6a:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:80:00:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:21:00:00:00:6b:00:01:00:00:10:00 00:00:01:00:68:80:00:00:00:00:00:00:01:00:00:00:00:00:00:00:96:7a:1f:00:20:0a:00:00:98:07:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:80:00:00:00:80:00:00:d4:86:4b:89:76:a8:18:8e:16:66:00:b1:c9:e2:aa:0d:dc:99:dc:c5:b9:d6:ad:2e:67:74:8d:82:97:27:24:ae:05:5a:80:5a:df:44:2f:22:85:0a:39:e3:6a:e3:91:59:77:fa:5c:6f:72:af:0c:c3:82:70:aa:38:3c:73:4e:88:3a:dd:46:b1:5c:ba:aa:a7:2a:ad:c5:6e:d2:71:22:37:b9:d1:e8:cd:67:0d:d6:d6:54:55:65:21:dc:9c:6d:ab:1a:7c:d3:de:6a:af:65:6d:72:56:dd:10:79:c8:0e:46:7d:45:62:59:d9:bc:8c:cc:5d:88:66:c9:42:32:0d:75:be:0d:d1:ac:be:cd:7d:74:aa:cb:3b:4c:a3:70:19:de:02:82:09:f6:e7:1f:9d:72:4d:3b:9d:51:5a:16:ed:6c:c4:4c:8a:f3:b0:57:63:b5:80:c1:18:a9:6f:a2:69:a1:45:83:2d:86:f9:99:9b:a9:ab:36:56:d7:53:5b:11:6a:99:dc:a4:82:18:10:47:ad:65:dd:4b:71:6b:73:2d:b3:87:62:8c:04:8b:1f:51:9f:7e:86:b1:bb:63:6e:c7:ff:d7:fc:b4:9e:d2:65:83:ce:90:02:c9:9d:8c:a4:e3:34:bf:0e:ed:b5:58:34:bd:5b:50:f2:e3:27:55:96:35:86:72:c3:18:56:f9:bf:4c:fe:66:a0:be:ff:00:89:16:99:2a:2d:d9:74:44:20:33:36:49:2d:c7:15:7f:c2:96:87:4a:f8:61:a4:f0:64:5b:9b:a9:a3:41:17:cc:a1:41:1c:fb:63:3f:ce:bc:98:a6:8e:f9:b4:d1:bf:6c:b1:a9:fb:3c:4d:bc:33:6d:56:43:d1:8f:7f:7a:fb:5b:fe:08:dd:f0:7b:44:d7:be:23:f8:93:e2:b7:8a:25:69:13:4d:d3:61:8a:c5:ad:98:aa:c5:31:27:9c:fa:6d:2a:7e:a6:be:30:d1:74:e6:b2:b7:b5:b4:81:a3:89:d0:7e:f1:e4:19:0b:18:19:26:bf:53:ff:00:e0:93:9e:15:b4:f0:37:ec:9a:ba:ab:5a:c1:f6:dd:73:53:9d:e4:25:f7:01:00:7c:47:b9:bd:36:e3:15:b2:57:67:1d:43:e8:b7:bb:f0:ea:58:4b:65:15:c4:b2:2c:3d:53:ca:c8:27:af:e3:59:97:b6:f6:12:d9:8b:b4:b6:85:64:90:05:88:9b:61:96:1e:9d:33:4e:d7:be:25:7c:3f:d2:2e:ce:97:a8:7c:44:d2:6c:2f:56:45:59:6d:18:64:91:f5:03:8f:af:4a:bd:67:ad:68:1a:bd:82:5c:e8:be:21:82:ed:5c:e5:a6:81:f2:15:bd:a9:b8:5c:e7:b2:b9:ca:e9:9a:36:8f:a8:dc:be:9a:ba:9c:70:4e:e5:84:88:d6:78:f3:57:04:15:dd:da:b3:7c:4b:e1:3f:03:e9:f7:86:1d:4f:47:4b:86:8c:1d:92:28:39:5e:99:04:57:71:69:a4:41:04:c9:e4:da:19:80:95:da:47:b8:27:77:39:e9:8c:0e:a6:ae:5e:59:08:9d:12:df:4c:b4:63:1b:03:1c:92:85:0c:39:ea:58:f2:6b:37:41:31:b8:dc:f1:d9:a5:f0:65:b5:c8:d3:2d:bc:33:a8:33:4e:ea:23:80:58:30:42:3f:bc:4e:3f:4a:e9:6c:7e:1c:da:c3:6c:f2:bf:85:08:32:b0:22:69:0e:c5:84:7a:ff:00:f5:ab:d5:2d:2e:6d:f4:4b:44:6b:ad:62:d5:a5:40:4c:9b:14:28:07:3e:fe:83:8a:a1:aa:f8:8b:46:d6:a2:2d:1d:f0:b9:0a:e4:3c:80:12:03:7f:5a:6a:8c:63:d0:4a:09:9e:31:f1:4b:e1:cf:83:95:ed:6d:34:7d:03:ed:72:c8:7c:d9:a5:69:18:ab:1e:e7:db:06:92:3f:d9:57:c3:3e:2b:d2:60:9a:ff:00:c5:52:69:cc:4e:eb:8b:6d:3f:96:0d:e8:73:da:bd:5a:55:d3:ee:0b:34:31:4a:e9:0c:7f:39:8e:20:ab:fa:d5:09:b4:4b:85:57:b9:80:cd:0c:77:00:15:78:f8:27:9a:99:52:8b:e8:27:4d:33:ff:d0:f7:b8:3f:66:af:87:d6:50:2c:17:7a:88:78:76:05:95:ae:21:c9:7c:74:fc:7d:eb:0f:5c:f0:4c:3a:1d:fb:26:93:66:ab:62:8f:88:65:67:51:c7:ae:3d:2b:b3:d7:ef:6f:2c:75:98:f4:87:79:08:65:55:f2:59:b2:14:80:4e:4f:b9:14:6a:36:96:d7:49:0c:37:46:13:e6:0d:ee:8c:43:06:4c:74:eb:d7:3d:6b:c4:a9:87:4d:18:28:23:c6:3e:20:f8:3e:d7:55:bb:61:a2:69:f1:c6:d2:c2:01:74:62:54:fb:83:d0:9f:6a:c9:b2:f8:23:a8:cb:02:b9:9c:c4:93:0f:9a:69:93:21:47:7f:a7:f8:d7:b6:eb:92:5c:68:5a:43:dc:e9:7a:65:9b:22:03:e4:db:c8:a1:50:7e:5f:d2:bc:97:c6:3a:a7:c4:bd:6e:42:97:1a:85:b4:16:4a:f9:48:ed:40:01:0e:3a:10:4f:3f:5a:f3:ab:61:23:63:29:d1:4c:e4:6f:3c:33:05:b3:88:ad:26:62:01:20:a8:8f:07:f1:aa:57:df:0f:e1:b7:89:cb:6b:61:be:ce:99:69:a3:4e:00:3f:ce:9b:ac:68:7f:10:b4:6f:2e:f9:2e:5a:e9:ae:ee:09:47:58:59:44:0b:8f:e2:1d:87:bf:35:5a:eb:54:d7:ed:34:ef:ec:a3:76:cf:25:cc:ca:93:24:3f:32:ee:ee:72:7f:87:fc:6b:cf:9e:0d:bd:91:97:b0:bb:28:de:e9:16:09:86:25:67:05:70:65:61:8c:8f:5a:c5:d5:b4:7d:25:7c:b6:7b:94:84:bc:80:22:22:f2:df:5f:6a:ec:61:f0:96:af:7f:04:90:5b:ed:32:84:18:88:1c:96:f6:f6:ad:bf:08:f8:47:fb:38:08:bc:4f:a7:28:96:74:c4:91:32:2b:6d:5c:f6:27:22:b1:79:65:69:be:c2:78:74:cf:2d:9f:c0:6c:15:2e:f4:dd:32:17:92:35:d8:86:36:0b:bd:73:d3:d0:55:4d:5f:c2:72:45:70:b6:1a:84:6d:b0:63:7a:ab:11:f2:7a:13:eb:5e:d2:fe:13:b5:b9:bb:68:74:eb:16:82:35:6d:e2:de:34:ce:f1:8c:03:d7:8e:73:55:b5:7d:33:42:d2:ed:d9:b5:f8:a4:2a:a7:00:05:dc:c0:fd:06:45:4c:b2:fa:90:dc:ca:58:66:91:e1:5a:86:91:18:48:ac:ad:2d:0c:cd:2c:db:18:c6:77:6c:40:3f:9d:47:1e:87:2b:46:ca:2c:81:55:1f:30:90:61:82:f7:35:ea:16:1a:64:30:df:cb:7b:a4:e8:ab:05:a3:1c:c7:2c:e8:07:98:d9:e4:e3:ad:45:17:84:6f:3c:41:ab:4f:a9:5d:6a
< 43:50:4e:50:81:21:00:00:00:6b:00:01:00:00:00:04:00:00:10:00
...
> 43:50:4e:50:01:20:00:00:00:74:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:74:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:80:00:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:75:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:75:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:76:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:76:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:00:01:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
> 43:50:4e:50:01:20:00:00:00:77:00:01:00:00:00:00
< 43:50:4e:50:81:20:00:00:00:77:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:00:01:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
near eof:
< 43:50:4e:50:81:20:00:00:03:1c:00:01:00:00:00:40 00:00:01:10:04:04:00:00:01:ff:00:00:00:00:00:00:00:00:02:00:00:00:00:00:00:80:1d:00:00:80:00:00:00:90:01:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
:offset-----:length-----:
May in fact stop reading before end of file. (skipping thumbnail or something?)