cleanup before merging
authorArthur Wolf <wolf.arthur@gmail.com>
Thu, 2 Feb 2012 21:50:19 +0000 (22:50 +0100)
committerArthur Wolf <wolf.arthur@gmail.com>
Thu, 2 Feb 2012 21:50:19 +0000 (22:50 +0100)
94 files changed:
gcc4mbed/.gitignore [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-DB44-20-win32.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-Sasl21-23-win32.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-libapr-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-libaprutil-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-libeay32.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-libintl-Win32.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-ssleay32.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_client-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_delta-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_diff-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_fs-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_ra-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_repos-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_subr-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/SlikSvn-svn_wc-1.dll [new file with mode: 0644]
gcc4mbed/external/win32/applydiff.exe [new file with mode: 0644]
gcc4mbed/external/win32/arm-2011.03-42-arm-none-eabi-i686-mingw32.tar.bz2.md5 [new file with mode: 0755]
gcc4mbed/external/win32/bsdtar.exe [new file with mode: 0755]
gcc4mbed/external/win32/bzip2.dll [new file with mode: 0755]
gcc4mbed/external/win32/curl.exe [new file with mode: 0755]
gcc4mbed/external/win32/libarchive2.dll [new file with mode: 0755]
gcc4mbed/external/win32/libcurl.dll [new file with mode: 0755]
gcc4mbed/external/win32/libeay32.dll [new file with mode: 0755]
gcc4mbed/external/win32/libiconv2.dll [new file with mode: 0755]
gcc4mbed/external/win32/libintl3.dll [new file with mode: 0755]
gcc4mbed/external/win32/libssl32.dll [new file with mode: 0755]
gcc4mbed/external/win32/md5sum.exe [new file with mode: 0755]
gcc4mbed/external/win32/readme.txt [new file with mode: 0755]
gcc4mbed/external/win32/svn.exe [new file with mode: 0644]
gcc4mbed/external/win32/zlib1.dll [new file with mode: 0755]
gcc4mbed/samples/MSTest/MSTest.bin [new file with mode: 0755]
gcc4mbed/samples/MSTest/MSTest.elf [new file with mode: 0755]
gcc4mbed/samples/MSTest/MSTest.hex [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/.meta [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio_Types.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface_LPC11U.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface_LPC17_LPC23.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDescriptor.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice_Types.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints_LPC11U.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints_LPC17_LPC23.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID_Types.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBKeyboard.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBKeyboard.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouse.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouse.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouseKeyboard.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouseKeyboard.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBMIDI/MIDIMessage.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBMIDI/USBMIDI.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBMIDI/USBMIDI.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBMSD/USBMSD.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBMSD/USBMSD.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/CircBuffer.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBCDC.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBCDC.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBSerial.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBSerial.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBMSD_SD/.meta [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBMSD_SD/USBMSD_SD.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/USBMSD_SD/USBMSD_SD.h [new file with mode: 0644]
gcc4mbed/samples/MSTest/main.cpp [new file with mode: 0644]
gcc4mbed/samples/MSTest/makefile [new file with mode: 0644]
src/libs/Hook.h
src/libs/Kernel.cpp
src/libs/SlowTicker.cpp
src/libs/SlowTicker.h
src/libs/StepTicker.cpp
src/libs/StepTicker.h
src/libs/utils.cpp
src/main.cpp
src/modules/communication/SerialConsole.cpp
src/modules/communication/utils/Gcode.cpp
src/modules/communication/utils/Gcode.h
src/modules/robot/Block.cpp
src/modules/robot/Planner.cpp
src/modules/robot/Player.cpp
src/modules/robot/Robot.cpp
src/modules/robot/Stepper.cpp
src/modules/tools/extruder/Extruder.cpp
src/modules/tools/extruder/Extruder.h
src/modules/tools/temperaturecontrol/TemperatureControl.cpp
src/modules/tools/temperaturecontrol/TemperatureControl.h
src/modules/utils/simpleshell/SimpleShell.cpp
src/modules/utils/simpleshell/SimpleShell.h

diff --git a/gcc4mbed/.gitignore b/gcc4mbed/.gitignore
new file mode 100644 (file)
index 0000000..0285e9b
--- /dev/null
@@ -0,0 +1,8 @@
+.DS_Store
+*.disasm
+*.map
+*.o
+*.ar
+.svn/
+external/FATFileSystem/
+external/mbed/
diff --git a/gcc4mbed/external/win32/SlikSvn-DB44-20-win32.dll b/gcc4mbed/external/win32/SlikSvn-DB44-20-win32.dll
new file mode 100644 (file)
index 0000000..12c5cff
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-DB44-20-win32.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-Sasl21-23-win32.dll b/gcc4mbed/external/win32/SlikSvn-Sasl21-23-win32.dll
new file mode 100644 (file)
index 0000000..87ef4dc
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-Sasl21-23-win32.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-libapr-1.dll b/gcc4mbed/external/win32/SlikSvn-libapr-1.dll
new file mode 100644 (file)
index 0000000..2b2db7f
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-libapr-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-libaprutil-1.dll b/gcc4mbed/external/win32/SlikSvn-libaprutil-1.dll
new file mode 100644 (file)
index 0000000..918c0a7
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-libaprutil-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-libeay32.dll b/gcc4mbed/external/win32/SlikSvn-libeay32.dll
new file mode 100644 (file)
index 0000000..b3a1ea9
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-libeay32.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-libintl-Win32.dll b/gcc4mbed/external/win32/SlikSvn-libintl-Win32.dll
new file mode 100644 (file)
index 0000000..2300dc8
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-libintl-Win32.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-ssleay32.dll b/gcc4mbed/external/win32/SlikSvn-ssleay32.dll
new file mode 100644 (file)
index 0000000..15b47b4
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-ssleay32.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_client-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_client-1.dll
new file mode 100644 (file)
index 0000000..7f5fb72
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_client-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_delta-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_delta-1.dll
new file mode 100644 (file)
index 0000000..625912c
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_delta-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_diff-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_diff-1.dll
new file mode 100644 (file)
index 0000000..1f80bd8
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_diff-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_fs-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_fs-1.dll
new file mode 100644 (file)
index 0000000..9ac020c
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_fs-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_ra-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_ra-1.dll
new file mode 100644 (file)
index 0000000..904283e
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_ra-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_repos-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_repos-1.dll
new file mode 100644 (file)
index 0000000..b7acf79
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_repos-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_subr-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_subr-1.dll
new file mode 100644 (file)
index 0000000..ac9da12
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_subr-1.dll differ
diff --git a/gcc4mbed/external/win32/SlikSvn-svn_wc-1.dll b/gcc4mbed/external/win32/SlikSvn-svn_wc-1.dll
new file mode 100644 (file)
index 0000000..5ca149d
Binary files /dev/null and b/gcc4mbed/external/win32/SlikSvn-svn_wc-1.dll differ
diff --git a/gcc4mbed/external/win32/applydiff.exe b/gcc4mbed/external/win32/applydiff.exe
new file mode 100644 (file)
index 0000000..1b22a07
Binary files /dev/null and b/gcc4mbed/external/win32/applydiff.exe differ
diff --git a/gcc4mbed/external/win32/arm-2011.03-42-arm-none-eabi-i686-mingw32.tar.bz2.md5 b/gcc4mbed/external/win32/arm-2011.03-42-arm-none-eabi-i686-mingw32.tar.bz2.md5
new file mode 100755 (executable)
index 0000000..2e64e32
--- /dev/null
@@ -0,0 +1 @@
+70b96df623b10b02a122e61de59b4fb9 *arm-2011.03-42-arm-none-eabi-i686-mingw32.tar.bz2\r
diff --git a/gcc4mbed/external/win32/bsdtar.exe b/gcc4mbed/external/win32/bsdtar.exe
new file mode 100755 (executable)
index 0000000..31d70f5
Binary files /dev/null and b/gcc4mbed/external/win32/bsdtar.exe differ
diff --git a/gcc4mbed/external/win32/bzip2.dll b/gcc4mbed/external/win32/bzip2.dll
new file mode 100755 (executable)
index 0000000..8174912
Binary files /dev/null and b/gcc4mbed/external/win32/bzip2.dll differ
diff --git a/gcc4mbed/external/win32/curl.exe b/gcc4mbed/external/win32/curl.exe
new file mode 100755 (executable)
index 0000000..2a385f1
Binary files /dev/null and b/gcc4mbed/external/win32/curl.exe differ
diff --git a/gcc4mbed/external/win32/libarchive2.dll b/gcc4mbed/external/win32/libarchive2.dll
new file mode 100755 (executable)
index 0000000..30b8cf9
Binary files /dev/null and b/gcc4mbed/external/win32/libarchive2.dll differ
diff --git a/gcc4mbed/external/win32/libcurl.dll b/gcc4mbed/external/win32/libcurl.dll
new file mode 100755 (executable)
index 0000000..060f24f
Binary files /dev/null and b/gcc4mbed/external/win32/libcurl.dll differ
diff --git a/gcc4mbed/external/win32/libeay32.dll b/gcc4mbed/external/win32/libeay32.dll
new file mode 100755 (executable)
index 0000000..22af4aa
Binary files /dev/null and b/gcc4mbed/external/win32/libeay32.dll differ
diff --git a/gcc4mbed/external/win32/libiconv2.dll b/gcc4mbed/external/win32/libiconv2.dll
new file mode 100755 (executable)
index 0000000..747073f
Binary files /dev/null and b/gcc4mbed/external/win32/libiconv2.dll differ
diff --git a/gcc4mbed/external/win32/libintl3.dll b/gcc4mbed/external/win32/libintl3.dll
new file mode 100755 (executable)
index 0000000..4f309be
Binary files /dev/null and b/gcc4mbed/external/win32/libintl3.dll differ
diff --git a/gcc4mbed/external/win32/libssl32.dll b/gcc4mbed/external/win32/libssl32.dll
new file mode 100755 (executable)
index 0000000..d1da87f
Binary files /dev/null and b/gcc4mbed/external/win32/libssl32.dll differ
diff --git a/gcc4mbed/external/win32/md5sum.exe b/gcc4mbed/external/win32/md5sum.exe
new file mode 100755 (executable)
index 0000000..4ae9f74
Binary files /dev/null and b/gcc4mbed/external/win32/md5sum.exe differ
diff --git a/gcc4mbed/external/win32/readme.txt b/gcc4mbed/external/win32/readme.txt
new file mode 100755 (executable)
index 0000000..e3cd44a
--- /dev/null
@@ -0,0 +1,5 @@
+The subversion binaries in this directory were downloaded from http://www.sliksvn.com/en/download\r
+The patch binaries in this directory were downloaded from http://gnuwin32.sourceforge.net/packages/patch.htm\r
+The bsdtar binaries in this directory were downloaded from http://gnuwin32.sourceforge.net/packages/libarchive.htm\r
+The curl binaries in this directory were downloaded from http://curl.haxx.se/download.html\r
+The md5sum binaries in this directory were downloaded from http://gnuwin32.sourceforge.net/packages/coreutils.htm\r
diff --git a/gcc4mbed/external/win32/svn.exe b/gcc4mbed/external/win32/svn.exe
new file mode 100644 (file)
index 0000000..d5cd9f3
Binary files /dev/null and b/gcc4mbed/external/win32/svn.exe differ
diff --git a/gcc4mbed/external/win32/zlib1.dll b/gcc4mbed/external/win32/zlib1.dll
new file mode 100755 (executable)
index 0000000..076f503
Binary files /dev/null and b/gcc4mbed/external/win32/zlib1.dll differ
diff --git a/gcc4mbed/samples/MSTest/MSTest.bin b/gcc4mbed/samples/MSTest/MSTest.bin
new file mode 100755 (executable)
index 0000000..f613915
Binary files /dev/null and b/gcc4mbed/samples/MSTest/MSTest.bin differ
diff --git a/gcc4mbed/samples/MSTest/MSTest.elf b/gcc4mbed/samples/MSTest/MSTest.elf
new file mode 100755 (executable)
index 0000000..4345f8c
Binary files /dev/null and b/gcc4mbed/samples/MSTest/MSTest.elf differ
diff --git a/gcc4mbed/samples/MSTest/MSTest.hex b/gcc4mbed/samples/MSTest/MSTest.hex
new file mode 100644 (file)
index 0000000..b8ec9bd
--- /dev/null
@@ -0,0 +1,4913 @@
+:100000000080001081260000892600008B26000059\r
+:100010008D2600008F2600009126000000000000C1\r
+:100020000000000000000000000000009326000017\r
+:100030009526000000000000972600009926000089\r
+:100040009B2600009B2600009B2600009B260000AC\r
+:100050009B2600009B2600009B2600009B2600009C\r
+:100060009B2600009B2600009B2600009B2600008C\r
+:100070009B2600009B2600009B2600009B2600007C\r
+:100080009B2600009B2600009B2600009B2600006C\r
+:100090009B2600009B2600009B2600009B2600005C\r
+:1000A0009B2600009B2600009B2600009B2600004C\r
+:1000B0009B2600009B2600009B2600009B2600003C\r
+:1000C0009B2600003A483B4970B5884223D03A4C01\r
+:1000D000A14220D2024652F8046B0B46CD4343F8AE\r
+:1000E000046B6519A342C5F3800514D23DB11668AF\r
+:1000F00000F108021E6001F10803A3420BD2104672\r
+:1001000050F8045B194641F8045B5668021D5E60B6\r
+:100110000B1DA342F3D329482949884224D0294CF6\r
+:10012000A14221D2024652F8046B0B46CD4343F85C\r
+:10013000046B04EB050CA342CCF3800514D23DB153\r
+:10014000156800F108021D6001F10803A3420BD2FB\r
+:10015000104650F8045B194641F8045B5668021DCE\r
+:100160005E600B1DA342F3D3174A1848824216D291\r
+:1001700000211346D64343F8041B84198342C4F379\r
+:1001800080040CD224B1196002F10803834206D224\r
+:100190001A4642F8041B5960131D8342F8D300F03D\r
+:1001A000C7F806F083FF00F0F5F911F005FE00BF77\r
+:1001B0005829010000000010340700108C300100A5\r
+:1001C000B4090010B409001034070010B40900107D\r
+:1001D0001B482021C0F8A011D0F8A01111F0400F49\r
+:1001E000FAD00221C0F804110121C0F80C110B2231\r
+:1001F000C0F88420C0F88010AA22C0F88C205523B3\r
+:10020000C0F88C30D0F8881011F0806FFAD003213C\r
+:10021000C0F88010C0F88C20C0F88C300521C0F8E0\r
+:1002200008110021C0F8A811C0F8AC11054AC0F8A7\r
+:10023000C420C0F8C81143F23A01016070470000C1\r
+:1002400000C00F40DE87280400000000000000000E\r
+:10025000000000000000000000000000000000009E\r
+:10026000000000000000000000000000000000008E\r
+:10027000000000000000000000000000000000007E\r
+:10028000000000000000000000000000000000006E\r
+:10029000000000000000000000000000000000005E\r
+:1002A000000000000000000000000000000000004E\r
+:1002B000000000000000000000000000000000003E\r
+:1002C000000000000000000000000000000000002E\r
+:1002D000000000000000000000000000000000001E\r
+:1002E000000000000000000000000000000000000E\r
+:1002F00000000000000000000000000000000000FE\r
+:1003000040F23473C1F200031A780AB90120187060\r
+:10031000704700BF40F23470C1F2000008B50368B6\r
+:100320002BB140F20003C0F2000303B1984708BDAF\r
+:1003300008B50021074810F0D1FF0421064810F04D\r
+:10034000CDFF0648042110F0C9FF054B01221A60B9\r
+:1003500008BD00BF50F7000058F7000060F700002C\r
+:1003600040070010024B16221A604FF0FF30704712\r
+:10037000B008001008B511F01FFD00BF0120704744\r
+:1003800070B5094D06462C684CB111F05FFBA319FE\r
+:10039000834207D8296820468E192E6070BD034C11\r
+:1003A0002C60F2E706F05AF93C070010B80900107B\r
+:1003B00010F06ABF022801DC0120704710F07ABFFC\r
+:1003C00002282DE9F0476EDD404F3B68002B61D1DC\r
+:1003D0003F4D404C25F0010C65460CF1280615F800\r
+:1003E00001ABC3F34F0883EA0A0313F0010F1CBFEC\r
+:1003F00088EA04081FFA88F84FEA5A0988EA090AC5\r
+:100400004FEA58031AF0010F1CBF63409BB24FEA3A\r
+:10041000590883EA08095B0819F0010F1CBF634003\r
+:100420009BB24FEA580883EA08095B0819F0010FEC\r
+:100430001CBF63409BB24FEA580883EA08095B0877\r
+:1004400019F0010F1CBF63409BB24FEA580883EAC2\r
+:1004500008095B0819F0010F1CBF63409BB24FEA0B\r
+:10046000580883EA08095B0819F0010F1CBF6340B4\r
+:100470009BB283EA58085B0818F0010F1CBF634069\r
+:100480009BB2B542ABD142F23F04A34212D1DCF899\r
+:1004900028303B60033853F8200038B103681B69EB\r
+:1004A0009847BDE8F0870020BDE8F0874FF0FF30A7\r
+:1004B000BDE8F087084909480C686B220121E36810\r
+:1004C00006F0E4FD012011F077FC00BF38070010B2\r
+:1004D000A114010001A0FFFF9002001068F70000C6\r
+:1004E00010B50B4C82B0236814460BB9022808DD06\r
+:1004F0002246002310F0B4FF20F00040201A02B082\r
+:1005000010BD01900091FFF713FF00990198EFE7EC\r
+:100510004007001010B50C4C82B0236814460BB98C\r
+:10052000022809DD0023224610F0D0FF0028A8BFD2\r
+:10053000C0EB040002B010BD01900091FFF7F8FE7F\r
+:1005400000990198EEE700BF400700104FF40053F8\r
+:100550004B600020704700BF0A4A0B4B10B50446A1\r
+:10056000226040F8A03F10F05FFE0849204640F8A6\r
+:10057000801F10F059FE064B2046236000F0F8FD66\r
+:10058000204610BDF8F70000DC27010024290100F7\r
+:1005900058FA0000FEE700BF30B5094C094D83B0A2\r
+:1005A00009490A4A20460A4B009500F07DF809499E\r
+:1005B000094A204603B0BDE8304002F073B800BFDE\r
+:1005C0004407001006C0092009C0092008C00920FE\r
+:1005D00007C0092059050000C4000010704700BF83\r
+:1005E00000207047002070470020704700207047AF\r
+:1005F000704700BF704700BF002070470020704761\r
+:10060000C06F704700207047406F70474B1C9B1AAB\r
+:10061000002B2DE9F001074641DDA0EBE20C9CF830\r
+:100620000F0002F00701084101215C1E994204EA13\r
+:10063000010400EA01002FD074B1511CA7EBE10CBA\r
+:100640009CF80F4001F007010C41022104F0010465\r
+:10065000994240EA44001FD08E184C1CA7EBE608D4\r
+:10066000A51898F80F80A7EBE50C06F007069CF894\r
+:100670000FC048FA06F605F007054CFA05FC06F02F\r
+:10068000010616FA01F10CF00105A5400843611CB2\r
+:10069000994240EA0500DFD1BDE8F0017047002033\r
+:1006A000FAE700BF806F7047F0B50F4683B016467B\r
+:1006B0001D4640F2037101234FF48272044601F09B\r
+:1006C000EFFB0F4920462B4640F8801B002539469A\r
+:1006D0003246009510F05CFF08992A4604F1A0000C\r
+:1006E00010F0C4FBD4F8B400D4F8B8200123826120\r
+:1006F0002046E36701F0DEFB204603B0F0BD00BFFB\r
+:10070000F8F70000F8B5D0F8B4300546D0F8B800D6\r
+:1007100005F180041646D86141F04001204610F0F2\r
+:1007200003FF3116204610F0FFFE3114204610F072\r
+:10073000FBFE3112204610F0F7FE3146204610F045\r
+:10074000F3FE2046952110F0EFFE41F2883707E0D6\r
+:1007500010F0EAFE10F0800F06460DD0013F16D0D3\r
+:10076000FF21204610F0E0FE0646FF2116F0800F24\r
+:10077000204607F1FF37EBD1D5F8B410D5F8B820F3\r
+:1007800020468A61FF2110F0CFFE3046F8BDD5F833\r
+:10079000B860D5F8B43020469E61FF214FF0FF3697\r
+:1007A00010F0C2FE3046F8BD38B5054641F2883437\r
+:1007B0000AE02846FFF7A6FF284629210022FFF776\r
+:1007C000A1FF80B1013C10D0372100222846FFF75D\r
+:1007D00099FF292100222846FFF794FF013C372189\r
+:1007E00000220028E5D1012038BD054905480B68E5\r
+:1007F0001E220121DB6806F049FC204638BD00BFFF\r
+:100800009002001080F8000070B5D0F8B4300546B2\r
+:10081000D0F8B80005F180041646D86141F04001D7\r
+:10082000204610F081FE3116204610F07DFE311476\r
+:10083000204610F079FE3112204610F075FE314648\r
+:10084000204610F071FE2046952110F06DFE41F219\r
+:10085000883607E010F068FE10F0800F03460DD0D8\r
+:10086000013E0DD0FF21204610F05EFE0346FF2121\r
+:1008700013F0800F204606F1FF36EBD1184670BD0D\r
+:10088000D5F8B410D5F8B82020468A61FF2110F0C1\r
+:100890004BFE4FF0FF33184670BD00BFF8B5D0F8DF\r
+:1008A000B820D0F8B43000F18005DA617A2107462B\r
+:1008B000284610F039FE0021284610F035FE0021B0\r
+:1008C000284610F031FE0021284610F02DFE0021B0\r
+:1008D000284610F029FE2846952110F025FE41F209\r
+:1008E000883607E010F020FE10F0800F04460DD08F\r
+:1008F000013E26D0FF21284610F016FE0446FF21B7\r
+:1009000014F0800F284606F1FF36EBD1FF21284670\r
+:1009100010F00AFEFF21284610F006FEFF212846AF\r
+:1009200010F002FEFF21284610F0FEFDD7F8B810A7\r
+:10093000D7F8B42028469161FF2110F0F5FD20463C\r
+:10094000F8BDD7F8B840D7F8B43028469C61FF21ED\r
+:100950004FF0FF3410F0E8FD2046F8BD38B50546ED\r
+:1009600041F288340AE02846FFF7CCFE28462921C8\r
+:100970000022FFF7C7FE80B1013C13D037210022CF\r
+:100980002846FFF7BFFE292100222846FFF7BAFEBE\r
+:10099000013C372100220028E5D12846FFF77EFFE1\r
+:1009A000022038BD04491E220B6804480121DB687F\r
+:1009B00006F06CFB204638BD90020010A0F8000045\r
+:1009C000F0B5D0F8B430D0F8B82000F1800583B08D\r
+:1009D000DA6148210746284610F0A6FD0021284686\r
+:1009E00010F0A2FD0021284610F09EFD01212846AE\r
+:1009F00010F09AFDAA21284610F096FD284687217E\r
+:100A000010F092FD244E00240BE010F08DFDC0B2DA\r
+:100A1000013410F0800F8DF800000FD00134B44283\r
+:100A20002DD0FF21284610F07FFD5FFA80FCFF21CA\r
+:100A30001CF0800F28468DF800C0E6D1FF21284623\r
+:100A400010F072FDFF21284610F06EFDFF212846B0\r
+:100A500010F06AFDFF21284610F066FDD7F8B4308B\r
+:100A6000D7F8B82002A90C1904F8080CFF219A61E4\r
+:100A7000284610F059FD9DF8000003B0F0BDD7F8EE\r
+:100A8000B430D7F8B82028469A61FF2110F04CFD09\r
+:100A90004FF0FF30F1E700BF404B4C0070B500F164\r
+:100AA000800504463A49284610F06AFDD4F8B4306F\r
+:100AB000D4F8B820FF219A61284610F035FDFF21B7\r
+:100AC000284610F031FDFF21284610F02DFDFF21B2\r
+:100AD000284610F029FDFF21284610F025FDFF21B2\r
+:100AE000284610F021FDFF21284610F01DFDFF21B2\r
+:100AF000284610F019FDFF21284610F015FDFF21B2\r
+:100B0000284610F011FDFF21284610F00DFDFF21B1\r
+:100B1000284610F009FDFF21284610F005FDFF21B1\r
+:100B2000284610F001FDFF21284610F0FDFC284664\r
+:100B3000FF2110F0F9FC002120460A46FFF7E2FDF4\r
+:100B40000128054609D0134A012110683722C368DD\r
+:100B5000114806F09BFA002070BD2046FFF730FFD9\r
+:100B6000012810D0052809D00A4937220B680B4804\r
+:100B70002946DB6806F08AFA002070BD2046BDE8F1\r
+:100B80007040FFF711BE2046BDE87040FFF7E6BE9B\r
+:100B9000A086010090020010C0F80000F8F80000E4\r
+:100BA0002DE9F8430546D0F8B430D0F8B8000C462B\r
+:100BB0009046D86105F18006FF21304610F0B4FC64\r
+:100BC000FE28F9D1B8F1000F24DDFF21304610F0E6\r
+:100BD000ABFC012708F1FF39474509F001092070F6\r
+:100BE00018D0B9F1000F07D0FF21304610F09CFC5F\r
+:100BF0000227474560700DD0FF21304610F094FC6D\r
+:100C0000FF21E055304610F08FFC791C0237474534\r
+:100C10006054F1D1FF21304610F086FCFF213046B0\r
+:100C200010F082FCD5F8B430D5F8B82030469A617F\r
+:100C3000FF2110F079FC0020BDE8F88370B5520266\r
+:100C40000D4611210646FFF75DFD044608B101205F\r
+:100C500070BD304629464FF40072FFF7A1FF2046D1\r
+:100C600070BD00BF2DE9F843D0F8B4300646D0F887\r
+:100C7000B80006F180049146D8610D462046FE2159\r
+:100C800010F052FCB9F1000F22DD0127204629782F\r
+:100C900009F1FF3810F048FC4F4508EA070817D063\r
+:100CA000B8F1000F06D020466978022710F03CFC0E\r
+:100CB0004F450DD0E95D07F10108204610F034FCE6\r
+:100CC0000237204615F8081010F02EFC4F45F1D1E0\r
+:100CD000FF21204610F028FCFF21204610F024FCC4\r
+:100CE000FF21204610F020FC00F01F01052911D142\r
+:100CF0002046FF2110F018FC0028F9D0D6F8B810D3\r
+:100D0000D6F8B42020469161FF2110F00DFC0020A0\r
+:100D1000BDE8F883D6F8B430D6F8B82020469A61FA\r
+:100D2000FF2110F001FC0120BDE8F88370B55202EC\r
+:100D30000D4618210646FFF7E5FC044608B10120E0\r
+:100D400070BD304629464FF40072FFF78BFF2046F6\r
+:100D500070BD00BF2DE9F041092184B00022064694\r
+:100D6000FFF752FD0446002834D130466946102270\r
+:100D7000FFF716FF0546002836D17F217E22684600\r
+:100D8000FFF744FC492104463E226846FFF73EFC3B\r
+:100D900031212F2207466846FFF738FC5321804651\r
+:100DA00050226846FFF732FC002C27D1012212FAAC\r
+:100DB00000F308F102018A4007FB033C02FB0CF040\r
+:100DC000B0670028BCBF00F5FE700330401204B0CD\r
+:100DD000BDE8F0810E490F480B6824220121DB6831\r
+:100DE00006F054F90020F2E7094A0B481368012184\r
+:100DF0002522DB6806F04AF92046E8E7044907485F\r
+:100E00000B6840220121DB6806F040F92846DEE746\r
+:100E10009002001030F9000058F9000080F900003D\r
+:100E200038B50446FFF73AFE2046FFF793FF10213E\r
+:100E300060674FF400722046FFF764FC054638B93E\r
+:100E400004F18000074910F09BFBE567284638BD98\r
+:100E5000054906480B681D220121DB6806F016F9DA\r
+:100E6000012038BD404B4C0090020010C4F9000036\r
+:100E70000020704700207047704700BF704700BFD8\r
+:100E8000704700BF704700BF704700BF704700BF8A\r
+:100E90000D4B0E4A1021C3F80812C3F81022D3F8E4\r
+:100EA0000022094912F0100FF9D0020442F48070B8\r
+:100EB0001023C1F808320A46C1F81002D2F8001215\r
+:100EC00011F0100FFAD0704700C000500005FE006E\r
+:100ED0000F4B104A1020C3F808021946C3F810221D\r
+:100EE000D1F800320A4A13F0100FF9D00A48202135\r
+:100EF000C2F808121146C2F81002D1F8002212F00E\r
+:100F0000200FFAD00248D0F81432D8B2704700BF90\r
+:100F100000C000500005FE000002FE00104B00045F\r
+:100F2000102140F4A062C3F808121946C3F8102239\r
+:100F3000D1F800320A4A13F0100FF9D0202140F402\r
+:100F40000070C2F808121146C2F81002D1F800224F\r
+:100F500012F0200FFAD00248D0F81432D8B27047FD\r
+:100F600000C0005040300F4B020442F4A062102039\r
+:100F7000C3F80802C3F81022D3F80022094812F07F\r
+:100F8000100FF9D00A0442F480711023C0F808321F\r
+:100F90000246C0F81012D2F8000210F0100FFAD07A\r
+:100FA000704700BF00C0005010B5FFF791FF00F080\r
+:100FB000FE00BDE81040FFF76BBF00BFF8B544105E\r
+:100FC0001B4BA40044F00204C3F82842C3F82422B7\r
+:100FD00052B30024254611F8017B04F1080617FAE4\r
+:100FE00004F4013A254316F01F0417D0002AF2D169\r
+:100FF0000F4AC2F81C520E4C0021C4F82812FFF709\r
+:101000008DFF0C4B1020C4F808022246C4F81032A1\r
+:10101000D2F8003213F0100FFAD0F8BDC3F81C520A\r
+:10102000002AE8D02546D6E7C3F81C22E3E700BF34\r
+:1010300000C000500005FA000E4B0F4A1021C3F803\r
+:101040000812C3F81022D3F800220A4912F0100F38\r
+:10105000F9D040F080031A0442F480731020C1F8E4\r
+:1010600008020A46C1F81032D2F8001211F0100F2F\r
+:10107000FAD0704700C000500005D0004B102DE999\r
+:10108000F041364C9D0045F00100C4F82802D4F828\r
+:101090002002324D10F4006FF9D0D5F820028405FB\r
+:1010A000A40D002C54D0002014F0010F0646074672\r
+:1010B000A84613D1D5F818620127167008200DE054\r
+:1010C0001CF01F0C01D1D8F818620CF1080026FAA8\r
+:1010D0000CFC6F1C02F805C000F01F007D1C00F125\r
+:1010E000080C08B9D8F8186236FA00F0A542D055B5\r
+:1010F000E6D11B4A82FB0305184805EB450C002589\r
+:101100006345C0F8285200D1FBB90846FFF706FF37\r
+:10111000124B14481021C3F808121946C3F81002E4\r
+:10112000D1F800020D4A10F0100FF9D00E4B20211B\r
+:10113000C2F808121146C2F81032D1F8002212F09B\r
+:10114000200FFAD00548D0F814322046BDE8F081CF\r
+:10115000D5F81852054A1560CBE700BF00C0005013\r
+:10116000565555550005F2000002F2000408001023\r
+:10117000064910B501600446FFF716FF044B4FF017\r
+:101180008072C3F88020204610BD00BFF0F9000037\r
+:1011900000E100E010B5FFF79BFE40F00100C0B297\r
+:1011A000BDE81040FFF774BE0D4B0E4A1020C3F887\r
+:1011B00008021946C3F81022D1F80032084A13F089\r
+:1011C000100FF9D008481021C2F808121146C2F8D1\r
+:1011D0001002D1F8002212F0100FFAD0704700BFB1\r
+:1011E00000C000500005D800000101000D4B0E4A60\r
+:1011F0001020C3F808021946C3F81022D1F80032B3\r
+:10120000084A13F0100FF9D010214FF48070C2F883\r
+:1012100008121146C2F81002D1F8002212F0100F85\r
+:10122000FAD0704700C000500005D8000846FFF70C\r
+:1012300003BF00BF0A460021FFF720BF704700BF71\r
+:101240000A460021FFF71ABF0120FFF7B7BE00BF13\r
+:101250000120704770B5114E0C46491086FB016C99\r
+:101260000CEB4C05A9421E4600D1A9B90C4D2968CA\r
+:1012700031FA04F313F0010F0CD02146FFF7FEFE04\r
+:10128000012313FA04F42A68306022EA04042C6073\r
+:10129000002070BD012070BD014DEEE7565555553B\r
+:1012A000000800100B48F8B50068C84010F0010FA6\r
+:1012B00001D00320F8BD012414FA01F7064D0846B9\r
+:1012C0002E68114626EA07061A462E60FFF776FEBC\r
+:1012D0002046F8BD0C08001000080010084B1868E4\r
+:1012E00030FA01F212F0010F08D0012010FA01F1DA\r
+:1012F0001A68002022EA0101196070470120704736\r
+:101300000008001001208840134B10B44FF4807483\r
+:10131000C3F80842D3F8444240EA0404C3F8444204\r
+:10132000C3F848121C46C3F84C22D4F800120A4AEB\r
+:1013300011F4807FF9D0094B4FF48074C2F8084251\r
+:101340001968D2F8344221EA000120431960C2F83A\r
+:101350003402012010BC704700C000500C0800107F\r
+:101360002C4A2D4B70B54FF080712C4C0260C3F8A5\r
+:101370008010D4F8C4602A4946F00042C4F8C42062\r
+:101380000546D1F8F40F0A4640F01203C1F8F43FC5\r
+:10139000D2F8F80F224C1228FAD1224E716821F0AF\r
+:1013A00070527260736843F0A0507060FFF7FCFDEC\r
+:1013B00031691D4821F440323261336943F48021A0\r
+:1013C000316110F041FF0121402200232846FFF740\r
+:1013D00099FF00210B4640222846FFF793FF134A4E\r
+:1013E00018201560124910F00FFB0B4B0D204FF029\r
+:1013F00080721A60C4F80402D4F83412284641F00E\r
+:101400000202C4F83422D4F8343243F00101C4F8A3\r
+:10141000341270BDF0F9000000E100E000C00F40A0\r
+:1014200000C0005000C002409A99993E0808001080\r
+:1014300071170000012910B50C460BD9084601218F\r
+:10144000FFF790FD012010FA04F4054B1A681443CD\r
+:101450001C6010BD00208021BDE81040FFF782BD58\r
+:101460000C0800100021FFF7E5BF00BF084610B5CB\r
+:101470000C460021FFF776FD012010FA04F4034B1F\r
+:101480001A6822EA04041C6010BD00BF0C0800109A\r
+:10149000034B1A6832FA01F000F00100704700BFF8\r
+:1014A0000C080010AE4A38B5D2F80032044613F0EA\r
+:1014B000010F37D00068AB4910258369C2F8085284\r
+:1014C0001046C2F81012D0F80022A54912F0100FF1\r
+:1014D000F9D0A5482025C1F808520D46C1F81002E0\r
+:1014E000D5F800129E4811F0200FF9D0D0F8141250\r
+:1014F0009D4A2025C0F80852C9B2C0F81022D0F881\r
+:101500000022974D12F0200FF9D0D5F81422204672\r
+:101510005FFA82FE41EA0E2C1FFA8CF198470123F4\r
+:10152000C5F808328E4BD3F8000210F0080F40F0D7\r
+:1015300008818B4BD3F8000210F0040F00F00081FB\r
+:10154000D3F8301211F0010F16D00122C3F838225F\r
+:10155000D3F8000210F0200FFAD081492268D1F8A8\r
+:10156000140210F0040F14BF52689268204690478E\r
+:101570007B4B0421C3F80812794BD3F8302212F0C8\r
+:10158000020F11D00220C3F83802D3F800227449A8\r
+:1015900012F0200FF9D023680420D1F81422DB6860\r
+:1015A000C1F80802204698476D4BD3F8301211F06D\r
+:1015B000080F1BD00825C3F83852D3F80022684919\r
+:1015C00012F0200FF9D0694DD1F814322868236841\r
+:1015D00040F0080204202A601B6AC1F80802204675\r
+:1015E000984718B12B6823F0080129605C4BD3F8A9\r
+:1015F000302212F0040F1BD00425C3F83852D3F860\r
+:101600000002574910F0200FF9D0584DD1F814328C\r
+:101610002A68206842F0040304222B60C369C1F8E1\r
+:1016200008222046984718B1286820F00401296054\r
+:101630004B4BD3F8302212F0200F1BD02025C3F8DB\r
+:101640003852D3F80002464910F0200FF9D0474D28\r
+:10165000D1F814322A68206842F0200304222B605B\r
+:10166000836AC1F808222046984718B1286820F0FC\r
+:10167000200129603A4BD3F8302212F0100F1BD012\r
+:101680001025C3F83852D3F80002354910F0200F66\r
+:10169000F9D0364DD1F814322A68206842F0100390\r
+:1016A00004222B60436AC1F808222046984718B1EB\r
+:1016B000286820F010012960294BD3F8302212F05D\r
+:1016C000800F1BD08025C3F83852D3F8000224497C\r
+:1016D00010F0200FF9D0254DD1F814322A68206877\r
+:1016E00042F0800304222B60036BC1F808222046DD\r
+:1016F000984718B1286820F080012960184BD3F86A\r
+:10170000302212F0400F1BD04025C3F83852D3F8D6\r
+:101710000002134910F0200FF9D0144DD1F8143203\r
+:101720002A68206842F0400304222B60C36AC1F893\r
+:1017300008222046984718B1286820F04001296007\r
+:1017400038BD0821C3F80812FFF7C2FB10F0100FD4\r
+:101750003FF4EFAE2268204613689847E9E600BFE1\r
+:1017600000C000500005F5000002F5000008001060\r
+:10177000014B1868FFF796BE08080010002070475C\r
+:1017800000207047002070470022016810B580F8E3\r
+:101790002520022480F8244080F826204B6B9847AF\r
+:1017A00010BD00BF704700BF704700BF00487047C2\r
+:1017B0000001001000487047D0000010004870473A\r
+:1017C0001C01001000487047F800001000487047E6\r
+:1017D000C8000010004870470401001038B5144CD0\r
+:1017E0000546236813F0010F01D0124838BD20468A\r
+:1017F00001F059F80028F8D0B5F804C00D4920468A\r
+:1018000081F808C0AB881A0A4A72B5F806E081F878\r
+:101810000AE0EB881A0ACA72B5F808C081F80CC051\r
+:101820002B891A0A4A7301F04EF8024838BD00BFEE\r
+:1018300014080010E4000010028A70B51312022B85\r
+:1018400004462DD0032B21D0012B01D0002070BDE8\r
+:1018500001688B6C9847C0B125682046AA6C9047F8\r
+:101860000578122DF2D1236820469E6CB047467849\r
+:10187000012EEBD12068E561816C2046884784F811\r
+:101880002060A061304670BD002070BD02F00F0CDA\r
+:10189000BCF1050FF8D8DFE80CF050582938404863\r
+:1018A0000368DA6C90470028EFD022682046D16C9C\r
+:1018B000884790F800C0BCF1090FC7D121682046C5\r
+:1018C000CB6C984740780228C0D125682046E96C47\r
+:1018D000884723688578DA6C2046904790F803C0E3\r
+:1018E000206845EA0C25E561C36C06E001688B6D54\r
+:1018F000984722680078936DE0612046984701225E\r
+:10190000A06184F82020104670BD0168CB6D984717\r
+:1019100022680078D36DE061EFE701680B6E9847AD\r
+:1019200022680078136EE061E7E70268516E88472D\r
+:10193000236800785B6EE061DFE701680B6D984714\r
+:1019400022680078136DE061D7E701684B6D984716\r
+:1019500022680078536DE061CFE700BF0B78D809AB\r
+:1019600010700B78C3F3411C82F801C0087800F0B6\r
+:101970001F03937091F801C082F803C0C8788B7878\r
+:1019800043EA002CA2F804C048790B7943EA002C02\r
+:10199000A2F806C0C879897941EA0023138170470B\r
+:1019A00070B590F8206090B0044616B1002010B0D9\r
+:1019B00070BD6946FFF744FCE5690246A8421CD8A1\r
+:1019C000A1692D1A0B18A361E5618DB994F8220065\r
+:1019D00038B121682046CB6B92B26946984784F8AB\r
+:1019E0002250002120460A46FFF72EFC0120DEE7A8\r
+:1019F0002046FFF723FC0120D9E73046D7E700BF98\r
+:101A000010B50446FFF7CCFF00B110BD2046BDE87D\r
+:101A10001040FFF727BD00BF70B5C56904465DB92A\r
+:101A200090F82130002B2AD194F8220050B920469A\r
+:101A3000FFF704FC012070BD90F82060012E0FD04C\r
+:101A4000002070BD22680021D36B20460A469847CB\r
+:101A50000021204684F82210FFF7F0FB012070BD22\r
+:101A6000402D28BF402581692A46FFF7EDFBA36979\r
+:101A7000E16958194D1BA061E561304670BD2946EA\r
+:101A80002A46FFF7E1FB94F8220084F82150002851\r
+:101A9000CDD0D7E710B50446FFF7BEFF00B110BDAB\r
+:101AA0002046BDE81040FFF7DDBC00BF10B5017C4B\r
+:101AB0000446FFF7BBFB238A23B1032184F82410DB\r
+:101AC000012010BD022084F82400012010BD00BFB9\r
+:101AD000017C10B5044680F8251061B103681A6CCA\r
+:101AE000904700B910BD2046FFF75EFB042084F844\r
+:101AF0002400012010BDFFF779FB032384F8243074\r
+:101B0000012010BD08B590F82430042B01D0418A83\r
+:101B100011B9827B022A01D0002008BD038A53B983\r
+:101B2000418AC1F3C01C01F00F0E0CEB4E01FFF710\r
+:101B300081FC012008BD002008BD00BF08B590F859\r
+:101B40002430042B01D0418A11B9827B022A01D0B2\r
+:101B5000002008BD038A53B9418AC1F3C01C01F0BB\r
+:101B60000F0E0CEB4E01FFF781FC012008BD002099\r
+:101B700008BD00BF90F8243010B5042B044601D0F6\r
+:101B8000408A68B9A37B012B20D00BD2144B0120D3\r
+:101B900018800120A3610223E36184F8200010BDB6\r
+:101BA000002010BD022B01D0002010BDB4F812E0BF\r
+:101BB0002046CEF3C0110EF00F0C01EB4C01FFF7E5\r
+:101BC00067FC0028E2D1064B1880E2E7044B0022B4\r
+:101BD0001A800120A3610223E36184F8200010BD74\r
+:101BE0001008001010B5437B044653B9C17B0B2984\r
+:101BF00007D8DFE801F00E120616061A1E06313964\r
+:101C00000822002010BD90F82400042830D00020C5\r
+:101C100010BDBDE81040FFF7ADBFBDE81040FFF7B5\r
+:101C20008DBFBDE81040FFF76DBFBDE81040FFF766\r
+:101C30003DBFBDE81040FFF7FFBD0168027C4B6C63\r
+:101C4000418A98470028E3D0B4F810E0628A84F80B\r
+:101C50002AE02285012010BD012004F12502A261A5\r
+:101C6000E06184F8200010BDBDE81040FFF730BFF0\r
+:101C7000B4F828C0012004F12A03A4F812C0A3611B\r
+:101C8000E06184F8200010BD10B590B004466946AC\r
+:101C9000FFF7D0FA204604F10C026946FFF75EFE1A\r
+:101CA0000020226884F82000A061E06184F821000F\r
+:101CB00084F82200936B20469847D8B1A08A50B18F\r
+:101CC000217B01290FD094F8203083B9E269824248\r
+:101CD00016D018460CE0E16951B920460A46FFF7D4\r
+:101CE000B3FA012004E094F82030012B0DD000203D\r
+:101CF00010B010BD2046FFF775FF0028DED1F7E7D2\r
+:101D00002046FFF79BFA0120F2E7E26982420BD8F6\r
+:101D1000904204D912F03F0F08BF84F821302046CA\r
+:101D2000FFF77AFE0120E3E7E061F8E710B504462B\r
+:101D3000FFF7AAFF00B110BD2046BDE81040FFF735\r
+:101D400091BB00BF10B50446FFF724FA94F8243085\r
+:101D5000042BFBD110BD00BF0C3070470023FFF7F0\r
+:101D6000D1BA00BFF8B5044616461F460D46FFF728\r
+:101D7000F7FA0748002301222060A580E68027812A\r
+:101D800084F8242084F8253084F826302046F8BDD5\r
+:101D900058FA000008B5FFF75BFAA0F101025042C3\r
+:101DA00040EB020008BD00BF70B5BDF8104005460D\r
+:101DB000A3420E4603D890F82440042C01D0002002\r
+:101DC00070BDFFF76FFA012801D0002070BD2846D2\r
+:101DD0003146FFF783FAD0F1010038BF002070BD13\r
+:101DE000F8B5044690F824000F46042816461D4610\r
+:101DF00001D00020F8BD2046394632462B46FFF779\r
+:101E000029FA012804D0D0F1010038BF0020F8BD24\r
+:101E100094F82430042BEED00020F8BD0048704721\r
+:101E200054010010004870475C01001000487047E2\r
+:101E300034010010012938B50C46054601D00020B8\r
+:101E400038BD05214022FFF789FF042140222846A2\r
+:101E5000FFF784FF284604214022FFF79BFF20461E\r
+:101E600038BD00BF10B50446FFF776FF4378012B5D\r
+:101E700001D0002010BDC278FE2A08D0FF2A01D070\r
+:101E8000002010BD002284F82B20184610BD034905\r
+:101E90000361C1600375184610BD00BF180800102B\r
+:101EA00010B50446FFF75EFF014B2046236010BDCE\r
+:101EB00008FB0000016810B5D1F88030044698474F\r
+:101EC00010F0010F04D0236820465A6F9047D8B90C\r
+:101ED000216820468B6F984722682067D16F204683\r
+:101EE0008847236FE066002B0CDB90FBF3F0A066C5\r
+:101EF00018B105F06DF9606628B12046FFF722FFA2\r
+:101F0000012010BD002010BD002010BD70B504469A\r
+:101F1000406B1546854228BF85B2032384F82B30D9\r
+:101F200082B00A464026204605212B460096FFF740\r
+:101F30003BFF40B1D4F853200021551BC4F8535047\r
+:101F400084F85710012002B070BD00BF2DE9F041A8\r
+:101F5000046F836E82B0013C4FEA14684FEA244C50\r
+:101F60004FEA242E1F0E1E141D12694608228DF8FA\r
+:101F700000808DF801C08DF802E08DF803408DF8E7\r
+:101F800004708DF805608DF806508DF80730FFF766\r
+:101F9000BDFF02B0BDE8F0812DE9F041036F84B0D0\r
+:101FA000846E4FF00008CDF804804FF002084FEA2D\r
+:101FB000136C4FEA234E1F12261425128DF80C8045\r
+:101FC00001A94FF008080C228DF807808DF808C091\r
+:101FD0008DF809E08DF80A708DF80B308DF80D60E2\r
+:101FE0008DF80E508DF80F40FFF790FF04B0BDE85C\r
+:101FF000F08100BFF0B58BB001AC084E2546074616\r
+:102000000FCE0FC50FCE0FC52B463568384621467B\r
+:1020100024221D60FFF77AFF0BB0F0BDC8FA000064\r
+:1020200010B582B00023032401A904228DF80440D6\r
+:102030008DF805308DF806308DF80730FFF766FF14\r
+:1020400002B010BD30B5C36C0B4D03F07F4C4CEAB1\r
+:102050000501552280F84B20C16483B00D23052172\r
+:1020600000F14B02402504460095FFF79DFE042336\r
+:1020700084F82B3003B030BD53425300836D2DE9FB\r
+:10208000F0411546C26EEF18974204460E465BD8E3\r
+:10209000A06EB3FBF0F200FB123100294DD0CDB1A0\r
+:1020A000A76E616EB3FBF7F007FB103296F800C025\r
+:1020B0008F5C8A1867450AD1002115F0010F34D1D1\r
+:1020C00012F8017F16F801CF012167452DD00022BB\r
+:1020D00084F86020E26DD4F853C05B19501BC5EB47\r
+:1020E0000C05A365E065C4F8535018B194F82B10A3\r
+:1020F000022933D094F86000E8B194F82B30023B09\r
+:1021000018BF0123204684F85730BDE8F041FFF79F\r
+:1021100099BF12F8017F16F801CF6745D7D112F8A1\r
+:10212000017F16F8010F8742D1D10131A94201F197\r
+:102130000101EED1CEE70123E4E721682046CB6E12\r
+:10214000616E9847A36DAAE7D51A012380F82B305A\r
+:102150000421FFF76FF9ADB2A36D99E7BDE8F081F7\r
+:10216000836D2DE9F0411546C26EEF189742044683\r
+:102170000E4657D8002D2ED0002115F0010F1CD18E\r
+:10218000A26E606EB3FBF2F102FB113396F800C051\r
+:102190000121A94200F803C01CDAA36D0DE0A16D76\r
+:1021A000A36E676EB1FBF3F003FB101316F802C0C9\r
+:1021B000BF1807F803C0A36D511CA26E676EB3FB76\r
+:1021C000F2F002FB103C705C4A1CAA42394401F850\r
+:1021D0000C00E4DBA36DA06E5B19B3FBF0FC00FB0D\r
+:1021E0001C32002A28D0E06DD4F853C0421BC5EB46\r
+:1021F0000C05A365E265C4F853506AB994F82B3016\r
+:10220000A3F10102514241EB0203204684F857300A\r
+:10221000BDE8F041FFF716BF94F82B30022BEFD149\r
+:10222000BDE8F081D31A012280F82B2004219DB251\r
+:10223000FFF700F9A36D9DE721682046D1F88030B3\r
+:10224000984710F0040F02D0A16D6B18CBE72068FF\r
+:10225000A66DA26E036F616E2046B6FBF2F2984740\r
+:10226000F2E700BFF0B587B001AC074D2746064640\r
+:102270000FCD0FC72D883046214612223D80FFF733\r
+:1022800045FE07B0F0BD00BF90FB0000436B10B5EA\r
+:10229000044633B190F9381000290ADB0421FFF716\r
+:1022A000C9F8002084F857002046BDE81040FFF729\r
+:1022B000C9BE0521FFF7BEF8F3E700BF70B5C56DD5\r
+:1022C000836D402D28BF4025C26EE918914282B02F\r
+:1022D000044603D9D51A012280F82B20A16EB3FB46\r
+:1022E000F1F201FB123000282BD001FB123E636E8D\r
+:1022F000052103EB0E022046ABB240260096FFF705\r
+:1023000053FDA06DE16DD4F853C042194B1BC5EBD2\r
+:102310000C05A265E365C4F8535053B194F82B2023\r
+:10232000022A04D0012184F8571084F82B2002B02F\r
+:1023300070BD94F82B20022AF4D184F85730032280\r
+:10234000F3E72668616EF36E20469847A36DA16E91\r
+:10235000B3FBF1F2C9E700BF90F82B1010B54B1E8C\r
+:102360000446032B0AD8DFE803F00B020F1390F8A2\r
+:102370003B30282B11D12046FFF7A0FF012010BDD4\r
+:102380000521FFF757F82046FFF75CFE012010BD3E\r
+:10239000002280F82B20012010BDA82BEBD00120BB\r
+:1023A00010BD00BF38B590F83E3090F83D201904BC\r
+:1023B00090F840C041EA026590F83F200446816EE3\r
+:1023C00045EA0C0040EA022301FB03F394F83B20AA\r
+:1023D000A3652F2A1ED019D9A82A2FD0AA2A2DD01A\r
+:1023E000656BE36515B3AB4246D094F938E0BEF1B6\r
+:1023F000000F35DB20460421FFF71CF8012084F88C\r
+:1024000057002046FFF71EFE002038BD282A01D0C5\r
+:102410002A2AE5D194F8435094F842C045EA0C20AA\r
+:1024200001FB00F3656BE365002DDCD10121204643\r
+:1024300084F85710FFF706FE284638BD94F842503E\r
+:1024400094F841202B0494F8440043EA026C94F879\r
+:1024500043504CEA000343EA052201FB02F3BFE7C5\r
+:1024600020460521FEF7E6FF012084F857002046AC\r
+:10247000FFF7E8FD002038BD012038BD1F2A2DE9F7\r
+:10248000F041044601D0BDE8F0814E688B68CA680F\r
+:102490000F684363C762826306634D690E69D1F8B2\r
+:1024A00018C0C26AC6630564C0F844C0524B8D8B25\r
+:1024B000897F9A42A0F8485080F84A10E3D190F8FA\r
+:1024C0003A30016B013B426B5FFA83FCBCF10F0FAA\r
+:1024D000C0F84F10C0F853202DD890F83B30252B72\r
+:1024E0000FD012D8122B3ED02CD8002B37D0032B74\r
+:1024F0003DD00122204684F85720BDE8F041FFF787\r
+:10250000A1BDBDE8F041FFF721BD2F2B48D021D858\r
+:10251000282B30D02A2BECD12046FFF743FF002890\r
+:10252000B1D094F938E0BEF1000F61DB022384F8EA\r
+:102530002B30BDE8F081012280F85720BDE8F04142\r
+:10254000FFF780BD1A2B41D0232BD2D1BDE8F0413B\r
+:10255000FFF722BDA82B0ED0AA2BCAD1DCE7BDE81D\r
+:10256000F041FFF793BEBDE8F041FFF743BDBDE882\r
+:10257000F041FFF777BE2046FFF714FF002882D016\r
+:1025800094F9380000282BDB20460421FEF752FF87\r
+:102590000222204684F85720BDE8F041FFF752BDE3\r
+:1025A00090F83CC01CF0020314D0FFF7FBFE00289B\r
+:1025B0003FF469AF94F93800002819DB02230121A8\r
+:1025C00084F82B3084F86010BDE8F081BDE8F0415C\r
+:1025D000FFF726BD80F85730BDE8F041FFF732BD68\r
+:1025E0000221204684F82B10BDE8F041FFF766BEBB\r
+:1025F00020460521CAE700BF5553424330B50025A8\r
+:1026000095B004460DF14E03ADF84E50042103AAD7\r
+:1026100040250095FFF7E4FB94F82B306BB920467A\r
+:1026200003A9BDF84E20FFF729FF204604214022D0\r
+:10263000FFF7B0FB012015B030BD022B0AD02046B9\r
+:102640000421FEF7F7FE022384F857302046FFF7F7\r
+:10265000F9FCEAE794F83B302F2B0AD0AA2B01D0E3\r
+:102660002A2BE2D1204603A9BDF84E20FFF778FDC2\r
+:10267000DBE7204603A9BDF84E20FFF7FFFCD4E7B7\r
+:102680000648804706480047FEE7FEE7FEE7FEE70C\r
+:10269000FEE7FEE7FEE7FEE7FEE7FEE7D10100000A\r
+:1026A000C500000003460846194603F0FBBF00982A\r
+:1026B000904214BF01200620704738B514461D46CD\r
+:1026C00000F0CFF928B1012008232C60EB60023B19\r
+:1026D0002B7138BD2DE9F0419846069F0446089BB2\r
+:1026E0001546099E9F420CD1079900F0BAF940B1F6\r
+:1026F000757103E0012337603571B3710020BDE8C7\r
+:10270000F0812046414600F0ACF90028F2D1F5E70F\r
+:10271000F8B505460C4616461F4600F0A2F940B92A\r
+:10272000032F07D823682046294632465B6998471D\r
+:10273000F8BD0120F8BD0000034B10B5044603604E\r
+:1027400000F074F9204610BDB0FB000010B504463F\r
+:10275000FFF7F2FF204600F025F8204610BD0022CA\r
+:10276000816002600271C2607047F0B5064685B0B4\r
+:102770000F46684610211446FFF7F1FF33683046D4\r
+:10278000394622689D696B46A8479DF8043003F0DE\r
+:102790000603062B03D1009B0120236000E00020EC\r
+:1027A00005B0F0BD08B104F01BBD7047FFF7FABFDC\r
+:1027B00000F00600A0F10603584240EB030070470A\r
+:1027C000401870470022816002600271427182717C\r
+:1027D0007047F7B50E1E089C07DB1046FFF7F0FFA9\r
+:1027E000844214BF0120062008E016F1020F04D035\r
+:1027F000056800942C6AA04700E00120FEBD2DE989\r
+:10280000F0471D46036888B088461646A3F10807BE\r
+:10281000044653F8081CFFF7D3FFD7F8049005AF20\r
+:10282000102182463846FFF7CDFFD9F800304846E0\r
+:10283000CDF800A0CDF80480294602940622039723\r
+:10284000DF693346B847059F3FB39DF81A90484665\r
+:10285000FFF7AEFF08BB9DF819A09DF818000AEA23\r
+:102860000000FFF7A5FFC0B90AF0050ABAF1040F8E\r
+:1028700012D0B9F1000F08D1304629463A464346F6\r
+:102880000094FFF7A6FF8DF81A009DF81A00FFF7D5\r
+:102890008FFF08B1059F00E00746384608B0BDE845\r
+:1028A000F08741707047026808B512F0010F08D137\r
+:1028B00043780BB103F0D2FE0121FFF7F2FF0120B4\r
+:1028C00008BD002008BD10B504460021FFF7E9FF50\r
+:1028D0000123236010BD000010B5002814BF04467A\r
+:1028E000012405E0054B1B680BB903F0B7FE9847C0\r
+:1028F000204604F06DFC0028F4D010BD5C080010E8\r
+:10290000FFF7EABF08B51B220249022007F072F860\r
+:1029100000F056FB06FC0000F8B504460F461646CC\r
+:102920001D46FFF7CAFE38B9A0683946324603682B\r
+:102930009C692B46A047F8BD0120F8BD2DE9F04F5A\r
+:1029400085B00C461946054616461F46DDF83890F8\r
+:10295000DDF840A0DDF8448000F083F88346B0B194\r
+:10296000002CC8F8009088F8046009DB4C44A245AC\r
+:1029700014BF4FF0010A4FF0060A88F806A011E0D4\r
+:1029800014F1020F0ED1012388F806300AE0D14578\r
+:102990000CD128460F9900F064F838B188F805602A\r
+:1029A000584600E0002005B0BDE8F08FA868214639\r
+:1029B0000F9A036801923246CDF80090CDF808A036\r
+:1029C000CDF80C80DD693B46A847ECE72DE9F341E3\r
+:1029D0000446DDF820800D4617461E46904506D178\r
+:1029E000194600F03EF810B10620BDE8FC81A06851\r
+:1029F00029463A460368CDF800801C6A3346A04752\r
+:102A0000F3E70000034B10B504460360FFF794FEA4\r
+:102A1000204610BD30FC000010B50446FFF7F2FF61\r
+:102A20002046FFF7BFFE204610BD0000014B0360AB\r
+:102A3000704700BFB0FC00000020704700207047C6\r
+:102A40000020704710B50446FFF7F0FF2046FFF75F\r
+:102A5000A9FE204610BD406803782A2B08BF01302C\r
+:102A60007047814238B50D4611D0FFF7F4FF037867\r
+:102A700004462A2B0DD02846FFF7EDFF01462046DD\r
+:102A800005F079F8D0F1010038BF002038BD0120F1\r
+:102A900038BD002038BDFFF7E4BF032894BF0020F5\r
+:102AA0000120704700F0010070474018704709B1DD\r
+:102AB00003689A581146FFF7F8BF0000034B10B5A2\r
+:102AC00004460360FFF738FE204610BD08FD0000F5\r
+:102AD00010B50446FFF7F2FF2046FFF763FE2046DD\r
+:102AE00010BD406800F0010070474068C0F340002E\r
+:102AF00070474068001270472DE9F74F8B460C99DC\r
+:102B00000546924699468A423BD11946FFF7A9FFEE\r
+:102B1000002832D135E0013CA61C05EBC606304644\r
+:102B2000FFF7E3FF18B33046FFF7E3FF07463046F1\r
+:102B3000FFF7D7FF064610B11BF1030F17D03A4637\r
+:102B400031465046FFF7B3FF0C99024658F8080C7F\r
+:102B50000368009159461F6A4B46B8470746FFF77E\r
+:102B60009CFF20B156B147F00107FFB206E0A8F183\r
+:102B70000808002CCFD1012700E006273846BDE821\r
+:102B8000FE8FEC6804F1020805EBC808F1E72DE9B7\r
+:102B9000F04F89B00546924603911C46FFF78DFD24\r
+:102BA000002840F08D80D4F80890D5F80C8019F0FA\r
+:102BB000100F08F1020618BFD5F8089005EBC606FD\r
+:102BC00076E0494608F1FF3804A8FFF7C8FD08F190\r
+:102BD000020305EBC30301931846FFF78AFF019B2D\r
+:102BE00007461846FFF77DFF019B83461846FFF70F\r
+:102BF0007CFF029010B919F0010F58D0BAF1000F04\r
+:102C000006D03A4650465946FFF751FF024600E0CB\r
+:102C1000524656F8080C039903689F6904ABB847FD\r
+:102C2000002844D0079B082B05D1BBF1000F02D030\r
+:102C300056F8083C07939DF814703846FFF72DFFAF\r
+:102C400028B1029B1BB927F002078DF81470E168C8\r
+:102C5000C9B904AB0FCB84E80F0027793846FFF7DA\r
+:102C60001CFF00282CD017F0020F03D0AB6813F024\r
+:102C7000010F06E03846FFF715FF08B3AB6813F005\r
+:102C8000020F14D11CE02368049A934203D000235E\r
+:102C90002360023309E0BBB90798082804D008294B\r
+:102CA00002D0FFF7DEFE78B90223237108E0083E68\r
+:102CB000B8F1000F85D12079003818BF012000E05D\r
+:102CC000012009B0BDE8F08F23799DF8142042EA75\r
+:102CD00003032371EBE72DE9F04F91B007468946D6\r
+:102CE0001D9C07930692A3681A9A13F0100F1CBF3D\r
+:102CF0008368A3601C9B9A4240F03E811B99FFF7BA\r
+:102D0000B0FE002800F03881069A62712EE11A9B0D\r
+:102D1000B9F1000F069A236022710ADB1846494672\r
+:102D2000FFF7C3FE1C9B834214BF01200620A07145\r
+:102D30001CE119F1020F40F019810123A37115E183\r
+:102D4000B9F1000F04DB1C98C9F10001FFF7ADFEDB\r
+:102D50004FF0000801220890CDF82C80099201E084\r
+:102D6000CDF824A0D7F80CA00AF1020307EBC303A7\r
+:102D70000A93F0E00AF1FF3AA1680AF102050DA8F2\r
+:102D8000FFF720FD07EBC5052846FFF7B2FE834697\r
+:102D90002846FFF7A6FE014618B1069B43F0010640\r
+:102DA00000E0069E5A461A98FFF781FE089A83466D\r
+:102DB0003AB19042099A94BF00230123934200F054\r
+:102DC000C5802846FFF791FE48B919F1020F04D1DA\r
+:102DD000A36813F0030F00F0BB8006F0FD060A9B0A\r
+:102DE00049461B9A53F8080C036801921C9ACDF8C7\r
+:102DF00000B002920DAA03923246DD69079BA847F4\r
+:102E00009DF83A5063799DF83920062D42EA030374\r
+:102E1000637101D0022D06D10D9BA57123609DF831\r
+:102E200038302371A5E0D4F800B0B8F1000F10D10C\r
+:102E3000BBF1000F0DD10D9A9DF838102260217161\r
+:102E4000002A7ED0002B7CD0BB6813F0010F78D114\r
+:102E50008FE0BBF1000F0BD00D9A934506D123797B\r
+:102E60009DF8382042EA030323716BE032B928B998\r
+:102E70000D9A002A66D0B8F1000F63D01846A679E3\r
+:102E80000593FFF70AFE059B00287DD01846FFF743\r
+:102E900009FE18B1A36813F0020F75D1002E08BF08\r
+:102EA0000126002D08BF01251EE02846FFF7F5FD8D\r
+:102EB00000286CD02846FFF7F5FD18B1BB6813F069\r
+:102EC000020F64D101267DB93046FFF7E6FD0028E8\r
+:102ED00067D03046FFF7E6FD28B1BB6813F0020F5C\r
+:102EE0005FD1013500E0012586EA0500C0B2FFF799\r
+:102EF000D4FD8346A0B12846FFF7CFFD38B10D9B26\r
+:102F00002E464FF0000823609DF83830237116F0EC\r
+:102F1000020FA6712AD13046FFF7C4FD90B928E010\r
+:102F200006EA05054FF00108E8B2FFF7B6FD20B14B\r
+:102F30000223C4F800B0A3711AE0206084F8068070\r
+:102F400000E080466379042B02D111E001230B934A\r
+:102F50000A9A083A0A92BAF1000F7FF40BAF0B9B62\r
+:102F600033B1099A002A7FF4FBAE01E0002000E0B3\r
+:102F7000404611B0BDE8F08F38460799FFF771FD64\r
+:102F800000287FF4C4AEDBE6002E9CD18DE71C9BAD\r
+:102F9000494607985A4600931B9BFFF71AFC0646C2\r
+:102FA00091E71C9A494607981B9B00920D9AFFF7E0\r
+:102FB00010FC054698E708B5804703F04FFB00007A\r
+:102FC00008B5024B1868FFF7F6FF00BF9C01001020\r
+:102FD0001D4B73B51E781D4C16B123681C482DE09F\r
+:102FE00001221A7002F08EFB30B3FFF734FD02AB02\r
+:102FF00031464FF0FF3243F8042D3246054602F0C9\r
+:1030000011FB2368D9680646124803F065FD019B51\r
+:1030100013B92368304601E023682846D96803F0D5\r
+:103020005BFD23680C48D96803F056FD019B43B94A\r
+:10303000304604F0D5F804E023680848D96803F066\r
+:103040004BFD03F00BFB00BF600800109002001066\r
+:1030500030FD00004EFD00007FFD000082FD0000FD\r
+:103060004269034681698A4206DA01690C2000FB45\r
+:10307000021001325A6170470020704770B51E4639\r
+:103080004B1E0C461546402B2FD8DFE803F02121BC\r
+:1030900021212E2E2E2E24242124242424242424D1\r
+:1030A0002424242E272727272727212424242424C7\r
+:1030B0002E242726212E2127272E2E2421212121AF\r
+:1030C0002121212124212E2E2424242E2E2E2400C1\r
+:1030D0007DB11EB90BE00DB90BE066B1FFF7C0FF83\r
+:1030E00050B104704560866070BD002070BD3046F0\r
+:1030F00070BD284670BD304670BD38B50C461546CB\r
+:10310000FFF7AEFF48B12CB135B100234460037026\r
+:10311000856038BD204638BD284638BD10B50C4600\r
+:1031200031B1FFF79DFF20B123234460037010BD30\r
+:10313000084610BD38B50C461546FFF791FF18B18B\r
+:10314000162344600370856038BD70B504460D4693\r
+:103150001646C36822E0E2680132722BE26005D1B4\r
+:10316000002E0CBF17211A21236B06E0562B236B70\r
+:1031700005D1002E0CBF18211B21093304E0002EBD\r
+:103180000CBF19211C21063300222363204613465D\r
+:10319000FFF774FF286048B1E368051D1B78562BC4\r
+:1031A000D9D0722BD7D04B2B01D1D4E70546284676\r
+:1031B00070BD51B1036A426A934208DAC26942F8AB\r
+:1031C0002310013303620120704708467047002036\r
+:1031D0007047C36870B504461A78532A6FD15A1CD9\r
+:1031E000C2605B781BB101325F2BC2602ED0A3F1AD\r
+:1031F0003002D2B2092A01D8002206E0A3F141022E\r
+:10320000D2B2192AF8D92CE00A46A3F13001C9B28A\r
+:10321000092905D8242101FB0233A3F1300109E07B\r
+:10322000A3F14101C9B2192949D8242101FB023374\r
+:10323000A3F13701914242D3E2681378002BE3D027\r
+:1032400001325F2BE260DFD1013100E00021236A0F\r
+:10325000994236D2A36A0133A362E36953F821008D\r
+:1032600070BDA26812F0080F09D151B1E26816785A\r
+:10327000433EF6B2012E8CBF0026012602E0012655\r
+:1032800000E00E46002210498D18895C994213D146\r
+:10329000696921B12046AA69FFF74CFFE06216B1C7\r
+:1032A000E9682A6901E06968AA68236B20469B18CF\r
+:1032B0002363BDE870403DE71C32C42AE3D10020FF\r
+:1032C00070BD002070BD00BFB0FD0000D0F804113B\r
+:1032D00038B5044643180025D4F810211D71D0F8E4\r
+:1032E0000C3104309847D4F82431C4F80451013328\r
+:1032F000C4F8243138BD38B50446D0F804310D4641\r
+:10330000FF2B01D1FFF7E2FFD4F8043184F8085114\r
+:10331000E2180133C4F80431157138BDF8B505461B\r
+:103320000C461746002604E0A15D2846FFF7E3FFA0\r
+:103330000136BE42F8D1F8BD06E003782B2B09D147\r
+:10334000002903DD806801390028F6D121B920B1B8\r
+:1033500040687047002070470020704770B50446F1\r
+:1033600008460D4604F01AFC294602462046BDE8F0\r
+:103370007040D3E710B588B004460A4601A8044956\r
+:1033800004F064FB204601A9FFF7E8FF08B010BD78\r
+:10339000550B0100C36870B50446C3B98568002D9C\r
+:1033A00008BF022500E06D008D42FCD3206829464D\r
+:1033B00004F06CF9064640B9206803F011FF0123C0\r
+:1033C00026606660A660E36070BD2060A56070BD89\r
+:1033D000F8B50D46516807469368144601314919FE\r
+:1033E000994202D91046FFF7D5FFE6686EB96368C7\r
+:1033F0002A4620683946C01804F01AF92268636822\r
+:103400005219D65463685D196560F8BD036810B53C\r
+:103410001A786E2A04D15A1C012102605A7800E001\r
+:1034200000210023A2F13004E4B2092C03D901B138\r
+:103430005B42184610BD0A2404FB03230268541C97\r
+:103440000460303B5278EDE738B5044629B9C368CB\r
+:10345000187810B301460133E360682902D104F102\r
+:103460000C000DE0762915D104F10C052846FFF774\r
+:10347000CDFFE3681A785F2A0CD128460133E36058\r
+:10348000FFF7C4FFE3681A785F2A05D101330120F2\r
+:10349000E36038BD002038BD002038BDC36810B5DA\r
+:1034A00004461B785F2B06D06E2B0CD00C30FFF738\r
+:1034B000ADFF013000E00020E3681A785F2A05D1F3\r
+:1034C0000133E36010BD4FF0FF3010BD4FF0FF300F\r
+:1034D00010BD38B50446C3681A78542A10D1013398\r
+:1034E000C360FFF7DBFF051E0CDBA36A2046013338\r
+:1034F000A362FFF7B5FD30B105234560037038BD09\r
+:10350000002038BD002038BD08B5C3681A785F2A8E\r
+:1035100007D1013340F80C3FFFF778FFC043C00FDD\r
+:1035200008BD012008BD70B504460C30FFF76EFFE2\r
+:10353000061E34DDE56863685B1BB3422CDBA268C2\r
+:10354000AB19E36012F0040F04D0AA5D242A01D164\r
+:103550000133E360092E19DD28461249082204F0E0\r
+:1035600059F898B92B7A05F108022E2B03D05F2B5E\r
+:1035700001D0242B0AD153784E2B07D1236B204640\r
+:103580000949152216339E1B266302E02046294670\r
+:103590003246FFF7B2FD00E00020E06270BD00207F\r
+:1035A00070BD00BF440401004D040100C3682DE953\r
+:1035B000F04104461A780D46472A02D0542A40F0BA\r
+:1035C0003781226B02F1140121631978542905D146\r
+:1035D000581CE060597829B90E467DE1472940F032\r
+:1035E00025819EE001305329E06037D00DD846296F\r
+:1035F00000F0898003D8432940F0188167E0492909\r
+:1036000025D04A2940F0128184E0632949D005D8A9\r
+:10361000542912D0562940F0098105E0682924D0A8\r
+:10362000762940F003812EE00F322046226300F01D\r
+:1036300038FB09210246204607E00A322046226371\r
+:1036400000F02FFB0A2102462046002340E12046DD\r
+:1036500000F027FB0C2102462046F6E7204600F04A\r
+:1036600020FB0D2102462046EFE72046FFF7ECFE47\r
+:10367000002800F0D98000212046FFF797FF0F2196\r
+:1036800002462046E1E72046FFF7DEFE002800F074\r
+:10369000CB8000212046FFF789FF102102462046FB\r
+:1036A000D3E720460021FFF7CFFE002800F0BC80C2\r
+:1036B00020460021FFF7C8FE002800F0B580002159\r
+:1036C0002046FFF773FF112102462046BDE7204642\r
+:1036D00000F0E7FA054604F10C00FFF797FE00281A\r
+:1036E000C0F2A480E3681A785F2A40F09F8001331B\r
+:1036F0002046E36000F0D5FA236B0B2105332363EA\r
+:1037000002462046E3E0204600F0CBFA0E210246B6\r
+:1037100020469AE7204600F0C4FA122102462046CD\r
+:1037200093E75A1CE2605E78002E00F0D5809A1C68\r
+:10373000522EE2600FD002D8412E77D112E0562EE1\r
+:1037400002D0722E72D115E0204600F078F91321D4\r
+:103750000246204679E7204600F071F9142102461E\r
+:10376000204672E700212046FFF720FF1521024680\r
+:1037700020466AE704F10C00FFF748FE012855DDFA\r
+:10378000E5682E78002E00F0A78001355F2EE560F9\r
+:103790004CD1461E4FF0000800E098462F78002FCD\r
+:1037A0003ED0242F1CD16B78532B04D05F2B04D038\r
+:1037B000242B3BD102E02F2700E02E272046FFF7E5\r
+:1037C0004FFC034610B1392247600270E5680235AC\r
+:1037D000E5603BB3023E13E00137B74201DB04E092\r
+:1037E0000027EB5D0BB1242BF6D1294620463A4643\r
+:1037F000FFF783FCE568ED19E5600346A0B1F61B11\r
+:10380000B8F1000F06D0204638214246FFF736FCBB\r
+:10381000034648B1002EC0DC204637211A4614E783\r
+:103820003E4659E01E4657E0064655E0002653E066\r
+:1038300000F005F90646C0B1BDB1A36813F0010F51\r
+:1038400013D100E076683378A3F11A02D2B2022ACB\r
+:10385000F8D9022B40D1B36800E05B681A781A3AB5\r
+:10386000D2B2022AF9D9B36036E0E3681B78002EA1\r
+:1038700032D0002B30D0452B2ED031460B78042B84\r
+:1038800004D01CD31A3B022B19D814E0496879B133\r
+:103890000B78082B05D8072B09D2013B012B02D846\r
+:1038A00003E02E2B03D0002102E08968EFE701211D\r
+:1038B00081F0010104E049680029DFD100E0002126\r
+:1038C000204600F05EFC03213246054620462B468A\r
+:1038D000BDE8F041FFF7D2BB3046BDE8F081C368D8\r
+:1038E0001A785F2A0AD10133C360C3681A785A2A4A\r
+:1038F00002D10133C36059E6002070470029FBD193\r
+:10390000F3E7C36870B504461A784C2A3DD15A1CB7\r
+:10391000C2605B785F2B01D05A2B04D12046002176\r
+:10392000FFF7DDFF2AE000F0BCF9054600282ED0A5\r
+:103930000378232B06D143681A7C1AB1226B5B688B\r
+:10394000D31A2363E3681A786E2A03D1013336262B\r
+:10395000E36000E03526E16802E0D0B10132E260C8\r
+:10396000E26810784528F8D1521A2046FFF7C5FBC7\r
+:1039700031462A4603462046FFF780FBE3681A7863\r
+:10398000452A05D10133E36070BD002070BD70BDD4\r
+:10399000002070BDC36873B504461A78C66A492A08\r
+:1039A00048D15A1CC2605B78452B09D10132C260F4\r
+:1039B00000222B21134602B0BDE87040FFF75EBB2A\r
+:1039C00002AD002345F8043DE26813784C2B11D07A\r
+:1039D000582B02D0492B15D110E001322046E2606D\r
+:1039E00000F015FDE36819784529024622D101331C\r
+:1039F000E3600BE02046FFF784FF06E02046FFF778\r
+:103A0000C9FF02E0204600F04CF90246A2B1204670\r
+:103A10002B210023FFF732FB286070B1E3681A788E\r
+:103A2000452A02D000F10805CEE70133E662E360E3\r
+:103A3000019802E0002000E0104602B070BDC368AB\r
+:103A40002DE9F34104461A784C3A0E2A00F205811A\r
+:103A5000DFE812F0D70003010F00030103010301A7\r
+:103A60000301DA000301D70003010301030103018D\r
+:103A70008700013301A9C3600122FFF766FB0646F8\r
+:103A8000002800F003814FF0000800E0B846E3682A\r
+:103A90001D78002D52D0A5F13002D2B2092A0DD9DD\r
+:103AA000A5F16102D2B2192A08D9A5F14302D1B217\r
+:103AB000122907D8774952B2914003D5204600F029\r
+:103AC000E1FB16E0532D04D120460121FFF781FBD5\r
+:103AD0000FE0492D08D1B8F1000F33D02046FFF791\r
+:103AE00059FF0421074615E0542D07D12046FFF762\r
+:103AF000F0FC0746B8F1000F0BD111E0452D21D0A5\r
+:103B00004D2D1DD1B8F1000F1CD001334746E360A5\r
+:103B1000BCE701213B4620464246FFF7AFFA074685\r
+:103B2000532DB3D0E3681B78452BAFD020463946E0\r
+:103B3000FFF73FFB0028A9D1804603E0A84601E03B\r
+:103B40004FF00008C6F80080B8F1000F07D0E36816\r
+:103B50001A78452A53D10133019EE36096E0464628\r
+:103B600094E001330021C360FFF720FDE3681A7879\r
+:103B7000452A074643D15A1CE2605B78732B10D16B\r
+:103B800001322046E260FFF7BFFC00287DD04249A9\r
+:103B90000E222046FFF7B1FA02213A46034620469C\r
+:103BA0006EE0642B08D101322046E260FFF776FC1C\r
+:103BB000B0F1000802DA22E04FF0FF382046FFF7AC\r
+:103BC0003EFF054648B103783E2B06D0402B04D07B\r
+:103BD0002046FFF799FC002857D0B8F1FF3F09D0E5\r
+:103BE0002046FFF73DFA20B13F23C0F8088003705C\r
+:103BF00045600546204602213A462B4640E0002615\r
+:103C000044E000F03FFB40E05A78742A05D00021E0\r
+:103C10000125FFF7DEFA064614E002331F49C360B0\r
+:103C20000322FFF76AFA0546204600F02BFB2A46DE\r
+:103C30000121002503462046FFF720FA236B0333BA\r
+:103C400023630646E3681B78492B1FD18DB92046B4\r
+:103C50003146FFF7AEFA60B915E000F013FBE368F8\r
+:103C60001B78492B064611D120463146FFF7A1FAB1\r
+:103C700058B12046FFF78EFE042132460346204607\r
+:103C8000FFF7FCF901E02E4600E006463046BDE8AD\r
+:103C9000FC8100BF002040C06304010072040100E9\r
+:103CA000CDE6F7B50446C2681378562B03D0722BC5\r
+:103CB00001D04B2B10D1204601A90022FFF745FA75\r
+:103CC0000546002800F019822046FFF7EAFF286029\r
+:103CD000002800F0118212E2A3F130014A2900F21B\r
+:103CE0000982DFE811F0770077007700770077002E\r
+:103CF0007700770077007700770007020702070256\r
+:103D000007020702070207027B000702250149019B\r
+:103D1000070265002E0107020702070207020702D9\r
+:103D2000A80077000A01130107021C01DF00CD0083\r
+:103D30003B0107020702070207027700070207029A\r
+:103D400007020702070207024B004B004B004B0023\r
+:103D50004B004B004B004B004B004B0007024B004D\r
+:103D60004B004B004B000702070207024B004B00C1\r
+:103D70005C004B004B004B004B004B00934A14215E\r
+:103D8000204601FB0321FFF7C9F9226B436801902C\r
+:103D90005B68D3182363E3680133E360A8E1013271\r
+:103DA0002046E260FFF7BFFB242102462046D0E018\r
+:103DB000531CE3605278592A01D10133E360012199\r
+:103DC000204600F0DEF9E3681A78452A31D1013344\r
+:103DD000E360C1E02046FFF763FFBDE0511CE160F6\r
+:103DE00053785F2B17D0303BDBB2092B0CD8E3683C\r
+:103DF0005A1CE2605B78303BDBB2092BF7D92046D6\r
+:103E0000521AFFF77AF902E0204600F000FB05465F\r
+:103E1000002834D000E00025E3681A785F2A08D132\r
+:103E200001332046E360FFF73CFF2621034620468E\r
+:103E300055E0002090E001322046E2606D46FFF739\r
+:103E400030FF6946012206462046FFF77EF9074605\r
+:103E5000A8B12046FFF725FF386000287CD0AF428C\r
+:103E600008D00378252B05D020460099FFF7A1F94B\r
+:103E7000002871D0204627213246009B6AE06BE083\r
+:103E80002046FFF726FBE368019001461B78492B8B\r
+:103E900040F035812046FFF78CF9002800F02C8196\r
+:103EA000019D16E05378A3F13002D2B2092A05D958\r
+:103EB0005F2B03D0413BDBB2192B12D800212046E7\r
+:103EC000FFF787F9E368019005461B78492B40F01E\r
+:103ED0000F812046FFF75EFD0421034620462A4657\r
+:103EE00038E02046FFF7DCFE0190002800F0078153\r
+:103EF0000378162B40F00381FAE001322046E2609D\r
+:103F0000FFF7CFFE20210246204622E00132204664\r
+:103F1000E260FFF7C6FE1E210246204619E001328C\r
+:103F20002046E260FFF7BDFE1F210246204610E05A\r
+:103F300001322046E260FFF7B4FE2121024620460E\r
+:103F400007E001322046E260FFF7ABFE2221024685\r
+:103F500020460023FFF792F80190D0E0013220467E\r
+:103F6000E260FFF7E0FA01902046FFF79AFE1D217C\r
+:103F7000019B02462046EDE7531CE3605578002D77\r
+:103F800000F0BB805A1C682DE26049D00ED8642D29\r
+:103F900040D005D8462D54D0542D40F0AB8017E0CA\r
+:103FA000652D3AD0662D40F0A58030E0732D3AD0D3\r
+:103FB00005D8692D3AD0702D40F09C801FE0742DFB\r
+:103FC00006D0762D40F0968069E000BFE0F6000054\r
+:103FD000204600F01CFA3B21002302462046FFF752\r
+:103FE0004DF80190002800F08380E26813781BB13F\r
+:103FF0000132452BE2607BD00023019378E020461C\r
+:10400000FFF74FFE41210023024620466BE0204689\r
+:104010003E490DE020463E490AE020463D4907E082\r
+:1040200020463D4904E020463C4901E03C49204609\r
+:10403000FFF774F8226B019043685B68D318236321\r
+:1040400056E02046FFF70CF8282301900370E36840\r
+:104050001B78303BDBB2092B8CBF0023012303818B\r
+:104060001BB104F10C00FFF7D1F92046019DFFF7C9\r
+:1040700018FE019B68605D68002D3ED004F10C00C5\r
+:10408000FFF7C4F9E26813780BB10132E260A3F1E3\r
+:104090007302534243EB0203019A538128E05B7899\r
+:1040A0005F2B06D101322046E26000F0B0F90546F0\r
+:1040B0000BE02046FEF7D4FF0546B8B13A23037063\r
+:1040C00004F10C00FFF7A2F968607DB1E3681A788B\r
+:1040D0005F2A0BD101332046E360FFF7E2FD29217F\r
+:1040E0002A4603462046FEF7C9FF00E00020019063\r
+:1040F000019D02E0002500E005462846FEBD204661\r
+:104100000199FFF756F80028F2D1F5E77C0001008D\r
+:1041100090000100A4000100B8000100CC000100E3\r
+:10412000E000010037B5044602AD002345F8043D28\r
+:10413000E3681B7883B1452B0ED02046FFF7B1FD15\r
+:104140000246E0B120462A210023FEF797FF2860AF\r
+:10415000A0B100F10805EBE7019A82B1936873B949\r
+:104160005168087823280AD14968087C092806D1B3\r
+:10417000206B4968411A2163536000E002461046F3\r
+:104180003EBDC36870B504461A784A2A02D101338D\r
+:10419000C36000E029B12046FFF783FD054668B102\r
+:1041A00000E00D462046FFF7BDFF034638B120462C\r
+:1041B00025212A46BDE87040FEF760BF70BD70BD86\r
+:1041C000C3682DE9F0410446197809B10133C36091\r
+:1041D000E368187808B10133E360762917D1A0F1BC\r
+:1041E0003006F3B2092B21D82046FFF79CF905468B\r
+:1041F0002046FEF735FF00283FD02DB12D23466025\r
+:1042000003708560BDE8F0812846BDE8F081632930\r
+:104210000CD176280AD12046FFF743FD2E2100233A\r
+:1042200002462046BDE8F041FEF728BF34220023B5\r
+:10423000D61ADFF84CC006EBD6760CF5517503EBB9\r
+:1042400066063701ED196744D7F8447397F800C044\r
+:1042500061450BD17F78B84208D12046FEF700FFB8\r
+:1042600058B12C2345600370BDE8F08101D3731C65\r
+:1042700000E032469342DBD10020BDE8F08100BF70\r
+:10428000B0FD0000C3682DE9F04105461A78A2F19F\r
+:104290003001C9B2092903D8BDE8F041FFF743B99D\r
+:1042A000A2F16101C9B2192910D8FFF789FF0446AC\r
+:1042B000002800F0A98003782C2B40F0A5804368EB\r
+:1042C0002A6B9B68D31807332B639DE0A2F143014F\r
+:1042D000C9B2012946D8C36A3BB11A780AB1162A75\r
+:1042E00003D1026B9B68D3180363EB681A78432AE7\r
+:1042F00003D0442A40F0878017E05A78322A07D04A\r
+:10430000332A03D0312A7ED1012702E0032700E0BF\r
+:10431000022702332846EB60EE6AFEF7A1FE044650\r
+:10432000002871D0E6B1072316E05A78312A07D069\r
+:10433000322A03D0302A66D1012702E0032700E0A9\r
+:10434000022702332846EB60EE6AFEF789FE044638\r
+:10435000002859D026B1082303700771866053E006\r
+:10436000344651E04C2A0AD10133C360FFF7DBF831\r
+:104370000446002848D02846FFF7C6F83FE0552AF3\r
+:1043800041D159785A1C6C2902D074293BD120E0C4\r
+:10439000C2605B786C2B36D10132C260FFF7C2FE7F\r
+:1043A0000646A0B1EB681A78452A2CD1013328467D\r
+:1043B000EB60FFF773F8071E25DB2846FEF750FE7B\r
+:1043C0000446C0B13E2346600370876013E0044694\r
+:1043D0001AE0C2605B78742B15D10132C260FFF71E\r
+:1043E0005DF8061E0FDB2846FEF73AFE044610B1C4\r
+:1043F00040234660037028462146FEF7DAFE002877\r
+:1044000008BF002400E000242046BDE8F081C36816\r
+:104410002DE9F04104461A784C2A03D1BDE8F04159\r
+:10442000FFF76FBA542A03D1BDE8F041FFF751B846\r
+:10443000732A2CD1597872291ED10233C360FFF739\r
+:1044400030FC05462046FFF71DFFE3681B78492B2B\r
+:10445000064604D0204601212A463346DDE02046A8\r
+:10446000FFF798FA0421324603462046FEF706FE7F\r
+:10447000012103462046CFE070291FD10233C360DB\r
+:10448000FFF7C5FF4121002302462046C5E0662A0A\r
+:1044900014D15978702911D10233C360FEF7FEFFA1\r
+:1044A000061EC0F2BE802046FEF7DAFD0546002853\r
+:1044B00000F0B880062346600370B3E0A2F130013B\r
+:1044C000C9B2092906D96F2A17D15A786E2A14D190\r
+:1044D0000233E3602046FFF7D5FE0546002800F0D2\r
+:1044E000A180E3681B78492B40F09C802046FFF7B1\r
+:1044F00051FA0421034620468EE02046FFF760FE75\r
+:104500000546002800F08E8006782C2E0ED14368D8\r
+:10451000216B9A6818688A184449023A226303F0AA\r
+:104520002AFB48B92046FFF7BCFB1EE02D2E06D023\r
+:104530002E2E0DD02C2E74D16B68DB6800E0436802\r
+:10454000022B16D0032B4DD0012B6AD12E2E09D170\r
+:10455000E3681A785F2A05D101332046E36000F052\r
+:104560006DF802E02046FFF752FF03462F21204658\r
+:1045700052E06B6820461F68FFF749FF2C4906464A\r
+:10458000384603F0F8FA18B9204600F057F81EE054\r
+:104590003846284903F0EFFA20B13846264903F09F\r
+:1045A000EAFA88B92046FFF76DFEE3681B78492BCD\r
+:1045B00007460DD12046FFF7EDF904213A460346A0\r
+:1045C0002046FEF75BFD02E02046FFF720FF07468E\r
+:1045D00031213B4620463246FEF750FD302103464E\r
+:1045E000204619E02046FFF712FF06462046FFF757\r
+:1045F0000EFF07462046FFF70AFF34213A460346DE\r
+:104600002046FEF73BFD3321324603462046FEF7A7\r
+:1046100035FD3221034620462A46BDE8F041FEF72B\r
+:104620002DBD00252846BDE8F08100BF35060100FC\r
+:1046300076040100790401007C040100C36837B5E9\r
+:104640000022019204461978452901D001AD08E005\r
+:1046500001332A21C360134603B0BDE83040FEF7A2\r
+:104660000DBD2046FFF7D3FE024688B120462A2121\r
+:104670000023FEF703FD286050B1E3681A78452A4D\r
+:1046800002D000F10805ECE701330198E360FFE791\r
+:1046900003B030BD012303607047003818BF01200C\r
+:1046A000704710B5D0F814412CB900F58E70FFF7A3\r
+:1046B000F1FF204610BD636809689868BDE81040A6\r
+:1046C000FEF73ABE38B505460C46002C2DD02378AF\r
+:1046D000162B2CD00CD8062B29D004D8002B26D092\r
+:1046E000052B1BD110E0072B1DD0082B16D11AE08B\r
+:1046F0002D2B18D003D8232B19D02C2B02E0392BCB\r
+:1047000015D0412B0AD112E02846211DFFF7C9FF21\r
+:1047100070B103782B2B18BF002038BD2846616884\r
+:10472000FFF7D0FF20B9A468CFE7204638BD0020AE\r
+:1047300038BD73B50D46096804460B78042B02D0CA\r
+:1047400000F034F831E0D0F814210023D0F81861DB\r
+:10475000C0F8183102AB019143F8082DC0F81431AC\r
+:10476000496800F023F8009BC4F8143194F808312C\r
+:104770003C2B03D120462021FEF7BDFD3C212046E5\r
+:10478000FEF7B9FD2B682046996800F00FF894F801\r
+:1047900008313E2B03D120462021FEF7ACFD2046F8\r
+:1047A0003E21FEF7A8FDC4F818617CBD2DE9F04755\r
+:1047B000044692B00D4619B900F58E7000F0ABBCFE\r
+:1047C000D0F81C01FFF769FF002840F0A6842B7881\r
+:1047D000412B00F29E84DFE813F042008B008B0037\r
+:1047E00099001D015D01710433047B018001830187\r
+:1047F00086019101940197019A019D01A001A301F5\r
+:10480000A601A901AC01AF01B301B301B301C50118\r
+:10481000C501C501C501C501C501C501C501C50168\r
+:10482000F7017B0402023A029302AE029302CA022B\r
+:10483000CA02F4020A030F03180330039C047E0328\r
+:104840009C049C04A103A1032C042F043604270418\r
+:1048500039047404770480049C048E04440423689F\r
+:1048600013F0040F00F068816E68AD6875193BE0C5\r
+:10487000AB1B032B33DD33785F2B30D173785F2B89\r
+:104880002DD1B378552B2AD1F21C002119E012F852\r
+:10489000013BA3F130005FFA80FEBEF1090F01D8A1\r
+:1048A00003460CE0A3F14100C0B2052801D8373B14\r
+:1048B00005E0A3F16100C0B2052806D8573B03EB21\r
+:1048C0000111AA421746E2D309E05F2B07D1FF2965\r
+:1048D00005D82046C9B2FEF70EFD3E4603E020464D\r
+:1048E0003178FEF708FD0136AE42C1D300F015BCA9\r
+:1048F00020466968FFF75AFF236813F0040F02D1BE\r
+:104900002046A04975E220462E21E3E0D4F818A104\r
+:1049100000266B46C4F818616F681AE0042E00F098\r
+:10492000F883D4F8182100A9D4F814815F601A60C4\r
+:1049300001EB0612C4F8182100229A6001363A7879\r
+:10494000C3F80C801033A2F11A01C9B2022903D8AE\r
+:104950007F68002FE2D1DCE3042A06D112AB119765\r
+:1049600043F8088DC4F8143133E0022A31D1D7F866\r
+:1049700008C000AA02EB061E9CF800303F2B08BFBF\r
+:10498000DCF804C01FE0032E0EF1100E00F2C1830C\r
+:10499000AEF12003AEF110090FCB89E80F00731EB2\r
+:1049A00000A94EF81CCC01EB03134EF8148C4EF802\r
+:1049B000103C01EB0613C4F8183100234EF8183CE4\r
+:1049C0000136DCF804C09CF800301A3BDBB2022B45\r
+:1049D000D9D9A9682046FFF7E9FE3B7800AA042B45\r
+:1049E00002EB061504BF109BC4F814310DE055F816\r
+:1049F000083C013E43B920462021FEF77CFC2046BE\r
+:104A000055F80C1C00F0A4FB103D002EEFD1C4F8AB\r
+:104A100018A182E30023D4F81871C4F81831236870\r
+:104A20006E6813F0040F12D0337883B9B268062A87\r
+:104A30000DD17068544903F0B9F840B92046A9680F\r
+:104A4000FFF7B4FE20465149FEF788FC1FE02046E0\r
+:104A50003146FFF7ABFE94F808313C2B03D12046DA\r
+:104A60002021FEF748FC3C212046FEF744FC20466E\r
+:104A7000A968FFF79BFE94F808313E2B03D120462E\r
+:104A80002021FEF738FC20463E21FEF734FCC4F816\r
+:104A9000187142E3291D2046FFF703FE0146002856\r
+:104AA00000F0378303782B2B07D1D4F82011FEF7C1\r
+:104AB00043FC0146002800F02C83D4F81451204612\r
+:104AC0002B68C4F81431FFF771FEC4F8145124E3C5\r
+:104AD00020467E21FEF70FFCB2E220462C49F5E28B\r
+:104AE00020462C49F2E220462B49FEF737FC2046AF\r
+:104AF0006968FFF75BFE204628497AE1204628498D\r
+:104B0000E4E220462749E1E220462749DEE220464A\r
+:104B10002649DBE220462649D8E220462549D5E24F\r
+:104B200020462549D2E220462449CFE220462449A6\r
+:104B3000CCE220462349C9E220466968AA6853E1CD\r
+:104B4000D4F818210CE0916849B951680978A1F1AD\r
+:104B50001700C0B2022805D8994200F0B982126845\r
+:104B6000002AF0D1D4F8182112AB0195204643F861\r
+:104B7000482DC4F8183100230293D4F81431696821\r
+:104B80000393CCE06D0601007F040100CE08010014\r
+:104B90009C040100860401008F040100A8040100A8\r
+:104BA000AD040100BB040100CE040100DF040100DC\r
+:104BB000E3040100F50401001005010020050100D7\r
+:104BC000340501004D0501002368204613F0040F51\r
+:104BD0006B6807BF19685A689968DA6804E1236846\r
+:104BE00013F0200F05D020462946D4F8182100F0F4\r
+:104BF000CBFB6B68FBB1D4F8182112AB20460195B2\r
+:104C000043F8482DC4F8183100230293D4F8143126\r
+:104C100069680393FFF7CAFD009BC4F81831029B33\r
+:104C2000002B40F07A82236813F0200F03D1204636\r
+:104C30002021FEF760FB236813F0200F40F06D8207\r
+:104C400020462946D4F8182100F09EFB65E2D4F8EE\r
+:104C5000187112AB01950126BE4643F8487DC4F891\r
+:104C6000183100230293D4F8143103931FE0DEF8C7\r
+:104C70000830D3B9032E00F24C824FEA061912AB6A\r
+:104C800003EB09089EE80F00A8F1480C8CE80F0020\r
+:104C900000A9D4F8183148F8483C01EB0903C4F8DE\r
+:104CA00018310123F618CEF80830DEF800E0BEF126\r
+:104CB000000F06D0DEF804301B78173BDBB2022B66\r
+:104CC000D5D92046A968FFF771FD029BC4F8187179\r
+:104CD000002B40F02282771E00AA02EB0717043750\r
+:104CE00004E020463969013E00F032FA103F012EFF\r
+:104CF000F7D12046291DD4F8182100F00BFB0CE257\r
+:104D0000D4F8182112AB2046019543F8482DC4F879\r
+:104D100018310023A9680293D4F814310393FFF7E4\r
+:104D200045FD029B1BB92046294600F011FA009B65\r
+:104D3000C4F81831F1E1B5F90A301BB120469149A8\r
+:104D4000FEF70CFB6968904B4A689A4206D02046F1\r
+:104D5000FFF72CFD20462021FEF7CDFAB5F90830EB\r
+:104D600013B12046894987E12046894984E1696871\r
+:104D700011B12046FFF71AFDAB68002B00F0CD8182\r
+:104D8000D4F80431FD2B02D92046FEF79FFA2046C5\r
+:104D90008049FEF7E3FA2046A968D4F82471D4F8D4\r
+:104DA0000461FFF703FDD4F82431BB4240F0B58124\r
+:104DB000D4F80431B34240F0B081023BC4F804316E\r
+:104DC000ABE120467449FEF7C9FA6B685B681B7853\r
+:104DD000613BDBB2192B03D820462021FEF78BFA6A\r
+:104DE0006B68204659689A68FEF798FA95E16B4916\r
+:104DF0002046FEF7B3FA23E120466849FEF7AEFAF3\r
+:104E00002046291DFFF795FC87E169680B782E2B5A\r
+:104E100003D0204600F01AFB0CE020462821FEF7C4\r
+:104E20006AFA696820460431FFF783FC204629218D\r
+:104E3000FEF761FA2046A9686DE0AB681B78312B5C\r
+:104E400040F067816B681A782C2A0BD15B689A68EE\r
+:104E5000012A07D15B681B783E2B03D1204628210D\r
+:104E6000FEF749FAAB682046596800F0F9FA6E6817\r
+:104E70004B4973681F68384602F07DFE68B92046CA\r
+:104E80005B21FEF738FAAB6820469968FFF78EFC85\r
+:104E900020465D21FEF72FFA0DE03846414902F029\r
+:104EA0006AFE18B12046314600F0D0FAAB682046C1\r
+:104EB000996800F0D5FA6B681A782C2A40F02D8199\r
+:104EC0005B689A68012A40F028815B681B783E2B5A\r
+:104ED00040F02381C2E0AB681A78332A40F0198190\r
+:104EE0009A681278342A40F014815968204600F0FC\r
+:104EF000B7FA2046696800F0A9FAAB6820469B68BB\r
+:104F0000596800F0ADFA20462749FEF727FAAB684A\r
+:104F100020469B68996800F0A3FAFEE06A68117861\r
+:104F200023295ED15268167C002E5BD0062E02D952\r
+:104F3000072E57D140E0AA681278002A52D1362BAA\r
+:104F400003D120462D21FEF7D6F92046A968023E5E\r
+:104F5000FFF72CFC042E00F2E080DFE806F00306E9\r
+:104F6000090C0F0020467521D0E020466C21CDE0D1\r
+:104F700020460E4980E020460D497DE020460D493F\r
+:104F80007AE000BF5F05010014FF00006505010025\r
+:104F90006C05010073050100760501007F05010025\r
+:104FA00089050100760401008C05010090050100CF\r
+:104FB0009405010093050100AA68117891B99168E0\r
+:104FC00001290FD1352B0DD153681B78302B02D01E\r
+:104FD000312B07D102E0204651494DE0204651498E\r
+:104FE0004AE0002628212046FEF785F92046696818\r
+:104FF000FFF7DCFB29212046FEF77DF92B78362BC5\r
+:1050000003D120462D21FEF776F9082E03D1204644\r
+:105010005B21FEF770F92046A968FFF7C7FB082E51\r
+:105020007BD120465D2171E020466968FEF7A2F938\r
+:1050300073E020463C4949E020466968FFF7B6FB2B\r
+:105040002046A96846E0204629795FE02046374996\r
+:10505000FEF784F920466968FFF7A8FB204629215E\r
+:1050600054E020466968FFF72DFB60B92046696867\r
+:1050700000F0F6F92E492046FEF770F94DE0806801\r
+:10508000013608B906E0002603782B2B02D14368CD\r
+:10509000002BF4D16F6800250DE0C4F820512046A4\r
+:1050A0003946FFF783FB731E9D4203DA20462149F0\r
+:1050B000FEF754F90135B542EFDB2EE020461E49DC\r
+:1050C0001BE020461D4901E01D492046FEF746F938\r
+:1050D00069682046FFF76AFB1FE020461949FEF782\r
+:1050E0003DF920466968FFF761FB17492046FEF746\r
+:1050F00035F9A96804E015492046FEF72FF96968DB\r
+:1051000020460131FEF736F920467D21FEF7F3F8FF\r
+:1051100003E004F58E70FFF7BDFA12B0BDE8F0872A\r
+:10512000970501009D050100A2050100B1050100E0\r
+:10513000BC05010073050100C0050100C7050100A1\r
+:10514000E5050100020601000B0601000E06010044\r
+:105150000B7870B5033B04460D46262B4FD8DFE88D\r
+:1051600003F03F4E4E4E4E4E4E4E4E4E4E4E4E4E17\r
+:105170004E4E4E4E4E4E14161B14161B1D23292B3D\r
+:105180002D2F4E4E4E4E314E41001F4900E01F491B\r
+:10519000BDE87040FEF7E2B81D49F9E72021FEF7AF\r
+:1051A000AAF82046A9682AE0036813F0040F2AD160\r
+:1051B0002A2120E026211EE01649E9E71649E7E703\r
+:1051C0001649E5E790F80831282B02D02021FEF798\r
+:1051D00092F820466968FFF7E9FA20461049D7E7B8\r
+:1051E00049680CE00F49FEF7B9F820466968FFF7F7\r
+:1051F000DDFA20462921BDE87040FEF77CB8BDE805\r
+:105200007040FFF7D3BA70BD1D06010027060100EC\r
+:1052100031060100380601003B060100440601008A\r
+:105220004F06010053060100F8B504460D46174627\r
+:10523000002D67D0D4F81C01FFF72FFA002861D1A8\r
+:10524000AB68002B5CD12FB96B681B781A3BDBB2C3\r
+:10525000022B55D901236968AB60EB68D4F814615F\r
+:10526000C4F814310B78252B04D120462A6800F0AD\r
+:105270008BF83DE0262B05D1204604312A6800F04A\r
+:1052800049F835E0022B36D1023BD4F8187120469C\r
+:10529000C4F818314968FFF789FA2368C4F818710F\r
+:1052A00013F0040F04D120461749FEF757F803E026\r
+:1052B00020462E21FEF71FF86B689D682B783F2B48\r
+:1052C0000DD120461149FEF749F8A9682046013161\r
+:1052D000FEF750F820460E49FEF740F86D682B782F\r
+:1052E0001A3BDBB2022BF9D920462946FFF75EFABA\r
+:1052F000C4F81461F8BD2046FFF72AFFC4F8146112\r
+:105300002D6895E7F8BD00BF6D0601005E0601003F\r
+:105310006C0601002DE9F04104460F469046BAB1F3\r
+:1053200013469D6825B95B681B78262B23D103E0C3\r
+:105330001B68002BF5D1012500262046414600229E\r
+:10534000FFF772FF1EB120462921FDF7D4FF1DB1E2\r
+:1053500020462021FDF7CFFF5B212046FDF7CBFF44\r
+:10536000396811B12046FFF721FA20465D21BDE8DA\r
+:10537000F041FDF7C0BF204602490125FDF7EEFFD1\r
+:105380002E46DAE7B90501002DE9F041134616462D\r
+:1053900004460F46002211E0996891B95A681278C4\r
+:1053A000173AD0B2102807D8274852B2904046D4B6\r
+:1053B0004FF0E070904040D41B680122002BEBD1ED\r
+:1053C00000E000231D46796801B102B18DB194F867\r
+:1053D00008211BB9282A07D02A2A05D0202A03D061\r
+:1053E00020462021FDF787FF20462821FDF783FF77\r
+:1053F0000125D4F8188100222046C4F8182131462E\r
+:10540000FFF712FF1DB120462921FDF774FF282167\r
+:105410002046FDF770FFB96811B12046FFF7C6F9C5\r
+:1054200020462921FDF767FF204631460122FFF77C\r
+:10543000FBFEC4F81881BDE8F0810B4600E00123B3\r
+:1054400001221546BFE700BF008030E20A782C2A0F\r
+:1054500004D14B6859689A68FDF760BFFFF7A6B999\r
+:105460000B7870B505460E4633B1062B04D02821C3\r
+:105470000024FDF740FF00E0012428463146FFF7F5\r
+:1054800095F92CB928462921BDE87040FDF733BFB6\r
+:1054900070BD2DE9F043D9B0064600AF0D46037844\r
+:1054A00014465F2B02D143785A2B1FD030465C49FB\r
+:1054B000082202F07BFBF0B9337A2E2B03D05F2B4E\r
+:1054C00001D0242B15D196F80990B9F1440F02D0E0\r
+:1054D000B9F1490F0FD1B37A5F2B0CD1B9F1490F54\r
+:1054E00014BF4FF003094FF0020906E04FF0010925\r
+:1054F00003E0814601E04FF0000930464FF000081C\r
+:1055000002F04CFB0C22C7F82C61C7F83861C7F8D1\r
+:105510004081C7F84C81C7F85481C7F85881C7F853\r
+:105520005C813318C7F85001C7F830311123C7F830\r
+:10553000343143008000C7F844310E305343083300\r
+:10554000B9F1010FADEB030D20F007006B46ADEB99\r
+:10555000000DC7F83C31C7F848D108D002D3B9F1E3\r
+:10556000030F0BD907F59670FEF79BFB04E007F5D8\r
+:1055700096704946FEF7B3F9064622E00B36C7F8A7\r
+:1055800038613046B9F1020F14BF4FF03D094FF0BA\r
+:105590003C0902F003FB3146024607F59670FDF721\r
+:1055A000ACFD43464946024607F59670FDF766FD99\r
+:1055B000D7F838810646404602F0F0FA4044C7F872\r
+:1055C0003801D7F838311B7813BB1EB3381D31466C\r
+:1055D0001122C7F808317A6087F80C31C7F8183102\r
+:1055E000C7F81C31C7F82831C7F82031C7F8105167\r
+:1055F000C7F81441FFF7DAF8381DFDF767FED7F852\r
+:105600002001FFF74AF8D0F1010038BF002002E086\r
+:10561000002000E0304607F5B277BD46BDE8F083D4\r
+:10562000440401002DE9FF410D4614461E4630B9E1\r
+:10563000002B4CD06FF00203074633604AE039B1CB\r
+:1056400032B9002B43D06FF002031746336041E0BC\r
+:1056500022496A4600230093019302930393FFF7C4\r
+:1056600018FF074620B90098B84601F0B9FD08E0D8\r
+:10567000039B13B9DDF8088001E04FF00108009F9B\r
+:1056800057B936B3B8F1010F0CBF4FF0FF336FF0CD\r
+:105690000103002733601DE00DB994B913E03846CB\r
+:1056A00002F07CFA2368984208D23946284602F074\r
+:1056B0006DFA384601F094FD2F4604E0284601F0CB\r
+:1056C0008FFDC4F800802EB10023336002E01F4636\r
+:1056D00000E03746384604B0BDE8F081D133000021\r
+:1056E00008B540B151B1FFF7D4FE002814BF002027\r
+:1056F0006FF0010008BD6FF0020008BD6FF00200FE\r
+:1057000008BD00BF08B500F00BF8006830B190F894\r
+:105710002730012B04BF00687838006808BD0000FE\r
+:105720000048704764080010F8B50446384B0D4631\r
+:1057300016460F4601EA03034FEA235C6BB921F0DA\r
+:105740000047074356D00022324B00F029FA324F6F\r
+:10575000BE4204460D4609DA38E040F2FF739C452C\r
+:105760000CD102460B4600F069F841E0284B0F4689\r
+:1057700001EA03034FEA235CACF1360CB44440F277\r
+:10578000FE739C4510DCBCF1000F06DD27F0FE47E0\r
+:1057900027F4700747EA0C552CE01CF1350F19DA95\r
+:1057A0004CF250339E420ADD22462B4614A1D1E929\r
+:1057B000000100F035F812A3D3E9002316E012A18E\r
+:1057C000D1E9000122462B4600F02AF80EA3D3E9C6\r
+:1057D00000230BE00CF1360C27F0FE4727F470078E\r
+:1057E0000E4B47EA0C5520462946002200F0D8F916\r
+:1057F00004460D4620462946F8BD00BFAFF30080A1\r
+:105800009C7500883CE4377E59F3F8C21F6EA501F1\r
+:105810000000F07F00005043B03CFFFF0000903CD0\r
+:1058200003F0004321F0004230B543EA020130BDED\r
+:1058300081F0004102E000BF83F0004330B54FEA41\r
+:1058400041044FEA430594EA050F08BF90EA020FAE\r
+:105850001FBF54EA000C55EA020C7FEA645C7FEA41\r
+:10586000655C00F0E2804FEA5454D4EB5555B8BF64\r
+:105870006D420CDD2C4480EA020281EA030382EAD5\r
+:10588000000083EA010180EA020281EA0303362D67\r
+:1058900088BF30BD11F0004F4FEA01314FF4801C3A\r
+:1058A0004CEA113102D0404261EB410113F0004F4C\r
+:1058B0004FEA03334CEA133302D0524263EB430303\r
+:1058C00094EA050F00F0A780A4F10104D5F1200EA1\r
+:1058D0000DDB02FA0EFC22FA05F2801841F10001FC\r
+:1058E00003FA0EF2801843FA05F359410EE0A5F1D0\r
+:1058F00020050EF1200E012A03FA0EFC28BF4CF001\r
+:10590000020C43FA05F3C01851EBE37101F00045B6\r
+:1059100007D54FF0000EDCF1000C7EEB00006EEBC3\r
+:105920000101B1F5801F1BD3B1F5001F0CD349084D\r
+:105930005FEA30004FEA3C0C04F101044FEA4452A4\r
+:1059400012F5800F80F09A80BCF1004F08BF5FEA2B\r
+:10595000500C50F1000041EB045141EA050130BD0B\r
+:105960005FEA4C0C404141EB010111F4801FA4F1AE\r
+:105970000104E9D191F0000F04BF01460020B1FA03\r
+:1059800081F308BF2033A3F10B03B3F120020CDA3B\r
+:105990000C3208DD02F1140CC2F10C0201FA0CF019\r
+:1059A00021FA02F10CE002F11402D8BFC2F1200C7E\r
+:1059B00001FA02F120FA0CFCDCBF41EA0C01904034\r
+:1059C000E41AA2BF01EB0451294330BD6FEA04047D\r
+:1059D0001F3C1CDA0C340EDC04F11404C4F1200268\r
+:1059E00020FA04F001FA02F340EA030021FA04F37A\r
+:1059F00045EA030130BDC4F10C04C4F1200220FAD1\r
+:105A000002F001FA04F340EA0300294630BD21FA0E\r
+:105A100004F0294630BD94F0000F83F4801306BFD4\r
+:105A200081F480110134013D4EE77FEA645C18BFC8\r
+:105A30007FEA655C29D094EA050F08BF90EA020F5F\r
+:105A400005D054EA000C04BF1946104630BD91EA57\r
+:105A5000030F1EBF0021002030BD5FEA545C05D15A\r
+:105A60004000494128BF41F0004130BD14F5800499\r
+:105A70003CBF01F5801130BD01F0004545F0FE410D\r
+:105A800041F470014FF0000030BD7FEA645C1ABF42\r
+:105A9000194610467FEA655C1CBF0B46024650EA79\r
+:105AA000013406BF52EA033591EA030F41F40021A5\r
+:105AB00030BD00BF90F0000F04BF0021704730B52B\r
+:105AC0004FF4806404F132044FF000054FF0000100\r
+:105AD00050E700BF90F0000F04BF0021704730B5C1\r
+:105AE0004FF4806404F1320410F0004548BF404296\r
+:105AF0004FF000013EE700BF42004FEAE2014FEAEB\r
+:105B000031014FEA02701FBF12F07F4393F07F4FC5\r
+:105B100081F06051704792F0000F14BF93F07F4FF7\r
+:105B2000704730B54FF4607401F0004521F000413A\r
+:105B300020E700BF50EA010208BF704730B54FF0C0\r
+:105B400000050AE050EA010208BF704730B511F0C5\r
+:105B5000004502D5404261EB41014FF4806404F1FD\r
+:105B600032045FEA915C3FF4DCAE4FF003025FEA7F\r
+:105B7000DC0C18BF03325FEADC0C18BF033202EB07\r
+:105B8000DC02C2F1200300FA03FC20FA02F001FA61\r
+:105B900003FE40EA0E0021FA02F11444C1E600BF00\r
+:105BA00070B54FF0FF0C4CF4E06C1CEA11541DBFB3\r
+:105BB0001CEA135594EA0C0F95EA0C0F00F0DEF87E\r
+:105BC0002C4481EA030621EA4C5123EA4C5350EA63\r
+:105BD000013518BF52EA033541F4801143F48013B4\r
+:105BE00038D0A0FB02CE4FF00005E1FB02E506F045\r
+:105BF0000042E0FB03E54FF00006E1FB03569CF09A\r
+:105C0000000F18BF4EF0010EA4F1FF04B6F5007F9F\r
+:105C100064F5407404D25FEA4E0E6D4146EB060611\r
+:105C200042EAC62141EA55514FEAC52040EA5E509A\r
+:105C30004FEACE2EB4F1FD0C88BFBCF5E06F1ED844\r
+:105C4000BEF1004F08BF5FEA500E50F1000041EB7B\r
+:105C5000045170BD06F0004646EA010140EA020028\r
+:105C600081EA0301B4EB5C04C2BFD4EB0C0541EA4A\r
+:105C7000045170BD41F480114FF0000E013C00F35F\r
+:105C8000AB8014F1360FDEBF002001F0004170BD83\r
+:105C9000C4F10004203C35DA0C341BDC04F114049C\r
+:105CA000C4F1200500FA05F320FA04F001FA05F228\r
+:105CB00040EA020001F0004221F0004110EBD370F5\r
+:105CC00021FA04F642EB06015EEA430E08BF20EA21\r
+:105CD000D37070BDC4F10C04C4F1200500FA04F3C4\r
+:105CE00020FA05F001FA04F240EA020001F0004156\r
+:105CF00010EBD37041F100015EEA430E08BF20EAC9\r
+:105D0000D37070BDC4F1200500FA05F24EEA020E10\r
+:105D100020FA04F301FA05F243EA020321FA04F03F\r
+:105D200001F0004121FA04F220EA020000EBD370F6\r
+:105D30005EEA430E08BF20EAD37070BD94F0000FF6\r
+:105D40000FD101F00046400041EB010111F4801F2A\r
+:105D500008BF013CF7D041EA060195F0000F18BFDB\r
+:105D6000704703F00046520043EB030313F4801F17\r
+:105D700008BF013DF7D043EA0603704794EA0C0FD1\r
+:105D80000CEA135518BF95EA0C0F0CD050EA4106E7\r
+:105D900018BF52EA4306D1D181EA030101F0004164\r
+:105DA0004FF0000070BD50EA410606BF104619468C\r
+:105DB00052EA430619D094EA0C0F02D150EA013698\r
+:105DC00013D195EA0C0F05D152EA03361CBF1046D9\r
+:105DD00019460AD181EA030101F0004141F0FE4178\r
+:105DE00041F470014FF0000070BD41F0FE4141F4FC\r
+:105DF000780170BD70B54FF0FF0C4CF4E06C1CEAFC\r
+:105E000011541DBF1CEA135594EA0C0F95EA0C0FB0\r
+:105E100000F0A7F8A4EB050481EA030E52EA03356B\r
+:105E20004FEA013100F088804FEA03334FF080558C\r
+:105E300045EA131343EA12634FEA022245EA1115B9\r
+:105E400045EA10654FEA00260EF000419D4208BF6A\r
+:105E5000964244F1FD0404F5407402D25B084FEA17\r
+:105E60003202B61A65EB03055B084FEA32024FF4C3\r
+:105E700080104FF4002CB6EB020E75EB030E22BF20\r
+:105E8000B61A754640EA0C005B084FEA3202B6EBE0\r
+:105E9000020E75EB030E22BFB61A754640EA5C008F\r
+:105EA0005B084FEA3202B6EB020E75EB030E22BF1F\r
+:105EB000B61A754640EA9C005B084FEA3202B6EB20\r
+:105EC000020E75EB030E22BFB61A754640EADC00DF\r
+:105ED00055EA060E18D04FEA051545EA16754FEA41\r
+:105EE00006164FEAC30343EA52734FEAC2025FEA5F\r
+:105EF0001C1CC0D111F4801F0BD141EA00014FF0EE\r
+:105F000000004FF0004CB6E711F4801F04BF0143BE\r
+:105F10000020B4F1FD0C88BFBCF5E06F3FF6AFAEDA\r
+:105F2000B5EB030C04BFB6EB020C5FEA500C50F16A\r
+:105F3000000041EB045170BD0EF0004E4EEA1131ED\r
+:105F400014EB5C04C2BFD4EB0C0541EA045170BDF4\r
+:105F500041F480114FF0000E013C90E645EA060E38\r
+:105F60008DE60CEA135594EA0C0F08BF95EA0C0F66\r
+:105F70003FF43BAF94EA0C0F0AD150EA01347FF4AE\r
+:105F800034AF95EA0C0F7FF425AF104619462CE785\r
+:105F900095EA0C0F06D152EA03353FF4FDAE1046E8\r
+:105FA000194622E750EA410618BF52EA43067FF439\r
+:105FB000C5AE50EA41047FF40DAF52EA43057FF4C9\r
+:105FC000EBAE12E74FEA410212F5001215D211D5DD\r
+:105FD0006FF47873B3EB625212D94FEAC12343F0E6\r
+:105FE000004343EA505311F0004F23FA02F018BF68\r
+:105FF000404270474FF00000704750EA013005D131\r
+:1060000011F0004008BF6FF0004070474FF00000F3\r
+:10601000704700BF4FEA4102B2F1E04324BFB3F53D\r
+:10602000001CDCF1FE5C0DD901F0004C4FEAC0020F\r
+:106030004CEA5070B2F1004F40EB830008BF20F0F3\r
+:106040000100704711F0804F21D113F13872BCBFAD\r
+:1060500001F00040704741F480114FEA5252C2F102\r
+:106060001802C2F1200C10FA0CF320FA02F018BF4B\r
+:1060700040F001004FEAC1234FEAD32303FA0CFC9E\r
+:1060800040EA0C0023FA02F34FEA4303CCE77FEA2D\r
+:10609000625307D150EA01331EBF4FF0FE4040F477\r
+:1060A0004000704701F0004040F0FE4040F4000026\r
+:1060B000704700BF80F0004002E000BF81F0004167\r
+:1060C00042001FBF5FEA410392EA030F7FEA226C9E\r
+:1060D0007FEA236C6AD04FEA1262D2EB1363C1BF2E\r
+:1060E000D218414048404140B8BF5B42192B88BF9D\r
+:1060F000704710F0004F40F4000020F07F4018BFC0\r
+:10610000404211F0004F41F4000121F07F4118BFDF\r
+:10611000494292EA030F3FD0A2F1010241FA03FC87\r
+:1061200010EB0C00C3F1200301FA03F100F000436F\r
+:1061300002D5494260EB4000B0F5000F13D3B0F137\r
+:10614000807F06D340084FEA310102F10102FE2AA6\r
+:1061500051D2B1F1004F40EBC25008BF20F0010016\r
+:1061600040EA03007047490040EB000010F4000FC4\r
+:10617000A2F10102EDD1B0FA80FCACF1080CB2EB57\r
+:106180000C0200FA0CF0AABF00EBC25052421843B6\r
+:10619000BCBFD0401843704792F0000F81F400015B\r
+:1061A00006BF80F400000132013BB5E74FEA41032E\r
+:1061B0007FEA226C18BF7FEA236C21D092EA030F9A\r
+:1061C00004D092F0000F08BF0846704790EA010F14\r
+:1061D0001CBF0020704712F07F4F04D1400028BF41\r
+:1061E00040F00040704712F100723CBF00F5000023\r
+:1061F000704700F0004343F0FE4040F40000704759\r
+:106200007FEA226216BF08467FEA23630146420204\r
+:1062100006BF5FEA412390EA010F40F48000704717\r
+:106220004FF0000304E000BF10F0004348BF4042BD\r
+:106230005FEA000C08BF704743F0964301464FF0F9\r
+:1062400000001CE050EA010208BF70474FF0000355\r
+:106250000AE000BF50EA010208BF704711F0004396\r
+:1062600002D5404261EB41015FEA010C02BF844666\r
+:106270000146002043F0B64308BFA3F18053A3F5C5\r
+:106280000003BCFA8CF2083AA3EBC25310DB01FA0C\r
+:1062900002FC634400FA02FCC2F12002BCF1004F90\r
+:1062A00020FA02F243EB020008BF20F00100704721\r
+:1062B00002F1200201FA02FCC2F1200250EA4C0075\r
+:1062C00021FA02F243EB020008BF20EADC707047BB\r
+:1062D0004FF0FF0C1CEAD0521EBF1CEAD15392EAC9\r
+:1062E0000C0F93EA0C0F6FD01A4480EA010C4002A5\r
+:1062F00018BF5FEA41211ED04FF0006343EA5010FF\r
+:1063000043EA5111A0FB01310CF00040B1F5000F40\r
+:106310003EBF490041EAD3715B0040EA010062F1EF\r
+:106320007F02FD2A1DD8B3F1004F40EBC25008BFD9\r
+:1063300020F00100704790F0000F0CF0004C08BFF7\r
+:1063400049024CEA502040EA51207F3AC2BFD2F1C4\r
+:10635000FF0340EAC250704740F400004FF00003D2\r
+:10636000013A5DDC12F1190FDCBF00F0004070470C\r
+:10637000C2F10002410021FA02F1C2F1200200FA4A\r
+:1063800002FC5FEA310040F1000053EA4C0308BF11\r
+:1063900020EADC70704792F0000F00F0004C02BF62\r
+:1063A000400010F4000F013AF9D040EA0C0093F0DD\r
+:1063B000000F01F0004C02BF490011F4000F013B37\r
+:1063C000F9D041EA0C018FE70CEAD15392EA0C0FA5\r
+:1063D00018BF93EA0C0F0AD030F0004C18BF31F010\r
+:1063E000004CD8D180EA010000F00040704790F0E6\r
+:1063F000000F17BF90F0004F084691F0000F91F08A\r
+:10640000004F14D092EA0C0F01D142020FD193EA4F\r
+:106410000C0F03D14B0218BF084608D180EA0100D7\r
+:1064200000F0004040F0FE4040F40000704740F0B3\r
+:10643000FE4040F4400070474FF0FF0C1CEAD05281\r
+:106440001EBF1CEAD15392EA0C0F93EA0C0F69D0DD\r
+:10645000A2EB030280EA010C49024FEA402037D048\r
+:106460004FF0805343EA111143EA10130CF000403F\r
+:106470008B4238BF5B0042F17D024FF4000C8B422F\r
+:1064800024BF5B1A40EA0C00B3EB510F24BFA3EB0F\r
+:10649000510340EA5C00B3EB910F24BFA3EB9103DF\r
+:1064A00040EA9C00B3EBD10F24BFA3EBD10340EA39\r
+:1064B000DC001B0118BF5FEA1C1CE0D1FD2A3FF67F\r
+:1064C00050AF8B4240EBC25008BF20F00100704734\r
+:1064D0000CF0004C4CEA50207F32C2BFD2F1FF03D7\r
+:1064E00040EAC250704740F400004FF00003013A08\r
+:1064F00037E792F0000F00F0004C02BF400010F4AC\r
+:10650000000F013AF9D040EA0C0093F0000F01F0BF\r
+:10651000004C02BF490011F4000F013BF9D041EAE1\r
+:106520000C0195E70CEAD15392EA0C0F08D1420214\r
+:106530007FF47DAF93EA0C0F7FF470AF084676E7E7\r
+:1065400093EA0C0F04D14B023FF44CAF08466EE7C0\r
+:1065500030F0004C18BF31F0004CCAD130F000428E\r
+:106560007FF45CAF31F000437FF43CAF5FE700BFE6\r
+:106570004FF0FF3C06E000BF4FF0010C02E000BF0F\r
+:106580004FF0010C4DF804CD4FEA40024FEA4103B1\r
+:106590007FEA226C18BF7FEA236C11D001B052EA67\r
+:1065A000530C18BF90EA010F58BFB2EB030088BF2D\r
+:1065B000C81738BF6FEAE17018BF40F0010070479C\r
+:1065C0007FEA226C02D15FEA402C05D17FEA236C7E\r
+:1065D000E4D15FEA412CE1D05DF8040B704700BFC5\r
+:1065E000844608466146FFE70FB5FFF7C9FF00285C\r
+:1065F00048BF10F1000F0FBD4DF808EDFFF7F4FF95\r
+:106600000CBF012000205DF808FB00BF4DF808ED2D\r
+:10661000FFF7EAFF34BF012000205DF808FB00BF50\r
+:106620004DF808EDFFF7E0FF94BF012000205DF872\r
+:1066300008FB00BF4DF808EDFFF7D2FF94BF012023\r
+:1066400000205DF808FB00BF4DF808EDFFF7C8FF1C\r
+:1066500034BF012000205DF808FB00BF08B506200C\r
+:1066600001F0D8F90120F9F785FE00F0E1BF08B587\r
+:106670000346084611461A4604F014FC054B064A28\r
+:106680001B68596811609968044A1160DA68044B04\r
+:106690001A60704790020010A4080010A8080010AB\r
+:1066A000AC08001030B505460C46134602202946BA\r
+:1066B0002246BDE8304004F079BB000070B50546C5\r
+:1066C0000C46002946D000F0B9F925B1AB6913B9E1\r
+:1066D000284600F049F9214B9C4201D16C6808E042\r
+:1066E0001F4B9C4201D1AC6803E01E4B9C4208BF8B\r
+:1066F000EC68B4F90C6056B32846214600F03CF82B\r
+:10670000236B06463BB12846216A984736EA2006A5\r
+:1067100028BF4FF0FF36A38913F0800F03D028461F\r
+:10672000216900F02DFA616B41B104F144039942F3\r
+:1067300002D0284600F024FA00236363A16C21B143\r
+:10674000284600F01DFA0023A3640023A38100F073\r
+:1067500076F900E00E46304670BD00BF980A010091\r
+:10676000B80A0100D80A0100024B01461868FFF779\r
+:10677000A5BF00BF900200102DE9F04105460E694B\r
+:106780000C46002E00F0A78018B183690BB900F009\r
+:10679000EBF8524B9C4201D16C6808E0504B9C4294\r
+:1067A00001D1AC6803E04F4B9C4208BFEC68A28962\r
+:1067B000002A00F08D8013B213F0080663D142F472\r
+:1067C00000636268A381002A03DC226C002A40F384\r
+:1067D0008280E66A002E7ED000222F682A6013F4A1\r
+:1067E000805201D0626D15E001232846216AB0472E\r
+:1067F000B0F1FF3F02460DD12B685BB11D2B01D0DC\r
+:10680000162B01D12F6061E0A389064643F04003B7\r
+:10681000A38160E0A38913F0040F05D06368D21A46\r
+:10682000636B0BB1236CD21A0023E66A2846216AF7\r
+:10683000B047B0F1FF3F05D12B681D2B39D82A4A4C\r
+:106840009A4036D5A3890022626023F4006322694E\r
+:106850001B0422601B0CA38113F4805F05D0B0F1F0\r
+:10686000FF3F01D12B6803B96065616B2F60002980\r
+:1068700030D004F14403994202D0284600F080F958\r
+:106880000026666327E026692EB313F0030F226803\r
+:10689000266008BF6369C6EB020818BF0023A36027\r
+:1068A00011E0A76A2846216A32464346B8470028C5\r
+:1068B00006DCA3894FF0FF3643F04003A3810AE0D2\r
+:1068C0003618C0EB0808B8F1000FEADC002602E039\r
+:1068D000164600E00E463046BDE8F081980A0100F9\r
+:1068E000B80A0100D80A010004020080014900F042\r
+:1068F00063BB00BF69670000002310B50446036056\r
+:1069000043608360818119464366C2810822036126\r
+:10691000436183615C3000F0AEFE054B246263622C\r
+:10692000044BA362044BE362044B236310BD00BF1E\r
+:10693000E97A00000F7B0000497B00006F7B0000BC\r
+:1069400070B50E4668254D4305F10C0100F050FC72\r
+:10695000044638B10C30002166602A462160A060F0\r
+:1069600000F089FE204670BD70B504468669002E91\r
+:1069700025D1134B0125C0F8D86085618362C0F82A\r
+:10698000DC60C0F8E06000F01DF86060204600F0B8\r
+:1069900019F8A060204600F015F804213246E060A6\r
+:1069A0006068FFF7A9FFA06809212A46FFF7A4FF46\r
+:1069B000E06812210222BDE87040FFF79DBF70BD64\r
+:1069C000ED680000F8B507461B4B1E68B36913B9A4\r
+:1069D0003046FFF7C9FFD836B468736803E0B4F9EE\r
+:1069E0000C5085B16834013BF9D533682BB9384672\r
+:1069F0000421FFF7A5FF306008B13668ECE70C23EF\r
+:106A000004463B6015E04FF0FF336566E38104F117\r
+:106A10005C0001232560A3812946A56008226560EA\r
+:106A200025616561A56100F026FE6563A563A56427\r
+:106A3000E5642046F8BD00BFFC0A010070477047BE\r
+:106A40000EB403B503AB0146054853F8042B0068A8\r
+:106A5000019302F0DDFFBDE80C4003B0704700BFBA\r
+:106A60009002001030B587B00446084615460491E0\r
+:106A700001F094F804AB0193012302930390059075\r
+:106A800024B1A36913B92046FFF76EFF0F4B9D4257\r
+:106A900001D1656808E00E4B9D4201D1A56803E075\r
+:106AA0000C4B9D4208BFE568AB8913F4005F06D12B\r
+:106AB00043F40053AB816B6E23F400536B662046A6\r
+:106AC000294601AA00F02EF907B030BD980A01004E\r
+:106AD000B80A0100D80A01000A46034903460868BB\r
+:106AE0001946FFF7BFBF00BF90020010F8B50D4672\r
+:106AF000204E044600F0C7FDB3685F6827F0030727\r
+:106B000007F16F035D1B25F07F05803D7F2D1EDDA6\r
+:106B10000021204600F040FFB368DB19984216D1EF\r
+:106B20006942204600F038FFB0F1FF3F14D1002148\r
+:106B3000204600F031FFB368C21A0F2A07DD0E4964\r
+:106B400042F001025A600968401A0C490860204668\r
+:106B500000F09AFD0020F8BDB3687F1B47F00107E5\r
+:106B600020465F60054B1A68551B1D6000F08CFDC8\r
+:106B70000120F8BD94020010A00600107C0800104F\r
+:106B80002DE9F04104460D46002900F0AE8000F0EA\r
+:106B90007AFDA5F1080356485F6827F00102D0F896\r
+:106BA00008C0991807F0010761454E6826F00306F2\r
+:106BB00018D1B2183FB955F8081C5B1A52189D68D5\r
+:106BC000D968E9608D6042F0010183605960494BEA\r
+:106BD0001B689A42C0F08480474B20461968FFF733\r
+:106BE00085FF7DE04E6087B955F8085C00F1080C20\r
+:106BF0005B1B52199D68654509D0D3F80CC0C5F8D8\r
+:106C00000CC0CCF808503D4602E0002500E001250C\r
+:106C10008F197F6817F0010F0FD192194DB98E6847\r
+:106C2000364FBE4205D1F3600135B360DE609E6031\r
+:106C300003E0CE688968CE60B16042F001019A50ED\r
+:106C40005960002D4CD1B2F5007F10D2D208013529\r
+:106C5000911015FA01F1456845EA0101416000EB28\r
+:106C6000C200D86082689A60D360836038E0550AB9\r
+:106C7000042D02D89509383516E0142D01D85B355E\r
+:106C800012E0542D02D8150B6E350DE0B5F5AA7F34\r
+:106C900002D8D50B773507E040F254518D4202D827\r
+:106CA000950C7C3500E07E2500EBC506B168B1424D\r
+:106CB0000CD10122AD1012FA05F5426842EA050531\r
+:106CC0000A46456008E08968B14204D0486820F06F\r
+:106CD00003008242F7D3CA68DA609960CB609360A0\r
+:106CE0002046BDE8F04100F0CFBCBDE8F08100BF18\r
+:106CF000940200109C060010780800109C020010FE\r
+:106D000038B50546064C0846114600232360F9F7BE\r
+:106D10001DFCB0F1FF3F02D1236803B12B6038BDE9\r
+:106D2000B00800102DE9F74F064690680C469246D1\r
+:106D3000002800F03F818B8913F0080F01D00B6908\r
+:106D40005BB93046214603F0C3FF30B1A38943F05D\r
+:106D50004003A381092333602AE1B4F80C90DAF8E8\r
+:106D6000008019F0020724D00027B94605E0D8F8C2\r
+:106D70000070D8F8049008F10808B9F1000FF6D0B7\r
+:106D8000B9F1800F34BF4B468023A56A3046216A93\r
+:106D90003A46A847031E40F30781DAF80800C01AF4\r
+:106DA000CAF80800002800F00581FF18C3EB0909A4\r
+:106DB000E3E719F0010903D00197B94600979BE07A\r
+:106DC0004D4605E0D8F80090D8F8045008F10808BE\r
+:106DD000002DF7D0A389A76813F4007F50D0BD42DF\r
+:106DE00040D313F4906F3BD021692268521A00926D\r
+:106DF0006269009802EB420B421C52190BEBDB7BE1\r
+:106E00004FEA6B0B934538BF934613F4806F10D055\r
+:106E10003046594600F0ECF90746A0B12169009AC6\r
+:106E200000F006FCA38923F4906343F08003A38160\r
+:106E30000CE030465A4600F033FC074630B9304685\r
+:106E40002169FFF79DFE0C233360ADE0009A2761B6\r
+:106E5000BF1827602F46C2EB0B03C4F814B0A36021\r
+:106E6000BD4200D22F463A462068494600F0EBFB6F\r
+:106E7000A368DB1BA3602368DF1927602F4628E087\r
+:106E80002068236998420ED9BD420CD949463A463A\r
+:106E900000F0D9FB236830462146DB192360FFF759\r
+:106EA0006BFCB0B180E063699D4207D3A76A3046AE\r
+:106EB000216A4A46B847071E0BDC75E049462A4658\r
+:106EC00000F0C1FBA3682F465B1BA36023685B191E\r
+:106ED0002360DAF80800C01BCAF80800002869D04F\r
+:106EE000B944ED1B74E7D8F804300020D8F80090BE\r
+:106EF00008F1080801900093009A002AF3D0019B42\r
+:106F000073B948460A2100F077FB28B1471C0120DD\r
+:106F1000C9EB0707019003E0009A01230193571C76\r
+:106F2000DDF800B0206822695F4538BFBB46A56820\r
+:106F3000904263690FD95D19AB450CDD49462A467D\r
+:106F400000F081FB2368304621465B192360FFF780\r
+:106F500013FCB0B128E09B4507DBA56A3046216AE7\r
+:106F60004A46A847051E0CDC1EE049465A4600F07A\r
+:106F70006AFBA3685D46CBEB0303A36023685B4415\r
+:106F800023607F1B05D130462146FFF7F5FB58B93A\r
+:106F90000197DAF80800401BCAF8080050B10098C1\r
+:106FA000A944401B0090A7E7A38943F04003A381B5\r
+:106FB0004FF0FF30BDE8FE8F2DE9F04104468846D2\r
+:106FC000D834FFF73BFD002611E0A56867680BE0A9\r
+:106FD000B5F90C303BB1B5F90E30B3F1FF3F02D03B\r
+:106FE0002846C04706436835013FF1D52468002C88\r
+:106FF000EBD1FFF724FD3046BDE8F0812DE9F041EB\r
+:1070000086B002FB03F61D46144604AB0C9F804677\r
+:1070100001930123049105960396029318B18369A5\r
+:107020000BB9FFF7A1FC164B9F4202D1D8F80470B0\r
+:107030000AE0144B9F4202D1D8F8087004E0124BCA\r
+:107040009F4208BFD8F80C70BB8913F4005F06D1CB\r
+:1070500043F40053BB817B6E23F400537B664046B0\r
+:10706000394601AAFFF75EFE28B103982146301A7F\r
+:1070700007F0B6FC0546284606B0BDE8F08100BF23\r
+:10708000980A0100B80A0100D80A010073B5064643\r
+:1070900000930D46044B144631462A461868234691\r
+:1070A000FFF7ACFF7CBD00BF9002001070B500245C\r
+:1070B0000C4D0D4E761BB61003E055F8043B013421\r
+:1070C0009847B442F9D1094D09F0B8FE084E0024A2\r
+:1070D000761BB61003E055F8043B01349847B442E0\r
+:1070E000F9D170BD480E01004C0E01004C0E01009C\r
+:1070F000540E01008B89F0B513F0020F91B00546D4\r
+:107100000C4606D001F147030B600B6101234B6174\r
+:1071100057E0B1F90E10002904DB01AAFFF7F0FDDA\r
+:1071200000280BDAA389002703F0800643F40063EC\r
+:10713000002E0CBF80264026A3811BE0029B03F497\r
+:107140007043A3F50052574247EB0207B3F5004FD7\r
+:107150000BD1E26A1C4B9A4207D1A38943F48063A6\r
+:10716000A3814FF48063236503E0A38943F40063A4\r
+:10717000A38180262846314600F03AF868B9A389F1\r
+:1071800013F4007F1DD143F00203A38104F14703F0\r
+:10719000236023610123636113E00C4BAB62A3897D\r
+:1071A000206043F080032061A38166614FB12846CF\r
+:1071B000B4F90E1004F036FD18B1A38943F00103B1\r
+:1071C000A38111B0F0BD00BF497B0000ED68000055\r
+:1071D000024B0146186800F00BB800BF9002001087\r
+:1071E000024B01461868FFF7CBBC00BF90020010AD\r
+:1071F0002DE9F74F01F10B04162C074603D934F0A3\r
+:10720000070401D502E010248C4202D20C233B601B\r
+:10721000D6E1384600F037FAB4F5FC7F974A10D231\r
+:10722000E10802EBC102D668964204D106F10803D8\r
+:1072300076699E4203D0736823F003032FE0023186\r
+:1072400036E0610A01D1E1081BE0042902D8A10956\r
+:10725000383116E0142901D85B3112E0542902D8E4\r
+:10726000210B6E310DE0B1F5AA7F02D8E10B773129\r
+:1072700007E040F25453994202D8A10C7C3100E05F\r
+:107280007E2102EBC102D6680FE0736823F003038E\r
+:10729000181B0F2801DD013909E0002804DBF26822\r
+:1072A000B168CA60916020E0F6689642EDD1013184\r
+:1072B000724D05F108029668964277D0736823F004\r
+:1072C0000303181B0F280CDD331944F00104D360AD\r
+:1072D00093607460DA609A6040F0010218505A605E\r
+:1072E00079E10028D260926005DBF3185A6842F019\r
+:1072F00001025A606FE1B3F5007F0ED2DB084FF058\r
+:10730000010E981005EBC3030EFA00F0D5F804E067\r
+:107310004EEA00006860986844E04FEA532EBEF1E0\r
+:10732000040F04D84FEA931E0EF1380E1FE0BEF191\r
+:10733000140F02D80EF15B0E19E0BEF1540F04D801\r
+:107340004FEA133E0EF16E0E11E0BEF5AA7F04D88F\r
+:107350004FEAD33E0EF1770E09E040F254508645D5\r
+:1073600096BF4FEA934E4FF07E0E0EF17C0E05EB6A\r
+:10737000CE0CDCF8080060450DD101234FEAAE0EBB\r
+:1073800003FA0EFE6B6843EA0E036B60034609E0E6\r
+:107390008068604505D0D0F804E02EF0030E7345F8\r
+:1073A000F6D3C368F360B0609E60C66001208B10A6\r
+:1073B00010FA03F36868834262D8034205D121F0D2\r
+:1073C00003015B0004310342FBD005EBC1098E468B\r
+:1073D000CC46DCF80C602AE0706820F00308C4EBAF\r
+:1073E00008000F2811DD3319F16844F001047460BE\r
+:1073F00056F8084F1850E1608C60D3609360DA60F3\r
+:107400009A6040F001025A600CE000280EDB06EBA7\r
+:1074100008035A6842F001025A60F36856F8082FD0\r
+:10742000D3609A60384600F02FF9D8E0F6686645D8\r
+:10743000D2D10EF1010E1EF0030F01D1484602E039\r
+:107440000CF1080CC5E711F0030F04D1696821EABB\r
+:107450000301696006E0064656F80809B04201D10A\r
+:107460000139F0E768685B00834209D843B171468F\r
+:1074700001E004315B000342A7D1FAE79402001057\r
+:10748000D5F80880D8F8043023F00309A14504D3C7\r
+:10749000C4EB09030F2B00F39580524B38461B6851\r
+:1074A00003F1100A504BA2441A680193B2F1FF3F56\r
+:1074B0001CBF0AF17F0A2AF07F0A514600F06CFADD\r
+:1074C000019BB0F1FF3F06466ED008EB09029042E7\r
+:1074D00001D2A84568D1454996428B460868504478\r
+:1074E000086008D116F07F0F05D1AB68D14449F090\r
+:1074F00001025A604CE01B68B3F1FF3F02D13A4BE6\r
+:107500001E6003E03018821ACBF8002016F0070343\r
+:1075100038461CBFC3F10803F6188033B2440AF0A2\r
+:107520007F0ACAEB030A514600F036FADBF8003056\r
+:10753000AE60B0F1FF3F04BF30464FF0000A801B41\r
+:10754000A8455044534440F00100CBF8003070602F\r
+:107550001ED0B9F10F0F02D80123736024E0D8F8D0\r
+:107560000430A9F10C0929F00709052203F00103F1\r
+:10757000B9F10F0F49EA0303C8F8043008EB090317\r
+:107580005A609A6004D9384608F10801FFF7F8FA02\r
+:10759000174ADBF8003011688B4288BF1360154A28\r
+:1075A00011688B4288BF1360AB685B6823F00303EC\r
+:1075B000A34202D31B1B0F2B04DC384600F064F8F7\r
+:1075C00000260CE0AE6844F0010243F001033419D8\r
+:1075D000AC60726063603846083600F055F830469B\r
+:1075E000BDE8FE8F78080010A00600107C0800108F\r
+:1075F000740800107008001010B5C9B203E010F84C\r
+:10760000014B8C4204D0013A0346F8D2002010BD51\r
+:10761000184610BD30B5002306E0C55CCC5C0133D4\r
+:10762000A54201D0281B30BD013AF6D2002030BD62\r
+:1076300010B58218034603E011F8014B03F8014B23\r
+:107640009342F9D310BD814210B5044610D28B1875\r
+:1076500098420DD21946831803E011F8014D03F842\r
+:10766000014D013AF9D210BD11F8013B04F8013B7C\r
+:10767000013AF9D210BD8218034601E003F8011B5C\r
+:107680009342FBD370477047704700000A46034996\r
+:1076900003460868194600F003B800BF90020010C6\r
+:1076A0002DE9F74F814617460E4629B9114603B01A\r
+:1076B000BDE8F04FFFF79CBD07F10B05FFF7E3FFB7\r
+:1076C000A6F1080A162DDAF8042003D935F00705CB\r
+:1076D00001D502E01025BD4204D20C230027C9F8D1\r
+:1076E000003055E122F0030BAB4580F226819F4B21\r
+:1076F0000AEB0B01D3F808E0714507D0486820F089\r
+:1077000001000818406810F0010F25D14868714544\r
+:1077100020F0030000EB0B0817D105F11004A04581\r
+:107720001CDB0AEB0502C5EB08089A6048F0010370\r
+:1077300053604846DAF80430374603F001031D432E\r
+:10774000CAF80450FFF7A0FF22E1A84506DBCB688A\r
+:107750008A68D3609A60F1E00020014612F0010FC0\r
+:1077600040F09C8056F8084CC4EB0A04626822F092\r
+:107770000302002957D0714502EB0B084BD180441E\r
+:1077800005F1100188454EDB2746E26857F8081FCF\r
+:10779000CA609160ABF10402242A29D8132A394621\r
+:1077A0001BD9304650F8041BA1607168061D1B2AC6\r
+:1077B000E16004F1100110D94168301D2161716848\r
+:1077C0000836242A616104F1180106D1426804F1E7\r
+:1077D0002001A26172680836E26130460A4650F81C\r
+:1077E00004EB42F804EB76684E604168516005E0B6\r
+:1077F000384631460193FFF726FF019B6219C5EB1E\r
+:1078000008089A6048F001035360636803F00103BD\r
+:107810001D4365608DE08044A84504DBCB688A6821\r
+:10782000D3609A6003E002EB0B08A84536DB2046E4\r
+:10783000E36850F8082FD3609A60ABF10402242A61\r
+:1078400028D8132A1BD9334604F1100053F8041B1F\r
+:10785000A16071681E1D1B2AE16010D95B6804F1EC\r
+:1078600018002361331D71680836242A616106D12E\r
+:107870005B6804F12000A36173680836E361324657\r
+:10788000034652F8041B43F8041B716841605268B8\r
+:107890005A6054E03146FFF7D6FE50E0394648467C\r
+:1078A000FFF7A6FC0746002843D0DAF80420A0F131\r
+:1078B000080322F001025244934205D150F8043CDF\r
+:1078C00023F00308D84439E0ABF10402242A29D874\r
+:1078D000132A314603461AD9344654F8043B211D75\r
+:1078E00040F8043B73687B60031D1B2A0FD9646852\r
+:1078F00044600C1D4968181D59600833211D242A55\r
+:1079000005D1626842604A6808315A600833084607\r
+:107910001A4650F8044B42F8044B496859604368D2\r
+:10792000536002E03146FFF78EFE48463146FFF7CE\r
+:1079300027F94846FFF7A8FE2AE0D8465446C5EB8B\r
+:10794000080362680F2B13D9611902F00102154375\r
+:1079500043F00102CB1865604A6048465A68083116\r
+:1079600042F001025A60FFF70BF90CE0940200109C\r
+:1079700004EB080302F0010248EA020262605A685E\r
+:1079800042F001025A60484604F10807FFF77CFE06\r
+:10799000384603B0BDE8F08F38B50546064C0846BA\r
+:1079A00000232360F8F7ECFCB0F1FF3F02D123681D\r
+:1079B00003B12B6038BD00BFB00800101F2970B59F\r
+:1079C00005460C4604D9162303604FF0FF3070BD06\r
+:1079D000426C12B152F821304BB9284600F034F80D\r
+:1079E000224601462846BDE8704000F01BB8012B36\r
+:1079F0000DD0B3F1FF3F03D117330360012070BDF9\r
+:107A00000025084642F821509847284670BD0020BE\r
+:107A100070BD0000024B01461868FFF7CFBF00BFE2\r
+:107A20009002001038B50546064C08461146002362\r
+:107A30002360F8F797FCB0F1FF3F02D1236803B150\r
+:107A40002B6038BDB0080010F8F798BC0EB44FF4A6\r
+:107A5000027100B59CB01DABADF810106FF0004185\r
+:107A6000039106914FF0FF31ADF81210084953F819\r
+:107A7000042B01900590086801A91B9300F04CF9B4\r
+:107A8000019B00221A701CB05DF804EB03B0704734\r
+:107A9000900200100EB44FF4017230B59CB01FACD0\r
+:107AA000ADF8102054F8045B0190059000F076F8D2\r
+:107AB0000B4B01A92A461B940A9300230E931393A0\r
+:107AC0004FF0FF33ADF81230064B02900690186865\r
+:107AD000234601F0A1F91CB0BDE8304003B0704767\r
+:107AE0000B7B00009002001010B50C46B1F90E108F\r
+:107AF00004F018FD002803DB636D1B18636510BDDF\r
+:107B0000A38923F48053A38110BD002070472DE981\r
+:107B1000F0411D468B8907460C46164613F4807FBC\r
+:107B200005D0B1F90E100022022304F0A9F8A389B0\r
+:107B30003846B4F90E10324623F48053A3812B4605\r
+:107B4000BDE8F04103F0B0B810B50C46B1F90E1025\r
+:107B500004F096F8A389B0F1FF3F03D123F48053DA\r
+:107B6000A38110BD43F480536065A38110BDB1F9BA\r
+:107B70000E1003F09DB910F8012B11F8013B012AFA\r
+:107B800028BF9A42F7D0A2EB03007047034611F8D2\r
+:107B9000012B03F8012B002AF9D170470346C0439B\r
+:107BA00013F8012B002AFBD11818704770B51AB9C9\r
+:107BB0000FE0013A09D043B10C4605462AB110F84E\r
+:107BC000013B11F8016BB342F3D028782378C01A37\r
+:107BD00070BD104670BD00002DE9F74F9846464B2A\r
+:107BE0000C4615460190D3F800B00B4613F8016B14\r
+:107BF0000BEB06021F4692F8019019F00809F5D127\r
+:107C00002D2E04D117F8016B4FF0010903E02B2E44\r
+:107C100008BF17F8016BB8F1000F02D0B8F1100FD0\r
+:107C200014D1302E09D13B78782B01D0582B04D1B8\r
+:107C30007E784FF01008023708E0B8F1000F05D148\r
+:107C4000302E14BF4FF00A084FF00808B9F1000FAA\r
+:107C500041460CBF6FF0004A4FF0004A504606F014\r
+:107C6000EDFF50460B464146009306F0B9FE002159\r
+:107C7000009B0A460BEB060C9CF801C01CF0040F9D\r
+:107C800001D0303E0BE01CF0030C1BD0BCF1010F07\r
+:107C900014BF4FF0570C4FF0370CCCEB060646459F\r
+:107CA00010DAB1F1FF3F0AD0824206D801D19E42DC\r
+:107CB00003DC08FB0262012101E04FF0FF3117F8FD\r
+:107CC000016BD7E7B1F1FF3F0AD10198B9F1000F7D\r
+:107CD0000CBF6FF000424FF000422223036003E02C\r
+:107CE000B9F1000F00D0524215B101B17C1E2C60D9\r
+:107CF0001046BDE8FE8F00BFA40600101346054ADB\r
+:107D000030B505460C46106829462246BDE830408D\r
+:107D1000FFF762BF900200102DE9F04FBFB00F4691\r
+:107D20001E461546804603F0A7FF00681390FFF734\r
+:107D300035FFBB8913F0800F129011D03B697BB9DE\r
+:107D400040464021FFF754FA3860386130B90C23BF\r
+:107D50000138C8F800300F9001F056B840237B611D\r
+:107D6000002319AC3593339434930C950B931093F3\r
+:107D70001193169315930F930C9B1D4613F8012B2B\r
+:107D80000AB1252AF9D10C99B5EB010918D0359B18\r
+:107D90002160C4F804904B443593349B01333493F1\r
+:107DA000072B01DC083408E04046394633AA05F0C9\r
+:107DB00015FC002841F01F8019AC0F9A4A440F921D\r
+:107DC0002B78002B01F01080002301350C951D4607\r
+:107DD0008DF8F7304FF0FF3C0D932A460C9B05E0E1\r
+:107DE0000E4603E01E464FF0FF3C0B4613F8019B86\r
+:107DF000A9F12001582900F21284DFE811F059009E\r
+:107E0000100410045F001004100410041004100487\r
+:107E1000100462006B00100468006F0010049200F0\r
+:107E200095009500950095009500950095009500AA\r
+:107E30009500100410041004100410041004100421\r
+:107E4000100410041004C000FD001004FD00100414\r
+:107E5000100410041004A40010041004A80210045C\r
+:107E6000100410041004100413031004100445033C\r
+:107E70001004100410041004100410041004100462\r
+:107E800010041004B500C500FD00FD00FD00A700B2\r
+:107E9000C50010041004AA0010048A02AD02D90221\r
+:107EA000B2001004ED021004180310041004400383\r
+:107EB0009DF8F710002999D120310CE045F001051B\r
+:107EC00094E73268311D002A8ADA52420E4645F0A4\r
+:107ED00004058BE72B218DF8F71087E7194611F879\r
+:107EE000019BB9F12A0F03D019464FF0000C10E0A6\r
+:107EF000D6F800C0331DBCF1000FFFF673AF1E466D\r
+:107F00000B4673E74FF00A0909FB0C0C91F801903E\r
+:107F10001946A9F1300001330928F3D94CEAEC7C69\r
+:107F200066E745F0800561E7194600220A23A9F1BA\r
+:107F3000300903FB029211F8019BA9F130000B46B6\r
+:107F40000928F3D954E745F008054FE745F0400507\r
+:107F50004CE719786C2901D1013302E045F0100596\r
+:107F600044E745F0200541E70C934FF0000C3368DF\r
+:107F700004360D928DF8F7C08DF8A4305BE30C93B6\r
+:107F800045F010050D9201E00C930D9215F0200FB5\r
+:107F900009D0073626F0070303F10806D3E90001EC\r
+:107FA000CDE9080116E015F0100F06F1040301D029\r
+:107FB000326809E015F0400F326805D012B2104661\r
+:107FC000D117CDE9080104E092464FEAE27BCDE902\r
+:107FD00008AB1E46DDE90801002871F1000180F2BE\r
+:107FE0008E82DDE90823524263EB4303CDE9082387\r
+:107FF0002D238DF8F73082E20C93F31D15F0080F56\r
+:1080000023F007030D9203F1080614BF18681968DE\r
+:10801000CDF8389014BF109010915B681098CDF88F\r
+:1080200018C01193119904F091FADDF818C00128D5\r
+:1080300019D1109800221199002306F0C7FF10B142\r
+:108040002D238DF8F730A94B4FF0000CA84A25F0EE\r
+:1080500080054FF0030BCDF820C0B9F1470FCCBF1E\r
+:1080600092469A46FDE210981199CDF818C004F096\r
+:108070006DFADDF818C058B99E4B25F080059E4A70\r
+:108080004FF0030BB9F1470FCCBF92469A46DDE2A1\r
+:10809000BCF1FF3F0BD0B9F1670F02D0B9F1470F28\r
+:1080A00007D1BCF1000F08BF4FF0010C01E04FF009\r
+:1080B000060C119B45F48075002B05DA03F1004294\r
+:1080C0002D230B92149303E01198002114910B902F\r
+:1080D000B9F1660F0BD0B9F1460F08D0B9F1650FB1\r
+:1080E00002D0B9F1450F05D10CF1010B03E0E346D5\r
+:1080F000032301E0E3460223009340463CAB109A81\r
+:1081000002933BAB03933AAB04930B9BCDF818C09F\r
+:10811000CDF804B002F070FFB9F1670FDDF818C0B8\r
+:10812000824602D0B9F1470F02D115F0010F34D0C9\r
+:10813000B9F1660F0AEB0B02089202D0B9F1460FB3\r
+:1081400015D19AF80030302B0DD1109800220B99E0\r
+:108150000023CDF818C006F02FFFDDF818C010B9C5\r
+:10816000CBF101033C9308983C9BC01808901098F1\r
+:1081700000220B990023CDF818C006F01DFFDDF892\r
+:1081800018C030B108993A9103E0302203F8012B6E\r
+:108190003A933A9B089A9342F7D33A9BB9F1670F07\r
+:1081A000CAEB03030B933C9B02D0B9F1470F08D1F4\r
+:1081B00013F1030F9B4601DB634575DDA9F102094D\r
+:1081C00002E0B9F1660F59D003F1FF3B8DF8E09062\r
+:1081D000BBF1000FCDF8F0B003DACBF1000B2D238B\r
+:1081E00000E02B23BBF1090F8DF8E1302FDD0DF1FD\r
+:1081F000DE035246CC46A2461C4658460A21079248\r
+:10820000A146CDF818C006F071FE5846303104F88A\r
+:1082100001190A2106F020FD079ADDF818C0092887\r
+:108220008346EADC544692464A4600F1300BE1466A\r
+:108230000DF1E20302F801BC013A03E012F8011B60\r
+:1082400003F8011B0DF1DF018A42F7D306E030236A\r
+:108250008DF8E2309B4439AB8DF8E3B038AA9A1A16\r
+:108260000B9B1592012B02EB030B02DC15F00103B3\r
+:1082700044D000200BF1010B089040E0002B9B46FE\r
+:1082800009DDBCF1000F02D115F0010F28D003F178\r
+:10829000010BE34424E0BCF1000F02D115F0010F03\r
+:1082A00019D00CF1020B1BE00B998B4207DB15F088\r
+:1082B000010F13D0672203F1010B0E9210E0002B87\r
+:1082C000D8BFC3F1020B0B9BC8BF4FF0010B672057\r
+:1082D0009B440E9004E04FF0010B01E067210E91EA\r
+:1082E0003C9ADDF83890089209E000BF100B0100BD\r
+:1082F000140B0100180B01001C0B01000893149BC8\r
+:10830000002B00F09F812D234FF0000C8DF8F730EB\r
+:10831000A7E115F0200F0C9306F1040106D00F9D84\r
+:1083200030682A46EB17C0E900230EE015F0100F65\r
+:1083300003D033680F98186007E015F0400F3368DA\r
+:1083400015BF0F9A0F9D1A801D600E4614E50C9301\r
+:1083500045F010050D9201E00C930D9215F02002EE\r
+:108360000AD00736002226F0070303F10806D3E9F6\r
+:1083700000ABCDE908ABBEE015F0100106F1040337\r
+:1083800002D031688A460DE015F04002306808D00E\r
+:1083900080B24FF0000B82461E46CDE908AB0A467C\r
+:1083A000A9E082464FF0000B1E46CDE908ABA2E0E3\r
+:1083B0000C93002133684FF078090D9245F00205C7\r
+:1083C0001846CDE90801A34930238DF8F59004360D\r
+:1083D0008DF8F43016918DE00C9300230D92324607\r
+:1083E00004369C458DF8F730D2F800A013DB19460F\r
+:1083F000624650460793CDF818C0FFF7FDF8079B7B\r
+:10840000DDF818C0002800F02081CAEB000BE3451E\r
+:1084100000F3248123E150460793FFF7BFFB079B3E\r
+:1084200083461CE10C9345F010050D9201E00C937E\r
+:108430000D9215F0200F09D0073626F0070303F13F\r
+:108440000806D3E900ABCDE908AB16E015F0100F34\r
+:1084500006F1040301D032680AE015F0400F3268DB\r
+:1084600006D092B24FF0000B9246CDE908AB03E084\r
+:1084700010460021CDE908011E4601223BE0754966\r
+:108480000C930D92169103E00D92734A0C93169281\r
+:1084900015F0200F09D0073626F0070303F1080670\r
+:1084A000D3E900ABCDE908AB16E015F0100F06F1EB\r
+:1084B000040301D032680AE015F0400F326806D09C\r
+:1084C00092B24FF0000B9246CDE908AB03E01046A4\r
+:1084D0000021CDE908011E4615F0010F0AD0DDE9A3\r
+:1084E0000823134306D045F0020530238DF8F5909C\r
+:1084F0008DF8F430022200238DF8F73000E00122DD\r
+:10850000DDE908ABBCF1000FA8BF25F080055AEAF1\r
+:108510000B0B02D1BCF1000F6ED0012A23D0022A2E\r
+:1085200051D00DF1CB0308989A4600F00702303283\r
+:108530001A700899013BDDF824B0C80840EA4B7175\r
+:108540004FEADB0B0891CDF824B0DDE908010143C7\r
+:10855000E9D115F0010F5BD0302A59D09A4630236B\r
+:108560008AF8003054E0DDE908230A2A73F1000399\r
+:1085700008D2DDF820A00AF130030DF1CB0A8DF806\r
+:10858000CB3045E00DF1CB0B23465C46CB469946FC\r
+:10859000DDE908010A220023CDF818C006F05EFDCF\r
+:1085A000A2460023303204F80129DDE908010A223D\r
+:1085B00006F054FDDDF818C0CDE908010843E7D105\r
+:1085C0004C46D94624E00DF1CB0308999A46DDF8D4\r
+:1085D00058B001F00F021BF8022003F80129089996\r
+:1085E000099A080940EA0271120908910992DDE925\r
+:1085F00008010143E9D10BE042B915F0010F05D0A4\r
+:108600000DF1F80A30230AF82D3D01E00DF1CC0AF6\r
+:108610000DF1CC0B0022CAEB0B0B089221E00C935E\r
+:108620000D92B9F1000F00F0DF834FF0000C8DF8D0\r
+:10863000A4908DF8F7C04FF0010BCDF820C00DF1DC\r
+:10864000A40A0EE0DDF850C00BE0E3468446089033\r
+:1086500007E000BF310B0100200B0100E3469C4600\r
+:108660000893E345ACBF5B4663460E939DF8F73035\r
+:1086700013B10E9801300E9015F00201149102D042\r
+:108680000E9A02320E9215F08403179346D10D987C\r
+:108690000E99431A002B1BDC40E01A601022891847\r
+:1086A0005A60349A359101323492072A01DC08333A\r
+:1086B0000CE04046394633AACDF818C004F08EFFCE\r
+:1086C000DDF818C0002840F0968319AB103D04E097\r
+:1086D0002A461D4623464C469146102D3599934A0D\r
+:1086E000DBDC4846A1461C462B4605466360CB189A\r
+:1086F00022603593349B01333493072B01DC08341B\r
+:108700000CE04046394633AACDF818C004F066FFA5\r
+:10871000DDF818C0002840F06E8319AC9DF8F730E2\r
+:10872000DBB10DF1F703236001236360359B013357\r
+:108730003593349B01333493072B01DC08340CE070\r
+:108740004046394633AACDF818C004F047FFDDF89B\r
+:1087500018C0002840F04F8319AC149AD2B13DAB39\r
+:10876000236002236360359B02333593349B0133CE\r
+:108770003493072B01DC08340CE04046394633AA19\r
+:10878000CDF818C004F02AFFDDF818C0002840F02A\r
+:10879000328319AC179B802B46D10D980E99431A42\r
+:1087A000002B1BDC40E01A60102289185A60349AB2\r
+:1087B000359101323492072A01DC08330CE040463F\r
+:1087C000394633AACDF818C004F008FFDDF818C008\r
+:1087D000002840F0108319AB103D04E02A461D46E6\r
+:1087E00023464C469146102D3599514ADBDC4846CC\r
+:1087F000A1461C462B4605466360CB182260359384\r
+:10880000349B01333493072B01DC08340CE04046E1\r
+:10881000394633AACDF818C004F0E0FEDDF818C0E0\r
+:10882000002840F0E88219ACCBEB0C03002B17DCDE\r
+:1088300038E01A60102289185A60349A3591013252\r
+:108840003492072A01DC083308E04046394633AA4F\r
+:1088500004F0C4FE002840F0CE8219AB103D04E0C5\r
+:108860002A461D4623464C469146102D3599304ADE\r
+:10887000DFDC4846A1461C462B4605466360CB1804\r
+:1088800022603593349B01333493072B01DC083489\r
+:1088900008E04046394633AA04F0A0FE002840F024\r
+:1088A000AA8219AC15F4807F06D1359BC4F800A0CC\r
+:1088B000C4F804B05B443FE2B9F1650F40F3B781FF\r
+:1088C000109800221199002306F076FB002860D052\r
+:1088D000184B236001236360359B01333593349B30\r
+:1088E00001333493072B01DC083408E04046394655\r
+:1088F00033AA04F073FE002840F07D8219AC3C9B43\r
+:108900000B9A934203DB15F0010F00F02582139BB5\r
+:1089100012982360359B60601B183593349B01339C\r
+:108920003493072B08DC08340FE000BF440B010030\r
+:10893000000B0100420B01004046394633AA04F007\r
+:108940004DFE002840F0578219AC0B9901F1FF3918\r
+:10895000B9F1000F17DCFFE1226010229B18626062\r
+:108960003593349B01333493072B01DC083408E042\r
+:108970004046394633AA04F031FE002840F03B82DD\r
+:1089800019ACA9F11009B9F1100F359B954AE3DC38\r
+:1089900048E13C9B002B79DC934B2360012363600F\r
+:1089A000359B01333593349B01333493072B01DC22\r
+:1089B000083408E04046394633AA04F00FFE002888\r
+:1089C00040F0198219AC3C9B2BB90B9A1AB915F0DF\r
+:1089D000010F00F0C181139B12982360359B6060EA\r
+:1089E0001B183593349B01333493072B02DC04F1BD\r
+:1089F000080308E04046394633AA04F0EFFD00289A\r
+:108A000040F0F98119AB3C9C6442002C16DC2DE04F\r
+:108A100019601021521859603592349A01323492FB\r
+:108A2000072A01DC083308E04046394633AA04F03F\r
+:108A3000D5FD002840F0DF8119AB103C102C359A91\r
+:108A40006849E5DC5C601419349A19600132359488\r
+:108A5000072A349201DC083308E04046394633AA3D\r
+:108A600004F0BCFD002840F0C68119AB0B99359A83\r
+:108A7000C3F800A0596052183592349A01323492EA\r
+:108A8000072A00F3618103F1080465E10B9A089B52\r
+:108A900091460AEB020B9945A8BF9946B9F1000F20\r
+:108AA00016DD359BC4F800A0C4F804904B44359300\r
+:108AB000349B01333493072B01DC083408E0404633\r
+:108AC000394633AA04F08AFD002840F0948119AC9D\r
+:108AD000089829EAE979C9EB0009B9F1000F17DC18\r
+:108AE00030E0226010229B1862603593349B013382\r
+:108AF0003493072B01DC083408E04046394633AA9A\r
+:108B000004F06CFD002840F0768119ACA9F1100941\r
+:108B1000B9F1100F359B334AE3DC22604B44C4F8B3\r
+:108B200004903593349B01333493072B01DC0834D4\r
+:108B300008E04046394633AA04F050FD002840F0D2\r
+:108B40005A8119AC3C9B0B998B4202DB15F0010F4B\r
+:108B500017D0129B139A12986360359B22601B18E2\r
+:108B60003593349B01333493072B01DC083408E040\r
+:108B70004046394633AA04F031FD002840F03B81DD\r
+:108B800019AC08993C9A0B980AEB0103C3EB0B0B49\r
+:108B9000C2EB0009CB45B8BFD946B9F1000F15DDCE\r
+:108BA0002360359BC4F804904B443593349B0133C8\r
+:108BB0003493072B01DC083408E04046394633AAD9\r
+:108BC00004F00CFD002840F0168119AC3C9B29EA0A\r
+:108BD000E9790B99CB1AC9EB0309B9F1000F1CDC39\r
+:108BE000BAE000BF000B0100420B0100226010221E\r
+:108BF0009B1862603593349B01333493072B01DC5F\r
+:108C0000083408E04046394633AA04F0E7FC00285F\r
+:108C100040F0F18019ACA9F11009B9F1100F359BA2\r
+:108C20007B4AE3DC22604B44C4F8049084E00B9A56\r
+:108C3000012A02DC15F0010F62D001236360359B2D\r
+:108C4000C4F800A001333593349B01333493072BD0\r
+:108C500001DC083408E04046394633AA04F0BEFC83\r
+:108C6000002840F0C88019AC139B12982360359BF4\r
+:108C700060601B183593349B01333493072B01DC60\r
+:108C8000083408E04046394633AA04F0A7FC00281F\r
+:108C900040F0B18019AC119900231098002206F021\r
+:108CA0008BF90B994B1E30B90AF101022260359AFB\r
+:108CB0006360D3182AE0B3F1000917DC36E02260C4\r
+:108CC00010229B1862603593349B01333493072B39\r
+:108CD00001DC083408E04046394633AA04F07EFC43\r
+:108CE000002840F0888019ACA9F11009B9F1100FE3\r
+:108CF000359B474AE3DC22604B44C4F8049005E00E\r
+:108D000001236360359BC4F800A001333593349B85\r
+:108D100001333493072B01DC083407E04046394621\r
+:108D200033AA04F05BFC002865D119AC38AB159A66\r
+:108D30002360359B62609B183593349B01333493D9\r
+:108D4000072B01DC083407E04046394633AA04F01B\r
+:108D500045FC00284FD119AC15F0040F2FD00D9B06\r
+:108D6000DDF838A0CAEB0305002D15DC27E02260F2\r
+:108D700010229B1862603593349B01333493072B88\r
+:108D800001DC083407E04046394633AA04F026FCEB\r
+:108D9000002830D119AC103D102D359B1D4AE6DC62\r
+:108DA00065605D19349B226001333595072B349340\r
+:108DB00005DD4046394633AA04F010FCD8B90F98B7\r
+:108DC0000E9A0D99359B8A42ACBF801840180F90BF\r
+:108DD0002BB14046394633AA04F000FC58B90023B1\r
+:108DE00019AC3493FEF7C8BF359B23B140463946D2\r
+:108DF00033AA04F0F3FBBB890F9D03F04003002B63\r
+:108E000018BF4FF0FF350F950F983FB0BDE8F08FBA\r
+:108E1000000B0100440B01002DE9F04F0C46ADF5AD\r
+:108E20002D7D1E4682461546FDF708FEA38913F4E4\r
+:108E3000005F06D143F40053A381636E23F4005313\r
+:108E400063660020079583460746099008900799B6\r
+:108E50000A78ADF8AE22002A00F0BF85914B0131AF\r
+:108E600007911968881890F8018018F0080818D040\r
+:108E70006368002B05DC5046214604F067FC00289F\r
+:108E8000E5D12368874D1A7829688A18527812F03C\r
+:108E9000080FDCD06268013301372360013A626059\r
+:108EA000E6E7252A51D1079A454612F8013B642B83\r
+:108EB0007AD029D8472B00F08C8014D8392B0AD8C7\r
+:108EC000302B6CD2252B3FD02A2B57D00792002B6A\r
+:108ED00000F0B980BFE0442B079200F0C280452B20\r
+:108EE00040F0B98076E0582B6DD006D84C2B50D08E\r
+:108EF0004F2B079240F0AF805EE05B2B07926FD064\r
+:108F0000632B40F0A88075E06E2B7FD008D8682BCB\r
+:108F100042D05ED3692B49D06C2B40F09B8030E06F\r
+:108F2000732B079259D005D86F2B0AD0702B40F0C5\r
+:108F3000928064E0752B00F09980782B40F08B8054\r
+:108F400042E0594809903BE007926368002B06DC39\r
+:108F50005046214604F0FAFB002840F03085236893\r
+:108F6000079D197815F8012C914240F0368562680A\r
+:108F7000013301372360013A626068E748F0100866\r
+:108F800093E713786C2B01D1013202E048F001081D\r
+:108F90008BE748F0020888E748F0040885E70A20D4\r
+:108FA0004543303DED1880E707925CE03F494FF0C4\r
+:108FB000000B079209915DE03B4A48F001080992D5\r
+:108FC0004FF0080B56E00792374B48F400780993AE\r
+:108FD00019E007924FF004094EE04FF002094BE010\r
+:108FE00067A8079903F0E4FA48F040084FF0010938\r
+:108FF000079041E048F040084FF000093CE02A4863\r
+:1090000048F4087809904FF0100B33E018F0100F77\r
+:1090100007927FF41CAF18F0040F06F1040102D090\r
+:1090200033681F8004E018F0010F03D033681F601D\r
+:109030000E460CE718F0020FF8D030683A46FB17DE\r
+:10904000C0E90023F4E7FDF7FAFC4FF0FF33089383\r
+:1090500000F0C9BC0792CB185B7803F00303012B27\r
+:1090600001D148F001081148099001E00E49099129\r
+:109070004FF00A0B4FF003096368002B06DC5046E3\r
+:10908000214604F063FB002840F0998418F0400F5B\r
+:109090001FD115E06268013A6260002A08DD0133E1\r
+:1090A00023600CE0A40600108DD30000D97B0000E3\r
+:1090B0005046214604F04AFB002840F080840137E6\r
+:1090C00023689B481A7801688A18527812F0080FB2\r
+:1090D000E0D109F1FF39B9F1030F05D8DFE819F044\r
+:1090E0009700EA00BB018E02002D08BF012518F091\r
+:1090F000010308F010095AD0A9A800210822FEF7A0\r
+:10910000BAFAB9F1000F03D132680436059201E0D2\r
+:10911000002305934B464FF00008B1461E4602F06F\r
+:10912000A5FD804500F04B8423680FAA504613F834\r
+:10913000011B02F8081008F1010861682360A9AB5F\r
+:109140000139009361604346059902F0ADFDB0F12D\r
+:10915000FF3F00F0348418B92EB90598068002E06C\r
+:1091600010F1020F09D04744013D26B90599B046D8\r
+:109170000231059101E04FF000086368002B0CDC20\r
+:109180005046214604F0E2FA38B133464E4699463D\r
+:10919000B8F1000F06D000F012BC002DBFD133464D\r
+:1091A0004E469946B9F1000F7FF451AE06E1B9F190\r
+:1091B000000F1CD09846D4F804902368A9450FDA14\r
+:1091C0004B44504623602146C84404F0BFFA10B90E\r
+:1091D000C9EB0505EFE7B8F1000F40F01081EEE3B1\r
+:1091E000C5EB0902A84462605D19256007E100949F\r
+:1091F0005046316801222B4604F0C5FA002800F0E1\r
+:10920000DE83089B0436C719013308931FE6002D3F\r
+:1092100008BF4FF0FF3518F0100F20D04FF00008B6\r
+:1092200012E0626808F1010801332360013AA845A1\r
+:10923000626000F0E480002A06DC5046214604F01B\r
+:1092400085FA002840F0DB80236867A91A788A5CD9\r
+:10925000002AE6D1B8F1000F40F0D180BDE3D6F886\r
+:109260000080C14614E06268013A626013F8012B85\r
+:10927000013D09F8012B236010D06368002B07DC47\r
+:109280005046214604F062FA10B1C14506D196E37A\r
+:10929000236867A91A788A5C002AE4D1B9EB080828\r
+:1092A00000F09B83002389F80030089D04360135C7\r
+:1092B0000895A4E0002D08BF4FF0FF3518F001031A\r
+:1092C00008F0100005907DD00021A7A80822FEF725\r
+:1092D000D2F9059919B9D6F80090043603E00DF5D6\r
+:1092E0002A7909F1060933464FF000084E4699469F\r
+:1092F00050E002F0BBFC804500F0618323680FAAB8\r
+:10930000504613F8011B02F8081008F101086168C3\r
+:109310002360A7AB0139009361604346314602F0F8\r
+:10932000C3FCB0F1FF3F00F04A8318B9308004E07D\r
+:10933000A406001010F1020F1CD0308802F084FC4B\r
+:1093400080B14B46B1461E4608E008F1FF380FAB2E\r
+:109350005046224613F8081004F0BBF9B8F1000F8C\r
+:10936000F3D125E0059A4744013D12B902369046F3\r
+:1093700000E080466368002B0CDC5046214604F078\r
+:10938000E5F938B14B46B1461E46B8F1000F40F042\r
+:1093900016830DE0236896481B780268D3185B7823\r
+:1093A00013F0080F01D1002DA3D14B46B1461E4644\r
+:1093B000059900297FF44BADA9F80010089A0132F5\r
+:1093C000089244E50598E0B198460FE0626808F11C\r
+:1093D000010801332360013AA84562600FD0002ADA\r
+:1093E00004DC5046214604F0B1F940B923688048B6\r
+:1093F0001A7801688A18527812F0080FE6D04744AC\r
+:1094000025E5D6F8008006F10409464611E06268B9\r
+:10941000013A626013F8012B013D06F8012B23602D\r
+:1094200010D06368002B04DC5046214604F08EF90E\r
+:1094300040B923686E481A7801688A18527812F089\r
+:10944000080FE4D0002333700899C8EB0707F71919\r
+:1094500001310891B0E26B1EB3F5AE7F05D9A5F5D9\r
+:10946000AE7340F25D15013B00E00023BC4648F4BA\r
+:1094700058680DF13C091F460022059222681278B7\r
+:10948000392A09D8382A33D2302A14D02CD82B2A9A\r
+:109490003AD02D2A5FD137E0582A3BD004D8A2F128\r
+:1094A0004101052957D829E0612A54D3662A25D9D4\r
+:1094B000782A50D12EE018F4006F36D0BBF1000F9F\r
+:1094C00003D148F400780BF1080B18F4806F02D038\r
+:1094D00028F4B06829E028F460780FB1013F013525\r
+:1094E000059B0133059322E0424931F91BB008E0A6\r
+:1094F000404931F91BB0BBF1080F01E0BBF10A0F85\r
+:1095000029DD28F4386810E018F0800F23D028F007\r
+:1095100080080AE008F4C061B1F5007F1BD128F48F\r
+:1095200000784FF0100B48F4A06809F8012B62682E\r
+:10953000013A6260002A03DD22680132226008E0FD\r
+:1095400050462146CDF810C004F000F9DDF810C0F7\r
+:1095500008B9013D92D118F4807F67460CD00FAB5B\r
+:10956000994505D9504619F8011D224604F0B1F875\r
+:109570000FAB994500F0318218F0100231D189F813\r
+:1095800000205B4650460FA9099DA84718F0200F00\r
+:1095900006F104031FD118F0040F02D032681080C6\r
+:1095A0001BE018F0010216D118F0020F13D0124B75\r
+:1095B0000998984205D150460FA95B4603F064FF15\r
+:1095C00004E050460FA95B4603F02AFE33680436D8\r
+:1095D0001860596002E0326810601E460899013137\r
+:1095E00008910FAB059AFF1ABF184F442FE400BF34\r
+:1095F000A40600105A0B01008DD300006B1EB3F5BA\r
+:10960000AE7F06D9A5F5AE75013D0B9540F25D150F\r
+:1096100001E000230B934FF000090FABCDF814B01D\r
+:1096200048F4F068BB4606961F464E465346CA4667\r
+:10963000CDF82890CDF83490CDF830902168097895\r
+:109640004E2958D01DD839290FD8312944D22E2976\r
+:1096500000F0928005D82B2946D02D2940F0CF80EC\r
+:1096600042E0302940F0CB8028E0452900F08B8093\r
+:1096700003D8412940F0C38054E0462970D04929DD\r
+:1096800013E066296CD00CD8592971D003D854291D\r
+:1096900040F0B58068E0612944D0652940F0AF8092\r
+:1096A00071E06E2927D003D8692940F0A8803DE0F9\r
+:1096B000742959D0792940F0A28059E018F4807FAC\r
+:1096C0000AD00B9828F080080136002800F082802C\r
+:1096D000013801350B907DE009EB0A00002840F0CD\r
+:1096E0008E8028F4C07873E018F0800F00F0878037\r
+:1096F00028F080086CE0BAF1000F0AD166B908F4CE\r
+:10970000E060B0F5E06F07D128F4F0680AF1010AD3\r
+:109710005EE0BAF1020F4DD0B9F1010F1BD0B9F1E3\r
+:10972000040F17E0BAF1010F47D068E0B9F1000F5C\r
+:109730000BD1002E6FD108F4E060B0F5E06F75D169\r
+:1097400028F4F06809F1010942E0B9F1030F02D0F1\r
+:10975000B9F1050F53D109F101095FFA89F937E031\r
+:10976000B9F1020F2CD04AE0B9F1060F2BD046E038\r
+:10977000B9F1070F2AD042E018F4007F3FD028F457\r
+:1097800020780C9624E008F4A060B0F5806F04D037\r
+:1097900018F4806F33D0002E48D018F4007F03D126\r
+:1097A0000C9A0A97B61A0D9628F4F068002648F429\r
+:1097B000C0780DE04FF0030A0AE04FF0020A07E01C\r
+:1097C0004FF0030904E04FF0070901E04FF00809EA\r
+:1097D00007F8011B61680BF1010B01396160002979\r
+:1097E00003DD21680131216006E01846214603931C\r
+:1097F00003F0ACFF039B10B9013D7FF41FAFB446EB\r
+:109800005246069E9A463B465F46DDF814B0BCF1D0\r
+:10981000000F13D007E0B4465246069E9A463B46D8\r
+:109820005F46DDF814B028F4807807E0B44652466D\r
+:10983000069E9A463B465F46DDF814B0013A012A7F\r
+:109840000BD81D4605E0504615F8011D224603F0D1\r
+:1098500040FF0FAB9D42F6D8BFE009F1FF32062A68\r
+:109860002CD8B9F1020F01D81D4623E005934D46CF\r
+:109870000DE0059A504612F8011D0393CDF810C073\r
+:109880000592224603F025FFDDF810C0039B013D41\r
+:10989000EDB2022DEDD1A9F103095FFA89F9C9EB07\r
+:1098A0000303C9EB070709E0504615F8011D2246DE\r
+:1098B00003F00FFF0FAB9D42F6D88EE018F4807FC7\r
+:1098C0002CD018F4806F0BD01D4605E0504615F8DB\r
+:1098D000011D224603F0FDFE0FAB9D42F6D87CE051\r
+:1098E00013F8011D013F65290ED045290CD05046C3\r
+:1098F00022460393013FCDF810C003F0EAFE039B1C\r
+:10990000DDF810C013F8011D504622460393CDF830\r
+:1099100010C003F0DEFEDDF810C0039B18F010024B\r
+:109920007FF495AA08F4C0611A70B1F5806F07D171\r
+:109930000C9DBCEB050C19D0CCF100020A9309E098\r
+:109940000D9898B10A9B5046591C0A23FEF744F91A\r
+:109950000D9D421B0A9863AB0333984224BF0DF55B\r
+:10996000C7710A9122490A98FEF770F80022504602\r
+:109970000FA906F1040902F067FE18F0010F024674\r
+:109980000B4602D118F0020F03D03168C1E9002361\r
+:109990000FE035680490039102F0D8FD049A039B10\r
+:1099A00010B902F037FE03E010461946FCF732FB0F\r
+:1099B0002860089A013208924E46FFF748BAFDF730\r
+:1099C0003EF8089B63B1A389089D03F04003002B78\r
+:1099D00018BF4FF0FF35089505E0FDF730F802E0BD\r
+:1099E0004FF0FF30089008980DF52D7DBDE8F08F01\r
+:1099F000540B01001346054A30B505460C46106865\r
+:109A000029462246BDE8304001F04EB990020010D0\r
+:109A10002DE9F04FF7B00F4615461E46804602F07E\r
+:109A20002BF900681390FEF7B9F81290B8F1000F07\r
+:109A300005D0D8F8183013B94046FCF795FF8F4B86\r
+:109A40009F4202D1D8F804700AE08D4B9F4202D1A8\r
+:109A5000D8F8087004E08B4B9F4208BFD8F80C7010\r
+:109A6000BB8913F4005F06D143F40053BB817B6EC6\r
+:109A700023F400537B66BB8913F0080F01D03B69C8\r
+:109A800033B94046394601F023F9002841F09B8064\r
+:109A9000BA8902F01A030A2B36D1FB8913F4004F5E\r
+:109AA00032D1ADF8F23022F002023B6A4046ADF806\r
+:109AB000F02039A97A6E4193BB6A52922A464393A9\r
+:109AC00019AB39933D9380233B933E93803B3F9367\r
+:109AD0003346FFF79DFF00280E9009DB39A9404669\r
+:109AE000FCF74AFE0E99002818BF4FF0FF310E9187\r
+:109AF000BDF8F03013F0400F01F06880BB8943F0EF\r
+:109B00004003BB8101F062B8002353AC6F936D94A6\r
+:109B10006E930C950B9310931193169315930E93CC\r
+:109B20000C9B1D4613F8012B0AB1252AF9D10C9A7A\r
+:109B3000B5EB020918D06F9B2260C4F804904B4427\r
+:109B40006F936E9B01336E93072B01DC083408E0A2\r
+:109B5000404639466DAA03F08AFE002841F029806C\r
+:109B600053AC0E9B4B440E932B78002B01F01A80C4\r
+:109B7000002301350C951D468DF8D7314FF0FF3C81\r
+:109B80000D932A460C9B05E00E4603E01E464FF05F\r
+:109B9000FF3C0B4613F8019BA9F12001582900F264\r
+:109BA0001C84DFE811F059001A041A045F001A043B\r
+:109BB0001A041A041A041A041A04620071001A041E\r
+:109BC000680075001A0498009B009B009B009B0096\r
+:109BD0009B009B009B009B009B001A041A041A0424\r
+:109BE0001A041A041A041A041A041A041A04C600DD\r
+:109BF00003011A0403011A041A041A041A04AA001D\r
+:109C00001A041A04AE021A041A041A041A041A04D2\r
+:109C100019031A041A044B031A041A041A041A0426\r
+:109C20001A041A041A041A041A041A04BB00CB00FA\r
+:109C3000030103010301AD00CB001A041A04B000B4\r
+:109C40001A049002B302DF02B8001A04F3021A04E5\r
+:109C50001E031A041A0446039DF8D711002999D14E\r
+:109C6000203112E045F0010594E73268311D002AE9\r
+:109C70008ADA52420E4645F004058BE7980A010045\r
+:109C8000B80A0100D80A01002B218DF8D71181E70D\r
+:109C9000194611F8019BB9F12A0F03D019464FF06C\r
+:109CA000000C10E0D6F800C0331DBCF1000FFFF629\r
+:109CB0006DAF1E460B466DE74FF00A0909FB0C0C11\r
+:109CC00091F801901946A9F1300001330928F3D920\r
+:109CD0004CEAEC7C60E745F080055BE71946002222\r
+:109CE0000A23A9F1300903FB029211F8019BA9F1A3\r
+:109CF00030000B460928F3D94EE745F0080549E73F\r
+:109D000045F0400546E719786C2901D1013302E09E\r
+:109D100045F010053EE745F020053BE70C934FF07A\r
+:109D2000000C336804360D928DF8D7C18DF88C3154\r
+:109D30005FE30C9345F010050D9201E00C930D923A\r
+:109D400015F0200F09D0073626F0070303F10806A7\r
+:109D5000D3E90001CDE9080116E015F0100F06F176\r
+:109D6000040301D0326809E015F0400F326805D0D5\r
+:109D700012B21046D117CDE9080104E092464FEA2D\r
+:109D8000E27BCDE908AB1E46DDE90801002871F150\r
+:109D9000000180F28E82DDE90823524263EB430327\r
+:109DA000CDE908232D238DF8D73182E20C93F31DE2\r
+:109DB00015F0080F23F007030D9203F1080614BFF6\r
+:109DC00018681968CDF83C9014BF109010915B682A\r
+:109DD0001098CDF818C01193119902F0B7FBDDF877\r
+:109DE00018C0012819D1109800221199002305F0FC\r
+:109DF000EDF810B12D238DF8D731A94B4FF0000CA1\r
+:109E0000A84A25F080054FF0030BCDF820C0B9F12A\r
+:109E1000470FCCBF92469A4601E310981199CDF8AE\r
+:109E200018C002F093FBDDF818C058B99E4B25F01E\r
+:109E300080059E4A4FF0030BB9F1470FCCBF924605\r
+:109E40009A46E1E2BCF1FF3F0BD0B9F1670F02D0B7\r
+:109E5000B9F1470F07D1BCF1000F08BF4FF0010C5B\r
+:109E600001E04FF0060C119B45F48075002B05DADC\r
+:109E700003F100422D230B92149303E0119800216B\r
+:109E800014910B90B9F1660F0BD0B9F1460F08D0C1\r
+:109E9000B9F1650F02D0B9F1450F05D10CF1010BF5\r
+:109EA00003E0E346032301E0E34602230093404638\r
+:109EB00074AB109A029373AB039372AB04930B9B36\r
+:109EC000CDF818C0CDF804B001F096F8B9F1670FDD\r
+:109ED000DDF818C0824602D0B9F1470F02D115F063\r
+:109EE000010F34D0B9F1660F0AEB0B02089202D0D1\r
+:109EF000B9F1460F15D19AF80030302B0DD11098DA\r
+:109F000000220B990023CDF818C005F055F8DDF8B4\r
+:109F100018C010B9CBF1010374930898749BC01852\r
+:109F20000890109800220B990023CDF818C005F076\r
+:109F300043F8DDF818C030B10899729103E030227F\r
+:109F400003F8012B7293729B089A9342F7D3729B8A\r
+:109F5000B9F1670FCAEB03030B93749B02D0B9F1FD\r
+:109F6000470F08D113F1030F9B4601DB634575DDF5\r
+:109F7000A9F1020902E0B9F1660F59D003F1FF3BE4\r
+:109F80008DF8C091BBF1000FCDF8D0B103DACBF161\r
+:109F9000000B2D2300E02B23BBF1090F8DF8C131FD\r
+:109FA0002FDD0DF16A035246CC46A2461C465846A8\r
+:109FB0000A210792A146CDF818C004F097FF584631\r
+:109FC000303104F801190A2104F046FE079ADDF841\r
+:109FD00018C009288346EADC544692464A4600F1F6\r
+:109FE000300BE1460DF5E17302F801BC013A03E0E4\r
+:109FF00012F8011B03F8011B0DF16B018A42F7D324\r
+:10A0000006E030238DF8C2319B4471AB8DF8C3B1AB\r
+:10A0100070AA9A1A0B9B1592012B02EB030B02DC20\r
+:10A0200015F0010344D000200BF1010B089040E033\r
+:10A03000002B9B4609DDBCF1000F02D115F0010F8A\r
+:10A0400028D003F1010BE34424E0BCF1000F02D15E\r
+:10A0500015F0010F19D00CF1020B1BE00B998B428C\r
+:10A0600007DB15F0010F13D0672203F1010B0F92EC\r
+:10A0700010E0002BD8BFC3F1020B0B9BC8BF4FF001\r
+:10A08000010B67209B440F9004E04FF0010B01E0AF\r
+:10A0900067210F91749ADDF83C90089209E000BFA7\r
+:10A0A000100B0100140B0100180B01001C0B010028\r
+:10A0B0000893149B002B00F0A3812D234FF0000C7C\r
+:10A0C0008DF8D731ABE115F0200F0C9306F10401A8\r
+:10A0D00006D00E9D30682A46EB17C0E900230EE03B\r
+:10A0E00015F0100F03D033680E98186007E015F0D4\r
+:10A0F000400F336815BF0E9A0E9D1A801D600E46E4\r
+:10A100000EE50C9345F010050D9201E00C930D92B5\r
+:10A1100015F020020AD00736002226F0070303F1CB\r
+:10A120000806D3E900ABCDE908ABBEE015F010019D\r
+:10A1300006F1040302D031688A460DE015F04002B2\r
+:10A14000306808D080B24FF0000B82461E46CDE941\r
+:10A1500008AB0A46A9E082464FF0000B1E46CDE947\r
+:10A1600008ABA2E00C93002133684FF078090D9200\r
+:10A1700045F002051846CDE90801A54930238DF8C0\r
+:10A18000D59104368DF8D43116918DE00C930023CF\r
+:10A190000D92324604369C458DF8D731D2F800A096\r
+:10A1A00013DB1946624650460793CDF818C0FDF7F9\r
+:10A1B00023FA079BDDF818C0002800F02481CAEBC1\r
+:10A1C000000BE34500F3288127E150460793FDF794\r
+:10A1D000E5FC079B834620E10C9345F010050D92AA\r
+:10A1E00001E00C930D9215F0200F09D0073626F0F0\r
+:10A1F000070303F10806D3E900ABCDE908AB16E08D\r
+:10A2000015F0100F06F1040301D032680AE015F0D2\r
+:10A21000400F326806D092B24FF0000B9246CDE963\r
+:10A2200008AB03E010460021CDE908011E460122DB\r
+:10A230003BE077490C930D92169103E00D92754A1D\r
+:10A240000C93169215F0200F09D0073626F007035D\r
+:10A2500003F10806D3E900ABCDE908AB16E015F031\r
+:10A26000100F06F1040301D032680AE015F0400F28\r
+:10A27000326806D092B24FF0000B9246CDE908AB9F\r
+:10A2800003E010460021CDE908011E4615F0010F3C\r
+:10A290000AD0DDE90823134306D045F00205302338\r
+:10A2A0008DF8D5918DF8D431022200238DF8D73165\r
+:10A2B00000E00122DDE908ABBCF1000FA8BF25F0EA\r
+:10A2C00080055AEA0B0B02D1BCF1000F72D0012AB3\r
+:10A2D00023D0022A55D06CAB033308989A4600F07D\r
+:10A2E000070230321A700899013BDDF824B0C80823\r
+:10A2F00040EA4B714FEADB0B0891CDF824B0DDE961\r
+:10A3000008010143E9D115F0010F5FD0302A5DD07B\r
+:10A310009A4630238AF8003058E0DDE908230A2AFB\r
+:10A3200073F100030AD2DDF820A00AF130030DF525\r
+:10A33000D87A8DF8B3310AF1030A47E00DF5D87BDE\r
+:10A3400023460BF1030B5C46CB469946DDE9080139\r
+:10A350000A220023CDF818C004F080FEA246002394\r
+:10A36000303204F80129DDE908010A2204F076FE02\r
+:10A37000DDF818C0CDE908010843E7D14C46D946BD\r
+:10A3800024E06CAB033308999A46DDF858B001F02D\r
+:10A390000F021BF8022003F801290899099A0809FD\r
+:10A3A00040EA0271120908910992DDE908010143AE\r
+:10A3B000E9D10BE042B915F0010F05D00DF5EC7AAB\r
+:10A3C00030230AF8253D01E00DF5DA7A0DF5DA7B48\r
+:10A3D0000022CAEB0B0B089221E00C930D92B9F10D\r
+:10A3E000000F00F0DF834FF0000C8DF88C918DF89A\r
+:10A3F000D7C14FF0010BCDF820C00DF5C67A0EE0A5\r
+:10A40000DDF850C00BE0E3468446089007E000BF4B\r
+:10A41000310B0100200B0100E3469C460893E34505\r
+:10A42000ACBF5B4663460F939DF8D73113B10F98CD\r
+:10A4300001300F9015F00201149102D00F9A0232F0\r
+:10A440000F9215F08403179346D10D980F99431A74\r
+:10A45000002B1BDC40E01A60102289185A606E9AAB\r
+:10A460006F9101326E92072A01DC08330CE04046FE\r
+:10A4700039466DAACDF818C003F0F9F9DDF818C017\r
+:10A48000002840F0968353AB103D04E02A461D4659\r
+:10A4900023464C469146102D6F99934ADBDC484683\r
+:10A4A000A1461C462B4605466360CB1822606F937D\r
+:10A4B0006E9B01336E93072B01DC08340CE04046A1\r
+:10A4C00039466DAACDF818C003F0D1F9DDF818C0EF\r
+:10A4D000002840F06E8353AC9DF8D731DBB175ABEB\r
+:10A4E00003332360012363606F9B01336F936E9B83\r
+:10A4F00001336E93072B01DC08340CE040463946EB\r
+:10A500006DAACDF818C003F0B2F9DDF818C0002824\r
+:10A5100040F04F8353AC149AD2B175AB2360022341\r
+:10A5200063606F9B02336F936E9B01336E93072BB7\r
+:10A5300001DC08340CE0404639466DAACDF818C05D\r
+:10A5400003F095F9DDF818C0002840F0328353ACD1\r
+:10A55000179B802B46D10D980F99431A002B1BDCBB\r
+:10A5600040E01A60102289185A606E9A6F91013289\r
+:10A570006E92072A01DC08330CE0404639466DAA8A\r
+:10A58000CDF818C003F073F9DDF818C0002840F0CA\r
+:10A59000108353AB103D04E02A461D4623464C462B\r
+:10A5A0009146102D6F99514ADBDC4846A1461C4666\r
+:10A5B0002B4605466360CB1822606F936E9B013378\r
+:10A5C0006E93072B01DC08340CE0404639466DAA37\r
+:10A5D000CDF818C003F04BF9DDF818C0002840F0A2\r
+:10A5E000E88253ACCBEB0C03002B17DC38E01A608D\r
+:10A5F000102289185A606E9A6F9101326E92072A62\r
+:10A6000001DC083308E0404639466DAA03F02FF913\r
+:10A61000002840F0CE8253AB103D04E02A461D4690\r
+:10A6200023464C469146102D6F99304ADFDC484650\r
+:10A63000A1461C462B4605466360CB1822606F93EB\r
+:10A640006E9B01336E93072B01DC083408E0404613\r
+:10A6500039466DAA03F00BF9002840F0AA8253ACEA\r
+:10A6600015F4807F06D16F9BC4F800A0C4F804B035\r
+:10A670005B443FE2B9F1650F40F3B78110980022C7\r
+:10A680001199002304F098FC002860D0184B236037\r
+:10A69000012363606F9B01336F936E9B01336E9355\r
+:10A6A000072B01DC083408E0404639466DAA03F068\r
+:10A6B000DEF8002840F07D8253AC749B0B9A9342E5\r
+:10A6C00003DB15F0010F00F02582139B1298236025\r
+:10A6D0006F9B60601B186F936E9B01336E93072B0B\r
+:10A6E00008DC08340FE000BF7C0B01008C0B01007C\r
+:10A6F000420B0100404639466DAA03F0B8F8002825\r
+:10A7000040F0578253AC0B9901F1FF39B9F1000FBA\r
+:10A7100017DCFFE1226010229B1862606F936E9B32\r
+:10A7200001336E93072B01DC083408E040463946BC\r
+:10A730006DAA03F09CF8002840F03B8253ACA9F1CD\r
+:10A740001009B9F1100F6F9B954AE3DC48E1749B47\r
+:10A75000002B79DC934B2360012363606F9B0133F3\r
+:10A760006F936E9B01336E93072B01DC083408E076\r
+:10A77000404639466DAA03F07AF8002840F0198265\r
+:10A7800053AC749B2BB90B9A1AB915F0010F00F05A\r
+:10A79000C181139B129823606F9B60601B186F939D\r
+:10A7A0006E9B01336E93072B02DC04F1080308E073\r
+:10A7B000404639466DAA03F05AF8002840F0F98166\r
+:10A7C00053AB749C6442002C16DC2DE01960102100\r
+:10A7D000521859606F926E9A01326E92072A01DC0C\r
+:10A7E000083308E0404639466DAA03F040F80028D7\r
+:10A7F00040F0DF8153AB103C102C6F9A6849E5DCC8\r
+:10A800005C6014196E9A196001326F94072A6E9277\r
+:10A8100001DC083308E0404639466DAA03F027F80A\r
+:10A82000002840F0C68153AB0B996F9AC3F800A083\r
+:10A83000596052186F926E9A01326E92072A00F395\r
+:10A84000618103F1080465E10B9A089B91460AEBCC\r
+:10A85000020B9945A8BF9946B9F1000F16DD6F9B11\r
+:10A86000C4F800A0C4F804904B446F936E9B01336E\r
+:10A870006E93072B01DC083408E0404639466DAA88\r
+:10A8800002F0F5FF002840F0948153AC089829EAC3\r
+:10A89000E979C9EB0009B9F1000F17DC30E022605B\r
+:10A8A00010229B1862606F936E9B01336E93072B8F\r
+:10A8B00001DC083408E0404639466DAA02F0D7FFB3\r
+:10A8C000002840F0768153ACA9F11009B9F1100FBE\r
+:10A8D0006F9B334AE3DC22604B44C4F804906F93CF\r
+:10A8E0006E9B01336E93072B01DC083408E0404671\r
+:10A8F00039466DAA02F0BBFF002840F05A8153ACE4\r
+:10A90000749B0B998B4202DB15F0010F17D0129B41\r
+:10A91000139A129863606F9B22601B186F936E9B53\r
+:10A9200001336E93072B01DC083408E040463946BA\r
+:10A930006DAA02F09CFF002840F03B8153AC0899BF\r
+:10A94000749A0B980AEB0103C3EB0B0BC2EB0009E3\r
+:10A95000CB45B8BFD946B9F1000F15DD23606F9B19\r
+:10A96000C4F804904B446F936E9B01336E93072B96\r
+:10A9700001DC083408E0404639466DAA02F077FF52\r
+:10A98000002840F0168153AC749B29EAE9790B99B1\r
+:10A99000CB1AC9EB0309B9F1000F1CDCBAE000BF08\r
+:10A9A0008C0B0100420B0100226010229B18626098\r
+:10A9B0006F936E9B01336E93072B01DC083408E024\r
+:10A9C000404639466DAA02F052FF002840F0F1805F\r
+:10A9D00053ACA9F11009B9F1100F6F9B7D4AE3DC6C\r
+:10A9E00022604B44C4F8049084E00B9A012A02DCF4\r
+:10A9F00015F0010F62D0012363606F9BC4F800A0C3\r
+:10AA000001336F936E9B01336E93072B01DC083487\r
+:10AA100008E0404639466DAA02F029FF002840F0C0\r
+:10AA2000C88053AC139B129823606F9B60601B1807\r
+:10AA30006F936E9B01336E93072B01DC083408E0A3\r
+:10AA4000404639466DAA02F012FF002840F0B1805E\r
+:10AA500053AC119900231098002204F0ADFA0B9921\r
+:10AA60004B1E30B90AF1010222606F9A6360D3185D\r
+:10AA70002AE0B3F1000917DC36E0226010229B18AF\r
+:10AA800062606F936E9B01336E93072B01DC083479\r
+:10AA900008E0404639466DAA02F0E9FE002840F081\r
+:10AAA000888053ACA9F11009B9F1100F6F9B494A86\r
+:10AAB000E3DC22604B44C4F8049005E001236360AA\r
+:10AAC0006F9BC4F800A001336F936E9B01336E93AC\r
+:10AAD000072B01DC083407E0404639466DAA02F036\r
+:10AAE000C6FE002865D153AC70AB159A23606F9BEE\r
+:10AAF00062609B186F936E9B01336E93072B01DC92\r
+:10AB0000083407E0404639466DAA02F0B0FE00283E\r
+:10AB10004FD153AC15F0040F2FD00D9BDDF83CA0A6\r
+:10AB2000CAEB0305002D15DC27E0226010229B18DC\r
+:10AB300062606F936E9B01336E93072B01DC0834C8\r
+:10AB400007E0404639466DAA02F091FE002830D158\r
+:10AB500053AC103D102D6F9B1F4AE6DC65605D19FC\r
+:10AB60006E9B226001336F95072B6E9305DD404687\r
+:10AB700039466DAA02F07BFED8B90E980F9A0D994E\r
+:10AB80006F9B8A42ACBF801840180E902BB1404694\r
+:10AB900039466DAA02F06BFE58B9002353AC6E9390\r
+:10ABA000FEF7BEBF6F9B23B1404639466DAA02F047\r
+:10ABB0005EFEBB890E9D03F04003002B18BF4FF0D3\r
+:10ABC000FF350E9502E04FF0FF300E900E9877B0F3\r
+:10ABD000BDE8F08F8C0B01007C0B010070B50C46BA\r
+:10ABE0001546064618B183690BB9FBF7BDFE2B4B22\r
+:10ABF0009D4201D1756808E0294B9D4201D1B5689D\r
+:10AC000003E0284B9D4208BFF568AB69AB60AB8998\r
+:10AC100013F0080F01D02B695BB93046294600F0CC\r
+:10AC200057F830B1AB8943F04003AB81092333605F\r
+:10AC300030E0AB8913F4005F06D143F40053AB81DD\r
+:10AC40006B6E23F400536B662B692868C01A6B691E\r
+:10AC5000984204DB30462946FBF78EFDD0B9AB683D\r
+:10AC6000E4B20130013BAB602B6803F8014B2B6071\r
+:10AC70006B69984205D0AB8913F0010F0CD00A2CF8\r
+:10AC80000AD130462946FBF777FD002818BF4FF060\r
+:10AC9000FF3401E04FF0FF34204670BD980A0100F8\r
+:10ACA000B80A0100D80A010038B50546074C002053\r
+:10ACB0002060084611461A46F5F72CFCB0F1FF3F1C\r
+:10ACC00002D1236803B12B6038BD00BFB00800106B\r
+:10ACD00070B50546314E0C46306818B183690BB922\r
+:10ACE000FBF742FE2E4B9C4202D133685C680AE0BF\r
+:10ACF0002C4B9C4202D133689C6804E02A4B9C4256\r
+:10AD000004BF3368DC68A38913F0080F1CD113F06B\r
+:10AD1000100F3ED013F0040F12D0616B41B104F15B\r
+:10AD20004403994202D02846FBF72AFF00236363BD\r
+:10AD3000A38923F02403A381002363602369236094\r
+:10AD4000A38943F00803A38123694BB9A38903F4C2\r
+:10AD50002073B3F5007F03D028462146FCF7CAF9DB\r
+:10AD6000A38913F0010205D00023A36063695B424D\r
+:10AD7000A36105E013F0020F14BF13466369A360DB\r
+:10AD800023694BB9A08910F0800018BF4FF0FF3045\r
+:10AD900070BD4FF0FF3070BD002070BD90020010FC\r
+:10ADA000980A0100B80A0100D80A01002DE9F84309\r
+:10ADB00099462C4B04460D461646D3F80080D8F829\r
+:10ADC00048701FB908F14C07C8F848707B681F2B02\r
+:10ADD0000FDD254B002B3DD08C20FCF7F9F9074601\r
+:10ADE000002837D000234360D8F848300360C8F803\r
+:10ADF000480034B3D7F8880068B91B4B53B34FF4FD\r
+:10AE00008470FCF7E5F948B30023C0F80031C0F8BE\r
+:10AE10000431C7F888007B680122D0F800119A40FD\r
+:10AE200040F823602033022C41EA020140F82390CD\r
+:10AE3000C0F8001105D1D0F8043143EA0202C0F88D\r
+:10AE400004217B6800209A1C01337B6047F8225064\r
+:10AE5000BDE8F8834FF0FF30BDE8F8834FF0FF30D6\r
+:10AE6000BDE8F883FC0A0100D17100001FB504465B\r
+:10AE700008480068C06812B9074D2A4600E0074D2F\r
+:10AE8000009102921A4606492346019500F0B8FE49\r
+:10AE9000FBF7E4FB9002001081FD00009C0B010019\r
+:10AEA000A90B010008B513460022FFF7DFFF0000E1\r
+:10AEB00038B50546064C084600232360F5F778FAB6\r
+:10AEC000B0F1FF3F02D1236803B12B6038BD00BF52\r
+:10AED000B00800102DE9F74F04460B698946026956\r
+:10AEE0009A42C0F286805D1E033301F1140800F11E\r
+:10AEF00014079B00CA18C31802F1040A5168586865\r
+:10AF0000013103F06DFD064600283CD00023394690\r
+:10AF100042461846019452F804EB0C6852451FFA59\r
+:10AF20008EFC4FEA1E4E1FFA84FB0CFB063C584475\r
+:10AF30000EFB06FE0EEB1C4E1FFA8CFCCCEB000C3D\r
+:10AF40004FEA1E431FFA8EFECEEB144E0EEB2C4E34\r
+:10AF50001FFA8CFC4FEA2E404CEA0E4E41F804EBEF\r
+:10AF6000D9D9019C2B1D04EB83035A685AB90433C9\r
+:10AF700000E0013D1A1F974204D253F8041C134607\r
+:10AF80000029F6D025612046494601F019F900282C\r
+:10AF90002DDB01363B460022414651F8048B1868F0\r
+:10AFA0001FFA88FC4FEA18481FFA80F9C8EB1040D6\r
+:10AFB000CCEB090C944400EB2C401FFA8CFC0214DF\r
+:10AFC00051454CEA004043F8040BE6D92B1D04EB35\r
+:10AFD00083035A685AB9043300E0013D1A1F9742AF\r
+:10AFE00004D253F8041C13460029F6D025613046DC\r
+:10AFF00000E00020BDE8FE8F2DE9F04F05469BB034\r
+:10B0000010466E6A1946279CCDE904013EB910200E\r
+:10B01000FCF7DEF86862466086600660C6606B6AB0\r
+:10B02000196859B15B68012228464B6012FA03F394\r
+:10B030008B6000F0A7FE6B6A00221A60059B002B54\r
+:10B0400005DA012223F000432260059301E000238A\r
+:10B050002360059C9A4B9A4A04EA030393421DD14C\r
+:10B06000269942F20F73049A0B604AB924F07F4488\r
+:10B07000944B954824F47004002C18BF184600E047\r
+:10B080009048289B002B00F0B385C278C31C0AB1FE\r
+:10B0900000F1080328990B6000F0AABDDDE904ABBC\r
+:10B0A0000022002301265046594603F085FF00B1D7\r
+:10B0B000002616F0FF0F0BD1269A01231360289B60\r
+:10B0C000002B00F0928581481860013800F090BD97\r
+:10B0D00018AB28460093524619AB01935B46260DE8\r
+:10B0E00001F060F97605760D81466EB12BF07F4355\r
+:10B0F000A6F57E7623F47003504643F07E51073E5A\r
+:10B1000041F4E00100221EE0189B1998C01800F5D8\r
+:10B110008660861C202E08DD049B1E3833FA00F062\r
+:10B12000C6F140039C40204305E0DDF810E0C6F185\r
+:10B1300020000EFA00F0FAF7BDFCA6F58666033E85\r
+:10B140000122A1F1F87116920022614BFAF774FB0B\r
+:10B1500055A3D3E90023FAF723FD55A3D3E9002330\r
+:10B16000FAF76CFB824630468B46FAF7B3FC52A3E3\r
+:10B17000D3E90023FAF714FD02460B465046594620\r
+:10B18000FAF75CFB82468B46FAF71CFF5946002211\r
+:10B1900000230446504603F019FF50B12046FAF749\r
+:10B1A00099FC02460B465046594603F005FF00B98C\r
+:10B1B000013C162C0DD8474B03EBC403D3E9000127\r
+:10B1C000DDE9042303F020FF30B10023013C11939B\r
+:10B1D00004E00120119001E000211191199B03F17D\r
+:10B1E000FF3BBBEB060B04D50022CBF1000B069214\r
+:10B1F00003E0CDF818B04FF0000B002C06DB069BE7\r
+:10B200004FF000080F941B19069305E0C4EB0B0BDD\r
+:10B21000C4F1000800200F902499092913D80529AA\r
+:10B2200003DD04390027249100E00127249A931EAE\r
+:10B23000032B0BD8DFE803F0151E050201200E904A\r
+:10B240001AE001210EE001270022249201234FF091\r
+:10B25000FF3E0E930020CDF830E0F24611332590EA\r
+:10B260001AE00021259A0E91002A0DDD0C929246DB\r
+:10B27000134611E000230E93259820180C90431CD0\r
+:10B28000002B07DD9A4607E001210C918A460B4608\r
+:10B29000259101E09A4601236E6A00227260043211\r
+:10B2A0001EE000BFAFF3008061436F63A787D23F0A\r
+:10B2B000B3C8608B288AC63FFB799F501344D33FA5\r
+:10B2C0000000F07FE20C0100D90C0100430B0100EB\r
+:10B2D0000000F83FF80C0100716852000131716004\r
+:10B2E00002F114019942F7D92846716800F019FD5E\r
+:10B2F0006B6ABAF10E0F30601B680D9300F2AC81DF\r
+:10B30000002F00F0A981DDE90423002CCDE91223F0\r
+:10B310003FDD04F00F02924B271103EBC20317F03D\r
+:10B32000100FD3E90001CDE90A010ED08D4B07F0D3\r
+:10B330000F07DDE912010326D3E90823FAF75AFDC6\r
+:10B3400002460B46CDE9042300E00226DFF814C2D2\r
+:10B35000CDF820B0C346DDE90A01A046644609E005\r
+:10B3600017F0010F04D0D4E900230136FAF718FCD6\r
+:10B370007F100834002FF3D1CDE90A014446DDE9FE\r
+:10B380000401D846DDE90A23DDF820B0FAF732FDE2\r
+:10B3900026E067424FB307F00F02714BDDE912015F\r
+:10B3A0003F1103EBC2030226D3E90023FAF7F8FBAF\r
+:10B3B000DFF8B0C1CDF810B0C346A046644609E03E\r
+:10B3C00017F0010F04D0D4E900230136FAF7E8FBA7\r
+:10B3D0007F100834002FF3D14446D846DDF810B072\r
+:10B3E00002460B46CDE9042300E00226119BF3B18F\r
+:10B3F000DDE9040100225C4BCDE9080103F0E6FD24\r
+:10B40000A8B1BAF1000F12D00C99002940F32081A5\r
+:10B41000621E564B0A920022DDE908010136FAF756\r
+:10B42000BFFB0C9F02460B46CDE9042301E05746C3\r
+:10B430000A943046FAF74EFBDDE90423FAF7B0FB35\r
+:10B4400000224B4BFAF7FAF90B460246CDE90823E6\r
+:10B45000099BA3F150760996EFB9DDE904010022BA\r
+:10B46000444BFAF7E9F9DDF820E033467246CDE9BE\r
+:10B47000040103F0C9FD002840F09682DDF820E0C9\r
+:10B4800006F10043DDE90401724603F09FFD002848\r
+:10B4900040F07E82DCE00E987A1E314B00286DD0A1\r
+:10B4A00003EBC20300203449D3E90023FAF7A2FCDE\r
+:10B4B000DDE90823FAF7C0F9DDE90423CDF854B03B\r
+:10B4C000D346CDF85C80A246A84614461D464FF0F0\r
+:10B4D000000ECDF810E0CDE908010D991091294634\r
+:10B4E0002046FAF76FFD0646FAF7F4FA30360246C0\r
+:10B4F0000B4620462946FAF79FF9109A02F8016B8D\r
+:10B5000016461092DDE9082304460D4603F05EFD61\r
+:10B51000002840F05B8322462B4600201249FAF7B0\r
+:10B520008BF9DDE9082303F051FD002840F002818A\r
+:10B53000049B01330493BB4280F28380DDE9080160\r
+:10B5400000220A4BFAF72CFB0022084BCDE9080138\r
+:10B5500020462946FAF724FB04460D46BFE700BF04\r
+:10B56000F80C0100C00D01000000F03F0000244075\r
+:10B5700000001C40000014400000E03F03EBC20349\r
+:10B58000D3E90001DDE90823FAF70AFBDDE904232A\r
+:10B590000E9ECDF840B0D346CDF85480A246A846C2\r
+:10B5A00014461D46CDE9080129462046FAF70AFD52\r
+:10B5B0000390FAF78FFA02460B4620462946FAF71F\r
+:10B5C0003BF9DDF834E0DDF80CC00CF1300CCDE9CE\r
+:10B5D00004010EF806C00136BE422BD10022814B79\r
+:10B5E000DDE908017644FAF729F954464546DA467A\r
+:10B5F000DDF85480DDF840B002460B46DDE9040179\r
+:10B6000003F002FD002840F09680DDE908230020C9\r
+:10B610007449FAF711F902460B46DDE9040103F01B\r
+:10B62000D5FCA8B1334613F8012C1E46013B302A45\r
+:10B63000F9D0CCE200226C4BFAF7B2FA04460D4680\r
+:10B64000B2E754464546DA46DDF85C80DDF854B092\r
+:10B65000DDE91223CDE90423189A002AC0F28A807A\r
+:10B660000E2C00F38780614B03EBC403D3E9000188\r
+:10B67000CDE906012599002914DABAF1000F11DC91\r
+:10B6800040F0888100225A4BDDE90601FAF788FA7A\r
+:10B69000DDE9042303F0AEFC002840F07F81D046B2\r
+:10B6A000574683E1DDE90423DDF834809B460494AA\r
+:10B6B000C244CDF830A09246DDE9062350465946F3\r
+:10B6C0004646FAF797FBFAF77DFC0746FAF702FAC7\r
+:10B6D000DDE90623FAF764FA02460B46504659465E\r
+:10B6E000FAF7AAF807F1300306F8013BB0460C9AC6\r
+:10B6F00096422DD102460B46FAF7A0F8DDE9062363\r
+:10B70000049C82468B4603F07FFCA8B950465946FC\r
+:10B71000DDE9062303F050FC002800F0598217F001\r
+:10B72000010F09D154E20D98824206D13022013432\r
+:10B73000027009E045460A9C324612F8011C531E6D\r
+:10B7400016461A463929EED01A7801321A703FE2AD\r
+:10B750000022254BFAF724FA002200230124824616\r
+:10B760008B4603F029FC00B1002414F0FF0FA3D195\r
+:10B77000049C2DE20E9900293CD0249B012B0BDC6C\r
+:10B78000169818B102F58662033202E0199AC2F1E6\r
+:10B79000360243465E4616E00AF1FF33984502DB67\r
+:10B7A000C3EB080306E00F99C8EB03039844C918DC\r
+:10B7B00000230F91BAF1000F03DACAEB0B06002247\r
+:10B7C00001E05E465246DDF818E02846012102936A\r
+:10B7D00096449344CDF818E000F0B9FB029B07466D\r
+:10B7E0000BE000BF0000E03F00002440F80C010027\r
+:10B7F000000014400E9F43465E465EB10698002846\r
+:10B8000008DD0246B242A8BF3246C2EB0B0BB61AA5\r
+:10B81000801A0690B8F1000F24DD0E99E1B1002BDB\r
+:10B8200014DD1A4639462846029300F02BFC4A469E\r
+:10B8300007462846394600F093FB4946024628460B\r
+:10B84000039200F09FFA039A029B9146B8EB030221\r
+:10B8500008D02846494602E028464946424600F0BC\r
+:10B8600011FC81460121284600F071FB0F9A002A45\r
+:10B87000804604DD4146284600F004FC8046249BB7\r
+:10B88000012B13DC049898B9059A22F07F4323F426\r
+:10B89000700383B98C4B02EA03037BB10699012242\r
+:10B8A0000BF1010B0A920131069108E0002305E03B\r
+:10B8B00000200A9003E004990A9100E00A930F9A8D\r
+:10B8C0004AB1D8F8103008EB8303186900F0EDFA9C\r
+:10B8D000C0F1200300E00123DDF818E0734413F009\r
+:10B8E0001F030BD0C3F12003042B06DD043B9E4451\r
+:10B8F0009B44F618CDF818E006E005D01C330698F6\r
+:10B900009B44F618C0180690BBF1000F05DD4946B0\r
+:10B9100028465A4600F008FC81460699002905DDB4\r
+:10B9200041462846069A00F0FFFB8046119AC2B1B4\r
+:10B930004846414600F044FC002812DA49460023FC\r
+:10B9400028460A2200F035FA0E9B013C814633B1AD\r
+:10B95000394628460A22002300F02BFA0746DDF874\r
+:10B9600030A0BAF1000F29DC2498022826DDBAF1B4\r
+:10B97000000F15D1414605225346284600F019FA1A\r
+:10B9800080464846414600F01BFC00280EDC07E0DC\r
+:10B99000B84605E04FF00008474601E0D04657465C\r
+:10B9A00025990D9ECC4306E00A9CB8460D9E0134B5\r
+:10B9B000312306F8013B4FF0000AF4E00E9A002A0A\r
+:10B9C00000F0AA80002E05DD39462846324600F0F8\r
+:10B9D000ABFB07460A9B93B17968284600F0A1F9B2\r
+:10B9E0003A6907F10C010232920006460C30FBF76F\r
+:10B9F0001FFE28463146012200F096FB00E0384643\r
+:10BA00000D9E0694B244CDF838A0BA46074641468A\r
+:10BA10004846FFF75FFA514600F1300B484600F008\r
+:10BA2000CFFB3A4641460C90284600F0E6FBC26840\r
+:10BA300003463AB919464846029300F0C1FB029BFF\r
+:10BA4000044600E001242846194600F09BF96CB931\r
+:10BA5000249858B9049901F001033BB9BBF1390F9F\r
+:10BA6000069C27D00C9A002A29DC2AE00C9B002B8C\r
+:10BA700006DB19D12498B8B9049901F001039BB9E8\r
+:10BA80002246069C002A1CDD49460122284600F079\r
+:10BA90004BFB4146814600F093FB002807DC10D1A8\r
+:10BAA0001BF0010F0DD002E0002C0FDD069CBBF156\r
+:10BAB000390F04D13346392203F8012B65E00BF12D\r
+:10BAC000010B06F801BB6EE00000F07F06F801BB39\r
+:10BAD00033460E9A96423ED049460A220023284613\r
+:10BAE00000F067F9BA45814607D1514628460A2237\r
+:10BAF000002300F05EF982460CE051460A22002342\r
+:10BB0000284600F056F939460A2200238246284684\r
+:10BB100000F04FF907467AE74FF0010C0D9ECB4637\r
+:10BB2000A146644658464146FFF7D4F930305445A3\r
+:10BB300006F8010B334608DA594628460A22002344\r
+:10BB400000F037F901348346ECE74C464FF0000A29\r
+:10BB5000D946834600E0069C4946012228460293C6\r
+:10BB600000F0E2FA4146814600F02AFB029B0028E1\r
+:10BB70000BDC13D11BF0010F07D10FE00D988342AE\r
+:10BB800003D13123013403700DE013F8012C1E465C\r
+:10BB9000013B392AF2D001321A7004E01E4613F834\r
+:10BBA000012D302AFAD02846414600F0EBF87FB14B\r
+:10BBB000BAF1000F05D0BA4503D02846514600F02F\r
+:10BBC000E1F82846394600F0DDF801E045460A9CD8\r
+:10BBD0004946284600F0D6F80023337001342699F0\r
+:10BBE000289A0C601AB1166001E0034800E00D9835\r
+:10BBF0001BB0BDE8F08F00BF420B0100AFF3008027\r
+:10BC00000EB403B503AB0146054853F8042B006896\r
+:10BC1000019301F067FEBDE80C4003B0704700BF20\r
+:10BC20009002001038B50546064C084600232360F4\r
+:10BC3000F4F7C0FBB0F1FF3F02D1236803B12B60E2\r
+:10BC400038BD00BFB0080010FF2806D8044B1B68A1\r
+:10BC50001818407800F0080070470020704700BFB7\r
+:10BC6000A406001000487047E0060010014B186859\r
+:10BC7000704700BF0007001000487047A80600107A\r
+:10BC800038B50546074C00202060084611461A4684\r
+:10BC9000F4F796FBB0F1FF3F02D1236803B12B60AC\r
+:10BCA00038BD00BFB00800102DE9F7431F46044619\r
+:10BCB00088460A9D91460F4B4AB91E68FFF7D2FF8E\r
+:10BCC000019549460C4A01230090204608E01E6871\r
+:10BCD000FFF7C8FF41464A463B4601950090204683\r
+:10BCE000B047B0F1FF3F03D100232B608A332360BC\r
+:10BCF000BDE8FE830407001081FD000082B009B991\r
+:10BD00000DF106013AB143B113780B801078003879\r
+:10BD100018BF012003E0104601E06FF0010002B0FF\r
+:10BD2000704770B50446466A0D463EB91020FBF7D1\r
+:10BD30004FFA6062466086600660C660666AF368B5\r
+:10BD400043B920460421212202F056FA636AF060CA\r
+:10BD5000D868B0B1636ADB6853F8250018B102688F\r
+:10BD600043F825200AE00121204611FA05F6721D4C\r
+:10BD7000920002F041FA20B1456086600023036121\r
+:10BD8000C36070BD70B50446456A0E463DB91020CB\r
+:10BD9000FBF71EFA6062456085600560C5603EB1D4\r
+:10BDA000636A7268DB6853F82210316043F82260DE\r
+:10BDB00070BD2DE9F0410C461F460E690546143151\r
+:10BDC0000023D1F800C00133B3421FFA8CF04FEAD0\r
+:10BDD0001C4C00FB02700CFB02FC0CEB104C80B204\r
+:10BDE0004FEA1C474FEA0C4C604441F8040BE8DB77\r
+:10BDF000D7B1A3689E4212DB616828460131FFF784\r
+:10BE000090FF226904F10C010232920080460C304E\r
+:10BE1000FBF70EFC214628464446FFF7B3FF04EB30\r
+:10BE20008603013626615F612046BDE8F0812DE979\r
+:10BE3000F84306460D4603F10800092198461746C7\r
+:10BE400002F00AFF0123002101E05B00013198426A\r
+:10BE5000FBDC3046FFF765FF089B43610123092F98\r
+:10BE60000146036110DD05F1090909242B5D0A2251\r
+:10BE700030460134303BFFF79CFFBC420146F5D110\r
+:10BE800009EB0405083D0BE00A35092408E015F824\r
+:10BE9000013B30460A220134303BFFF78AFF01465E\r
+:10BEA0004445F4DB0846BDE8F883020C034612045F\r
+:10BEB00012B90304102000E0002013F07F4F01D1DD\r
+:10BEC00008301B0213F0704F01D104301B0113F036\r
+:10BED000404F01D102309B00002B05DB13F0804F57\r
+:10BEE00001D001307047202070470368024613F0EC\r
+:10BEF00007000DD013F0010F25D113F0020F03D06E\r
+:10BF00005B080120136070479B0802201360704794\r
+:10BF100099B209B91B0C102013F0FF0F01D10830A2\r
+:10BF20001B0A13F00F0F01D104301B0913F0030F8C\r
+:10BF300001D102309B0813F0010F02D15B0804D03D\r
+:10BF4000013013607047002070472020704710B503\r
+:10BF50000C460121FFF7E5FE01224461026110BD9C\r
+:10BF60002DE9F04F16460A690D46336985B09A42AD\r
+:10BF7000BCBF35460E46D5F810803769AB68696896\r
+:10BF800007EB08049C42C8BF0131FFF7CAFE00F16D\r
+:10BF9000140300EB8402143201921A4602E00021DD\r
+:10BFA00042F8041B01998A42F9D305F1140B06EB00\r
+:10BFB000870705EB8805143714350397029506F1BA\r
+:10BFC00014024EE052F8047BBFB217B35E46194626\r
+:10BFD000002556F804CBD1F800A01FFA8CF94FEADF\r
+:10BFE0001C4C1FFA8AF84FEA1A4A07FB0988DDF849\r
+:10BFF000089007FB0CACB145A8440CEB184C1FFA99\r
+:10C0000088F848EA0C484FEA1C4541F8048BE0D810\r
+:10C010000D6032F8027C1FB31D685E4698461946D3\r
+:10C020004FF0000CB6F800A0ADB2B1F8029007FBDB\r
+:10C030000A99CC4445EA0C4541F8045B56F8049B48\r
+:10C0400058F8045F4FEA1949ADB207FB0955DDF80E\r
+:10C050000890B14505EB1C454FEA154CE2D80D6040\r
+:10C060000433DDF80CC09445ACD8019B00E0013CE2\r
+:10C07000002C03DD53F8042D002AF8D0046105B02C\r
+:10C08000BDE8F08F12F003032DE9F04104460F469E\r
+:10C09000154607D0234A013B52F823200023FFF71F\r
+:10C0A00088FE0746AD1039D0666A3EB91020FBF70E\r
+:10C0B0008FF86062466086600660C660D4F82480AF\r
+:10C0C000D8F8086066B9204640F27121FFF73FFFBB\r
+:10C0D0000023C8F808000646036001E04046064613\r
+:10C0E00015F0010F0AD0394632462046FFF738FFD7\r
+:10C0F000394680462046FFF745FE47466D100DD075\r
+:10C10000D6F80080B8F1000FE8D12046314632461B\r
+:10C11000FFF726FF3060C0F80080E0E73846BDE852\r
+:10C12000F08100BFEC0C01002DE9F8430C464FEA0A\r
+:10C13000621905462669904649680136A3684E444F\r
+:10C1400001E001315B009E42FBDC2846FFF7E9FD80\r
+:10C150000022074600F1140303E00132002143F8F6\r
+:10C16000041B4A45F9DB206904F1140104EB80004B\r
+:10C17000143018F01F0814D0C8F1200E0022D1F896\r
+:10C1800000C00CFA08FC42EA0C0243F8042B51F8F8\r
+:10C19000042B884222FA0EF2F1D81A603AB1013625\r
+:10C1A00005E051F8042B884243F8042BF9D82846BF\r
+:10C1B000013E21463E61FFF7E5FD3846BDE8F883C4\r
+:10C1C00003460A69006930B5801A15D1043203F1BB\r
+:10C1D000140492009B188A180433043253F8045D47\r
+:10C1E00052F8041D8D4203D005D24FF0FF3030BD10\r
+:10C1F0009C42F3D330BD012030BD2DE9F047054608\r
+:10C200000C46084611461646FFF7DAFF071E08D10E\r
+:10C2100028463946FFF785FD012347610361BDE8E4\r
+:10C22000F08701DB002703E02346012734461E4642\r
+:10C2300061682846FFF775FD3269236906EB8208BD\r
+:10C24000143604EB830C08F114080CF1140C1434AC\r
+:10C250000022C76000F1140754F8045B56F8041B71\r
+:10C260001FFA85FA1FFA81F9090CC9EB0A09C1EB1B\r
+:10C2700015419144254601EB29411FFA89F90A1419\r
+:10C28000B04549EA014147F8041B3946E4D80CE0BF\r
+:10C2900055F8044BA6B2240C961904EB2644B6B20A\r
+:10C2A000221446EA044441F8044B6545F0D300E00B\r
+:10C2B000013B51F8042D002AFAD00361BDE8F08754\r
+:10C2C0000E4B01EA0303A3F15073002B01DD194665\r
+:10C2D00007E05B421B15132B05DC4FF4002252FADA\r
+:10C2E00003F100207047A3F11402002101231E2A4C\r
+:10C2F000DCBFC2F11F029340184670470000F07F78\r
+:10C3000003692DE9F041043300F11406884650F822\r
+:10C31000235000EB830427462846FFF7C6FD0A2872\r
+:10C32000C0F12003C8F8003013DCC0F10B0135FA6E\r
+:10C3300001F7B44247F07E538CBF54F8044C0024FC\r
+:10C34000153043F4E003854034FA01F141EA050277\r
+:10C3500024E0B44203D9043C57F8041C00E0002157\r
+:10C360000B3816D08540B442C0F1200745F07E5509\r
+:10C370008CBF54F8044C002421FA07FC45F4E00576\r
+:10C3800011FA00F045EA0C0334FA07F747EA000215\r
+:10C3900004E045F07E530A4643F4E0031046194694\r
+:10C3A000BDE8F0812DE9F74301211D460A9F0B9E50\r
+:10C3B0001446FFF7B6FC25F0004925F07F4323F42F\r
+:10C3C00070035FEA195900931CBF43F48013009374\r
+:10C3D0008046F4B102A840F8044DFFF786FD019BAA\r
+:10C3E00058B1009AC0F1200112FA01F1C24041EAAD\r
+:10C3F00003030092C8F8143001E0C8F81430009C20\r
+:10C40000C8F81840002C0CBF01240224C8F81040C2\r
+:10C4100009E068460124FFF768FD009BC8F810405A\r
+:10C42000C8F814302030B9F1000F0AD0A9F5866998\r
+:10C43000A9F1030909EB0003C0F135003B6030604E\r
+:10C440000BE008EB8403A0F58660023838601869B9\r
+:10C450006401FFF72AFD241A34604046BDE8FE83DC\r
+:10C46000F7B50E4601A90746FFF74AFF04460D46F9\r
+:10C4700030466946FFF744FF3F6902460B46019884\r
+:10C480000099411A3069381A40010918002902DD63\r
+:10C4900009054D1901E009055B1A20462946F9F7FF\r
+:10C4A000A9FC03B0F0BD4B1E116910B55B1101333F\r
+:10C4B00002EB81011431143200EB830303E052F8E4\r
+:10C4C000044B40F8044B9142F9D802E0002240F8B6\r
+:10C4D000042B9842FAD310BD02694B1130B5934238\r
+:10C4E00000F114040DDC0DDA11F01F010AD000EB8D\r
+:10C4F0008302526932FA01F515FA01F191420CD129\r
+:10C5000000E0134600EB8303143302E053F8042DDC\r
+:10C510002AB99C42FAD3002030BD012030BD012051\r
+:10C5200030BD000038B50546074C002020600846A5\r
+:10C5300011461A46F3F7D4FFB0F1FF3F02D123684A\r
+:10C5400003B12B6038BD00BFB00800100B4613B11B\r
+:10C55000B1F1004F00D1E0B1124AA1F5801393422E\r
+:10C5600019D901F1FE4303F57003934213D90E4B21\r
+:10C57000994212D901F100429A420ED90B4B9942CD\r
+:10C5800002D011F5801F0AD1D0F1010038BF002080\r
+:10C590007047022070470420704703207047002036\r
+:10C5A000704700BFFFFFDF7FFFFF0F000000F07F3D\r
+:10C5B00003460846F0B510F8012B5E2A03D14A78ED\r
+:10C5C0000130012400E0002400215C540131B1F568\r
+:10C5D000807FFAD10AB90138F0BDC4F1010701E04A\r
+:10C5E0000A4620463E469F54044614F8011B2D2956\r
+:10C5F00003D05D290CD061B1F2E745785D2DEFD015\r
+:10C600009542EDDB02300132AA429E54FBDBEBE7A0\r
+:10C610002046F0BD004870470000C07F30B502687A\r
+:10C6200008E053782246402B02DD5A2BD8BF203336\r
+:10C63000AB4207D111F8015B541C002DF1D104600D\r
+:10C64000012030BD002030BD2DE9F04F064699B0E5\r
+:10C650008B46002400250F921591159A13780D2B07\r
+:10C6600005D8092B14D2002B00F0C78113E02B2B27\r
+:10C6700007D02D2B02D0202B0DD109E001200B90EB\r
+:10C6800001E000210B91531C159353782BB9B4E1B1\r
+:10C6900001321592E1E700220B92159B1A78302A9D\r
+:10C6A0005CD103F1010A5B78582B01D0782B49D17A\r
+:10C6B00014AB00930B9B3046984F15A901933A4653\r
+:10C6C00013AB01F07FFE10F00709804600F0808573\r
+:10C6D000B9F1060F03D1CDF854A000F079BD149A3A\r
+:10C6E0003AB111A83968FFF7DEFE30461499FFF71A\r
+:10C6F00049FB139BB9F1060F1CD8DFE809F0040AC7\r
+:10C700000714170A040000252C4613E0119C129D03\r
+:10C7100010E003F58663129A0333119C22F4801211\r
+:10C7200042EA035506E07E4D002403E06FF0004529\r
+:10C730004FF0FF3418F0080F00F04A8545F000452F\r
+:10C7400000F046BD159B5A1C15925B78302BF9D032\r
+:10C75000002B00F03D850121089101E000220892A4\r
+:10C76000159B4FF0000AD146CDF818A00993534607\r
+:10C7700014E0B9F1080F05DCA8F130080A2202FB29\r
+:10C78000038307E0B9F10F0F04DCA8F130080A2297\r
+:10C7900002FB0A8A09F1010901371597159F97F8DD\r
+:10C7A0000080B8F12F0F02DDB8F1390FE1DD30461E\r
+:10C7B0000693FFF761FA016830460391FFF75CFAD0\r
+:10C7C0000068FBF7EBF9039902463846FBF7EEF9F0\r
+:10C7D000034600285ED13046159F0393FFF74CFABD\r
+:10C7E0000068FBF7DBF9039B3A18159217F80080F5\r
+:10C7F000B9F1000F45D1484605E0159B01305A1CA0\r
+:10C80000159293F80180B8F1300FF6D0A8F13103FA\r
+:10C81000082B44D81599034600200746099101309A\r
+:10C82000B8F1300827D01B180122DDF818C00DE040\r
+:10C830000F460139082903DC0A2101FB0CFC04E046\r
+:10C84000102F02DC0A2101FB0AFA0132824207F1B1\r
+:10C850000101EDDB3A46CDF818C0082A0F4604DC8A\r
+:10C860000A2202FB0C80069004E0102902DC0A2256\r
+:10C8700002FB0A8A0020159A511C159192F801803A\r
+:10C8800001E04F461846A8F13002092AC7D9012114\r
+:10C89000049108E000204F460346049003E000277F\r
+:10C8A00001223B460492B8F1650F02D0B8F1450F62\r
+:10C8B0005BD127B918B90899002900F09E80DDF8EE\r
+:10C8C00054B00BF1010215929BF80180B8F12B0FC7\r
+:10C8D00003D0B8F12D0F02D104E0002103E00022C3\r
+:10C8E000079205E001210791511C159192F80180F2\r
+:10C8F000A8F13002092A36D804E0159A511C159186\r
+:10C9000092F80180B8F1300FF7D0A8F13102082A6F\r
+:10C910002BD8159AA8F130010A9208E01C070010E4\r
+:10C920000000F07FA8F130080A2202FB0181159A6D\r
+:10C9300002F1010CCDF854C092F80180B8F12F0F2C\r
+:10C9400002DDB8F1390FEDDD0A9AC2EB0C0C44F6AA\r
+:10C950001F62BCF1080F02DC9142B8BF0A4607997A\r
+:10C9600021B1524202E0CDF854B00022002F49D14B\r
+:10C97000002840F02D84089A002A40F02984049B66\r
+:10C98000002B3AD1B8F14E0F1DD003DCB8F1490F9E\r
+:10C9900033D106E0B8F1690F03D0B8F16E0F2CD196\r
+:10C9A00011E015A8A249FFF739FE30B3159B15A871\r
+:10C9B000A049013B1593FFF731FE10B9159B0133D8\r
+:10C9C00015939D4D17E015A89C49FFF727FEA0B1D0\r
+:10C9D000159B1B78282B0DD115A8994911AA01F098\r
+:10C9E0003BFF052806D1129B119C43F0FE4545F400\r
+:10C9F0007005EDE3934D0024EAE30020CDF854B038\r
+:10CA00000B90E5E30698D31AB9F1000F08BFB946B9\r
+:10CA10000793CDF81090F9F74DF8102FB4BFBB462F\r
+:10CA20004FF0100BBBF1090F04460D4615DDABF1BD\r
+:10CA30000902854B03EBC203D3E90023F9F7B0F8F1\r
+:10CA4000044650460D46F9F735F802460B46204697\r
+:10CA50002946F8F7F3FE04460D460F2F39DC0799F7\r
+:10CA6000002900F0B58325DD162907DC764B224628\r
+:10CA700003EBC103D3E900012B4616E0C7F10F0811\r
+:10CA8000079A08F116039A4223DC6F4E224606EB02\r
+:10CA9000C803D3E900012B46F9F782F8079BC8EBDE\r
+:10CAA000030806EBC806D6E90023F9F779F804462F\r
+:10CAB0000D468DE3079810F1160F0ADB4242624BD8\r
+:10CAC0002046294603EBC203D3E90023F9F792F984\r
+:10CAD000EDE70799CBEB070B8B44BBF1000F5CDD57\r
+:10CAE0001BF00F030AD0584A02EBC3032246D3E9D6\r
+:10CAF00000012B46F9F754F804460D463BF00F0BA6\r
+:10CB000000F0D880BBF59A7F11DD4FF00008CDF81A\r
+:10CB10002080C146CDF8188000E0B846089A22234C\r
+:10CB2000454D00243360002A40F03E8350E32946FF\r
+:10CB3000464D4FEA2B1B20464FF00008A9460BE05C\r
+:10CB40001BF0010F03D0D5E90023F9F729F808F10C\r
+:10CB500001084FEA6B0B0835BBF1010FF0DC09EB64\r
+:10CB6000C8030446A1F154752246D3E900012B46BF\r
+:10CB7000F9F716F8304B0D4601EA03033449044631\r
+:10CB80008B42C2D833494FF0000B8B428ABF4FF023\r
+:10CB9000FF3405F15475304D8CE000F08B80CBF103\r
+:10CBA000000B1BF00F030AD0274A2046294602EB50\r
+:10CBB000C303D3E90023F9F71DF904460D465FEAE4\r
+:10CBC0002B1876D0B8F11F0F61DC18F0100B20463F\r
+:10CBD00018BF4FF06A0B2946204C09E018F0010FEE\r
+:10CBE00003D0D4E90023F8F7DBFF4FEA68080834E4\r
+:10CBF000B8F1000FF2DC04460D46BBF1000F35D052\r
+:10CC00000D4A01EA0202120DC2F16B02002A2DDD6B\r
+:10CC10001F2A25DD0024342A02DD4FF05C7525E053\r
+:10CC20004FF0FF31203A11FA02F202EA05051DE049\r
+:10CC3000150B0100DC0C01000000F07F7A060100FA\r
+:10CC4000080700100000F8FFF80C0100C00D0100FB\r
+:10CC50000000A07C0000907CFFFFEF7FE80D01004A\r
+:10CC60004FF0FF3313FA02F202EA0004204629468D\r
+:10CC7000002200234FF0010802F09EF908B14FF0A6\r
+:10CC800000085FFA88F8B8F1000F13D101E04FF007\r
+:10CC90000008C146CDF82080CDF8188000E0B846E5\r
+:10CCA00022233360089B00240025002B40F07C8267\r
+:10CCB0008EE2C34606983B460999A246049A009024\r
+:10CCC0003046FFF7B4F8CDF828B0AB460890089A84\r
+:10CCD00030465168FFF725F8089B03F10C011A69EB\r
+:10CCE0000232920006900C30FAF7A2FC17AB5246C3\r
+:10CCF0000093304616AB01935B46CDE904ABFFF7DA\r
+:10CD000051FB012114903046FFF721F98146079825\r
+:10CD1000002802DA4242002401E0079C0022179F0B\r
+:10CD20006FF47F700A99002FACBF02EB0708C7EBC6\r
+:10CD30000403C1EB07071699ACBF234690467D1844\r
+:10CD4000854203DA07F58661033101E0C1F136015E\r
+:10CD50000A9801EB08051F187F18BD42B4BF2B4687\r
+:10CD60003B464345A8BF4346002B03DDED1AFF1A9F\r
+:10CD7000C3EB08088AB149463046FFF783F9149A95\r
+:10CD8000814630464946FFF7EBF814990346304692\r
+:10CD90000393FEF7F7FF039B1493002D05DD304648\r
+:10CDA00014992A46FFF7C0F914902CB13046069921\r
+:10CDB0002246FFF767F90690002F05DD30460699F9\r
+:10CDC0003A46FFF7B1F90690B8F1000F05DD494684\r
+:10CDD00030464246FFF7A8F9814614993046069A34\r
+:10CDE0000025FFF70AFAC1680746C5600991494660\r
+:10CDF000FFF7E6F9A8422BDA099A5D46B846544691\r
+:10CE0000DDF828B0002A40F0B881002C40F0B58150\r
+:10CE100025F07F4323F47003002B40F0AE818D4B4F\r
+:10CE200005EA0303B3F1D66F40F2A7817B691BB912\r
+:10CE30003B69012B40F3A181414601223046FFF7B7\r
+:10CE400073F949468046FFF7BBF9002833DC94E1CB\r
+:10CE500076D1099B5D46B8465446DDF828B023B329\r
+:10CE600025F07F427C4922F470022B468A423AD157\r
+:10CE70005246BBF1000F0DD0764905EA0101B1F130\r
+:10CE8000D46F07D8090D4FF0FF30C1F16B0110FAD4\r
+:10CE900001F101E04FF0FF318A4224D16D4A0024B4\r
+:10CEA00003EA020202F5801567E125F07F4323F4CF\r
+:10CEB0007003C3B9BCB925F000431B0D1B05BBF1C2\r
+:10CEC000000F07D0B3F1D66F04D8B3F15C7F00F246\r
+:10CED0005781E5E6A3F580134FF0FF346FEA135551\r
+:10CEE0006FEA055549E104F00103002B00F045818C\r
+:10CEF000099860B1DDE90401FFF7E2F902460B464B\r
+:10CF0000DDE90401F8F79AFC04460D4635E1DDE958\r
+:10CF100004010127FFF7D4F902460B46DDE90401BD\r
+:10CF2000F8F78AFC0022002304460D4602F044F87C\r
+:10CF300008B109990F4617F0FF0F3FF4B1AE1CE19D\r
+:10CF400038464946FFF78CFA00224FF08043CDE97E\r
+:10CF5000040102F045F8002834D0099A22B13F4973\r
+:10CF60000020CDE9040114E0BAF1000F05D12BF047\r
+:10CF70007F4323F470033BB90DE0BAF1010F03D1F5\r
+:10CF8000BBF1000F3FF48BAE354B00250022CDE9FD\r
+:10CF90000423324C27E0DDE9040100222F4B02F08C\r
+:10CFA00015F840B9DDE9040100222E4BF8F7F8FD31\r
+:10CFB00005460C4601E0099D2A4C04F10043284631\r
+:10CFC00019460EE0DDE904010022264BF8F7E8FDE2\r
+:10CFD0000C460999054611B904F1004100E02146CB\r
+:10CFE0002846CDE90401DFF86C801F4A0BEA0808E7\r
+:10CFF00090453FD15946ABF1547B5046CDE90C01E9\r
+:10D0000050465946FFF75CF902460B46DDE904013C\r
+:10D01000F8F7C6FD0B46024659465046F8F70EFC97\r
+:10D020000C4B8B4601EA0303104982468B420DD913\r
+:10D030000F4B0D98984204D10C99B1F1FF3F3FF48A\r
+:10D040006CADDFF82CB04FF0FF3A85E00BF1547B6C\r
+:10D0500047E000BF0000F07FFFFF0F000000F03F3F\r
+:10D060000000F0BF0000E03F0000E07FFFFF9F7C7A\r
+:10D07000FFFFEF7F0A9A12B3B8F1D46F1FD828468A\r
+:10D0800021465DA3D3E9002301F0AAFF88B1214620\r
+:10D09000284601F0C3FF002808BF0120F8F70AFD69\r
+:10D0A000099B05460C460BB901F100412846CDE924\r
+:10D0B0000401059901F1D663C8EB030305935046BB\r
+:10D0C0005946FFF7FDF802460B46DDE90401F8F783\r
+:10D0D00067FD02460B4650465946F8F7AFFB8246BD\r
+:10D0E0008B460A9B002B37D14B4B0BEA0303984529\r
+:10D0F00032D121462846CDF80CB0F8F763FFF8F797\r
+:10D10000E9FC02460B4628462146F8F795FB099AAA\r
+:10D11000DDF80CC004460D463AB9BAF1000F04D14F\r
+:10D120002CF07F4323F4700383B12046294634A3B7\r
+:10D13000D3E9002301F04AFF002832D120462946D6\r
+:10D1400031A3D3E9002301F05FFF04E030A3D3E96A\r
+:10D15000002301F03BFF20BB30461499FEF712FE7E\r
+:10D1600030460699FEF70EFE30464946FEF70AFEA7\r
+:10D1700030463946FEF706FEA9E5BBF1000F13D095\r
+:10D18000264B00200C90294620460D93DDE90C2308\r
+:10D19000F8F706FD04460D4631B928B9222333605D\r
+:10D1A00002E0B84654465D4630461499FEF7EAFD63\r
+:10D1B00030460699FEF7E6FD30464946FEF7E2FDA9\r
+:10D1C00030460899FEF7DEFD30464146FEF7DAFDAF\r
+:10D1D0000F9909B1159B0B600B9A1AB1224605F104\r
+:10D1E000004301E022462B461046194619B0BDE81F\r
+:10D1F000F08F00BFAFF300800000C0FFFFFFDF41F2\r
+:10D200009535A094FFFFDF3F35E5AF350000E03FE7\r
+:10D210009535A094FFFFCF3F0000F07F000050390C\r
+:10D220002DE9F04F1E46584B89B08846944607902A\r
+:10D23000D3F800900B4613F8014B09EB04021D468E\r
+:10D24000577817F00807F6D12D2C03D115F8014BAC\r
+:10D25000012703E02B2C08BF15F8014B0EB1102E4F\r
+:10D260000FD1302C08D12B78782B01D0582B03D13B\r
+:10D270006C781026023504E01EB9302C14BF0A2643\r
+:10D28000082627B14FF0000A4FF0004B03E04FF0A3\r
+:10D29000FF3A6FF0004B3046F117CDE904015046DC\r
+:10D2A0005946DDE90423CDF80CC001F0D7FE504605\r
+:10D2B00059460692DDE9042301F0D0FEDDF80CC0EA\r
+:10D2C00000220023CDF804C08B468246002109EBE2\r
+:10D2D0000400407810F0040F01D0303C07E010F05B\r
+:10D2E00003002DD0012814BF57203720241AB44240\r
+:10D2F00026DAB1F1FF3F20D092457BEB03011AD330\r
+:10D3000082EA0A0083EA0B0150EA010C02D1069876\r
+:10D3100084420EDCDDF814C0049802FB0CF100FB23\r
+:10D320000311A2FB0023CB18121943EBE473012174\r
+:10D3300003E052465B464FF0FF3115F8014BC6E75C\r
+:10D34000B1F1FF3FDDF804C00CD11FB100224FF056\r
+:10D35000004303E04FF0FF326FF00043079C2220B0\r
+:10D36000206003E017B1524263EB4303BCF1000FAE\r
+:10D3700004D009B105F1FF38CCF8008010461946F9\r
+:10D3800009B0BDE8F08F00BFA40600102DE9F74FEB\r
+:10D3900098463C4B0C4615460190D3F800A00B462E\r
+:10D3A00013F8016B0AEB06021F4692F8019019F080\r
+:10D3B0000809F5D12D2E04D117F8016B4FF00109A2\r
+:10D3C00003E02B2E08BF17F8016BB8F1000F02D055\r
+:10D3D000B8F1100F14D1302E09D13B78782B01D041\r
+:10D3E000582B04D17E784FF01008023708E0B8F1CE\r
+:10D3F000000F05D1302E14BF4FF00A084FF0080877\r
+:10D4000041464FF0FF3001F0EBFA414683464FF0C2\r
+:10D41000FF3001F013FC002318460AEB0602527895\r
+:10D4200012F0040F01D0303E07E012F0030217D0D3\r
+:10D43000012A14BF57223722B61A464510DAB3F133\r
+:10D44000FF3F0AD0584506D801D18E4203DC08FBC5\r
+:10D450000060012301E04FF0FF3317F8016BDCE7B8\r
+:10D46000B3F1FF3F04D10199222218460A6003E07C\r
+:10D47000B9F1000F00D0404215B103B17C1E2C6001\r
+:10D48000BDE8FE8FA40600102DE9F04F1E46524B5A\r
+:10D490008BB0884694460990D3F800900B4613F859\r
+:10D4A000014B09EB04021D46577817F00807F6D127\r
+:10D4B0002D2C03D115F8014B012703E02B2C08BFBD\r
+:10D4C00015F8014B0EB1102E0FD1302C08D12B784E\r
+:10D4D000782B01D0582B03D16C781026023504E04C\r
+:10D4E0001EB9302C14BF0A2608264FEAE67B3246C6\r
+:10D4F0005B464FF0FF304FF0FF31CDF814C001F024\r
+:10D50000ADFD32465B46B24606904FF0FF300791C4\r
+:10D510004FF0FF3101F0A2FDDDF814C0002100231F\r
+:10D52000019700960892002209EB0400407810F061\r
+:10D53000040F01D0303C07E010F003002ED001288A\r
+:10D5400014BF57203720241A0098844226DAB1F1FC\r
+:10D55000FF3F20D0DDE9066796429F4119D3DDE900\r
+:10D56000066782EA060083EA070150EA010702D152\r
+:10D57000089884420BDC02FB0BF10AFB0311A2FBAF\r
+:10D580000A23CB18121943EBE473012103E0DDE910\r
+:10D5900006234FF0FF3115F8014BC5E7B1F1FF3F0E\r
+:10D5A000019F07D1099A222313604FF0FF324FF0F9\r
+:10D5B000FF3303E017B1524263EB4303BCF1000FAA\r
+:10D5C00004D009B105F1FF38CCF8008010461946A7\r
+:10D5D0000BB0BDE8F08F00BFA40600102DE9F74F97\r
+:10D5E000814690680C461546D2F800B018B1002369\r
+:10D5F00001931E4608E0506069E0DBF80030DBF87C\r
+:10D6000004600BF1080B0193002EF6D0A768BE4210\r
+:10D610004AD3A38913F4906F44D022682169C1EBE7\r
+:10D62000020A626902EB42080AF10102921908EB50\r
+:10D63000D8784FEA6808904538BF904613F4806F59\r
+:10D6400010D048464146F9F7D3FD0746A0B12169FD\r
+:10D650005246F9F7EDFFA38923F4906343F080036A\r
+:10D66000A38116E048464246FAF71AF8074680B901\r
+:10D6700048462169F9F784FA0C23C9F80030A389D8\r
+:10D680004FF0FF3043F04003A3810023AB606B6099\r
+:10D690001DE02761574427603746CAEB0803C4F8EA\r
+:10D6A0001480A360BE4200D237463A4620680199F2\r
+:10D6B000F9F7C9FFA368DB1BA3602368DF19AB6818\r
+:10D6C00027609E1BAE60002E97D130466E60BDE88D\r
+:10D6D000FE8FB1F1FF3F38B50C46154634D0938923\r
+:10D6E000CCB223F020039381536B6BB15268AB6BC8\r
+:10D6F0009A4203DB294600F07EF818BB2B685A1EBD\r
+:10D700002A6003F8014C0AE012695AB12B6893426F\r
+:10D7100008D95A1E13F8013CA34203D12A606B6852\r
+:10D7200001330DE06B682B642B68EB6305F1440358\r
+:10D730006B630323AB632B4603F8464F2B60012337\r
+:10D740006B6001E04FF0FF34204638BD10B50C4649\r
+:10D75000496B69B104F14403994201D0F9F710FA19\r
+:10D76000236C00206063636013B1E36B236010BD22\r
+:10D7700023694FF0FF30236000236360A38943F0E7\r
+:10D780002003A38110BD2DE9F84F1E4683461346A2\r
+:10D79000924673430A9C994629D088461D4617E055\r
+:10D7A000216840463A46ED1BF9F742FF2368584688\r
+:10D7B0002146DB19236000236360FFF7C7FF30B108\r
+:10D7C000C5EB0900514601F00BF9064610E0B844DC\r
+:10D7D0006768BD42E4D82A4640462168F9F728FF29\r
+:10D7E00063685B1B636023685D19256000E01E466B\r
+:10D7F0003046BDE8F88F2DE9F0410C46496B04F145\r
+:10D800004403994216D18021F9F7F2FC38B394F819\r
+:10D81000462080236063A36300F17D0380F87F20AE\r
+:10D8200094F8452080F87E2094F8442080F87D20EC\r
+:10D83000236011E0A66B77003A46F9F731FF054601\r
+:10D8400088B100EB0608294640463246F9F7F0FE5B\r
+:10D85000C4F800806563A7630020BDE8F0814FF045\r
+:10D86000FF30BDE8F0814FF0FF30BDE8F0812DE9D9\r
+:10D87000F84F834693680F4614461BB95360184609\r
+:10D88000BDE8F88F4B6E13F4005F23D0D2F800A0F0\r
+:10D8900000251BE00AEB05035AF8059000265B689B\r
+:10D8A0004FEA530809E0584639F8021B3A4600F09F\r
+:10D8B000CFFCB0F1FF3F0FD001364645F3DBA36844\r
+:10D8C00008354FEA4808C8EB0303A360A0680028A6\r
+:10D8D000E0D101E0F9F726FA0023A3606360BDE818\r
+:10D8E000F88F00002DE9F04F0F46E1B015461C46B9\r
+:10D8F000804618B183690BB9F9F736F89C4B9F4203\r
+:10D9000002D1D8F804700AE09A4B9F4202D1D8F8AD\r
+:10D91000087004E0984B9F4208BFD8F80C70BB8990\r
+:10D9200013F4005F06D143F40053BB817B6E23F4F4\r
+:10D9300000537B66BB8913F0080F01D03B6933B9F4\r
+:10D9400040463946FDF7C4F9002840F04B84BA89B7\r
+:10D9500002F01A030A2B36D1FB8913F4004F32D19F\r
+:10D96000ADF8AE3022F002023B6A08A9ADF8AC2057\r
+:10D9700040467A6E3093BB6A41922A462891329390\r
+:10D9800080232C9128A92A932D93803B2E93234604\r
+:10D99000FFF7A8FF0028039009DB404628A9F8F705\r
+:10D9A000EBFE039A002818BF4FF0FF320392BDF838\r
+:10D9B000AC3013F0400F00F01884BB8943F04003F3\r
+:10D9C000BB8100F012BCC346BA46002342AE5E9350\r
+:10D9D0005C965D93019505930393019B1F4613F895\r
+:10D9E000012B0AB1252AF9D1019BFD1A17D033600A\r
+:10D9F0005E9B75605B195E935D9B01335D93072BA6\r
+:10DA000001DC083608E0584651465CAAFFF72FFFB4\r
+:10DA1000002840F0DC8342AE0399491903913B781A\r
+:10DA2000002B00F0CB83002301378DF87F314FF0BE\r
+:10DA3000FF3C01971D4602933A46194605E01C46F5\r
+:10DA400003E01C4602464FF0FF3C12F8013B632BFB\r
+:10DA500000F0B08028DC392B15DC312B80F28E8071\r
+:10DA60002B2B5ED007DC232B4FD02A2B50D0202B22\r
+:10DA700040F02E8243E02E2B56D0302B74D02D2B2D\r
+:10DA800040F026824AE04F2B0192029100F0EF8095\r
+:10DA900003DC442B40F01E8297E0552B00F04481BC\r
+:10DAA000582B40F0178263E16F2B00F0E38012DC0B\r
+:10DAB000692B00F08D8006DC642B00F08980682BD8\r
+:10DAC00040F0068268E06C2B69D06E2B01920291C7\r
+:10DAD00040F00082ABE0732B00F0048106DC702B79\r
+:10DAE00000F0EE80712B40F0F38160E0752B019225\r
+:10DAF000029100F01B81782B40F0EC8135E19DF81C\r
+:10DB00007F31002BA1D120330BE045F001059CE7CC\r
+:10DB10002168231D002992DA49421C4645F004057C\r
+:10DB200093E78DF87F3190E7104610F8013B2A2BE0\r
+:10DB300003D010464FF0000C0EE0D4F800C0231DB7\r
+:10DB4000BCF1000FFFF67DAF1C4602467DE70A23BD\r
+:10DB500003FB0C7C43781046A3F130070132092FF8\r
+:10DB6000F5D94CEAEC7C72E745F080056DE700BF23\r
+:10DB7000980A0100B80A0100D80A010010460021E5\r
+:10DB8000303B0A2202FB013110F8013BA3F13007C0\r
+:10DB90000246092FF4D95AE745F0400555E71378B6\r
+:10DBA0006C2B01D1013202E045F010054DE745F044\r
+:10DBB00020054AE723684FF00009019204340291DE\r
+:10DBC0008DF848318DF87F918DE145F0100501E029\r
+:10DBD0000192029115F0200F07D0073424F00703BB\r
+:10DBE00003F10804D3E9008913E015F0100F04F1E4\r
+:10DBF000040301D0226808E015F0400F226804D029\r
+:10DC00000FFA82F84FEAE87902E090464FEAE279AB\r
+:10DC10001C46B8F1000F79F1000280F2DC802D2360\r
+:10DC2000D8F1000869EB49098DF87F31D3E015F090\r
+:10DC3000200F04F1040106D02068039C2246E3175C\r
+:10DC4000C0E9002305E015F0100F04D02368039A03\r
+:10DC50001A600C46C1E615F0400F226804F1040377\r
+:10DC60000BBF0399039C116014801C46B5E645F078\r
+:10DC7000100501E00192029115F0200208D007344E\r
+:10DC8000002224F0070303F10804D3E900899EE091\r
+:10DC900015F0100104F1040302D0216888460BE05E\r
+:10DCA00015F04002206806D01FFA80F84FF00009F6\r
+:10DCB0001C460A468BE080464FF000091C4686E071\r
+:10DCC00023684FF00009019245F00205A34A9846E7\r
+:10DCD000302302918DF87C310434483305928DF85D\r
+:10DCE0007D3173E04FF0000923460434CC458DF8B4\r
+:10DCF0007F91019202911F6811DB624638464946C6\r
+:10DD0000CDF800C0F9F778FCDDF800C0002800F07D\r
+:10DD1000EE80C7EB0008E04500F3EC80EBE038460E\r
+:10DD2000F9F73CFF8046E6E045F0100515F0200FBE\r
+:10DD300007D0073424F0070303F10804D3E900896E\r
+:10DD400011E015F0100F04F1040301D0226806E081\r
+:10DD500015F0400F226802D01FFA82F800E09046CA\r
+:10DD60004FF000091C46012231E07C49059101E099\r
+:10DD70007B4A059215F0200F07D0073424F00702E4\r
+:10DD800002F10804D2E9008911E015F0100F04F146\r
+:10DD9000040201D0216806E015F0400F216802D08E\r
+:10DDA0001FFA81F800E088464FF00009144615F08C\r
+:10DDB000010F0BD058EA090108D030228DF87D31CF\r
+:10DDC0008DF87C2145F002052E3A00E00222002366\r
+:10DDD0008DF87F3100E00122BCF1000FA8BF25F0D3\r
+:10DDE000800558EA090302D1BCF1000F60D0012A76\r
+:10DDF0001ED0022A47D05BAB03334FEAD80108F0AC\r
+:10DE0000070241EA49704FEAD9018046894630321B\r
+:10DE10001F461A70013B049158EA0901EDD115F033\r
+:10DE2000010F4FD0302A4DD01F4630233B7049E0C0\r
+:10DE3000B8F10A0F79F1000206D25BAF08F13008A1\r
+:10DE400003378DF86F813DE05BAB033304934046AD\r
+:10DE500049460A220023CDF800C001F0FFF80499DA\r
+:10DE60004046049F0023303201F801290A22049120\r
+:10DE7000494601F0F3F8DDF800C08046894658EACB\r
+:10DE80000902E4D11EE05BAA0332059908F00F03F2\r
+:10DE900017464FEA1910CB5C4FEA181102F8013906\r
+:10DEA00041EA09739846814658EA0903EDD109E031\r
+:10DEB0003AB915F0010F04D060AF302307F8113DD7\r
+:10DEC00000E05CAF0DF5B878E146C7EB080812E05A\r
+:10DED00001920291002B00F071814FF000098DF842\r
+:10DEE00048318DF87F914FF0010852AF03E0E046D2\r
+:10DEF000814600E0E0469DF87F31C845ACBF414611\r
+:10DF0000494604910BB10131049115F002020692C9\r
+:10DF100002D0049B0233049315F08401079143D18E\r
+:10DF2000029A0499531A002B1CDC3DE01A6010225F\r
+:10DF300089185A605D9A5E9101325D92072A01DC70\r
+:10DF4000083308E0584651465CAAFFF790FC0028C9\r
+:10DF500040F03D8142AB103D09E000BF310B0100B4\r
+:10DF6000200B01002A461D4633463E461746102D1B\r
+:10DF70005E99784ADADC384637461E462B46054617\r
+:10DF80007360CB1832605E935D9B01335D93072B0A\r
+:10DF900001DC083608E0584651465CAAFFF767FCEA\r
+:10DFA000002840F0148142AE9DF87F31BBB15FABD9\r
+:10DFB00003333360012373605E9B01335E935D9B8B\r
+:10DFC00001335D93072B01DC083608E058465146C3\r
+:10DFD0005CAAFFF74CFC002840F0F98042AE069A9C\r
+:10DFE000B2B15FAB3360022373605E9B02335E931A\r
+:10DFF0005D9B01335D93072B01DC083608E0584632\r
+:10E0000051465CAAFFF733FC002840F0E08042AEA6\r
+:10E01000079B802B3ED10299049A8B1A002B17DCA8\r
+:10E0200038E01A60102289185A605D9A5E910132B8\r
+:10E030005D92072A01DC083308E0584651465CAA85\r
+:10E04000FFF715FC002840F0C28042AB103D04E011\r
+:10E050002A461D4633463E461746102D5E993E4AD7\r
+:10E06000DFDC384637461E462B4605467360CB1824\r
+:10E0700032605E935D9B01335D93072B01DC0836B4\r
+:10E0800008E0584651465CAAFFF7F1FB002840F033\r
+:10E090009E8042AEC8EB0909B9F1000F17DC2FE0F2\r
+:10E0A00033601023D21873605D9B5E9201335D93E1\r
+:10E0B000072B01DC083608E0584651465CAAFFF7FA\r
+:10E0C000D6FB002840F0838042AEA9F11009B9F1D7\r
+:10E0D000100F5E9A204BE3DC33604A445D9BC6F828\r
+:10E0E000049001335E92072B5D9301DC083607E054\r
+:10E0F000584651465CAAFFF7BAFB002867D142AEEA\r
+:10E100005E9B3760C6F8048043445E935D9B013399\r
+:10E110005D93072B01DC083607E0584651465CAAA0\r
+:10E12000FFF7A5FB002852D142AE15F0040F31D005\r
+:10E13000029B04995D1A002D19DC2BE0326010223D\r
+:10E140009B1872605E935D9B01335D93072B05DC2A\r
+:10E1500008360BE0100E0100200E01005846514613\r
+:10E160005CAAFFF784FB002831D142AE103D102D90\r
+:10E170005E9B204AE2DC75605D195D9B3260013375\r
+:10E180005E95072B5D9305DD584651465CAAFFF767\r
+:10E190006EFBE0B9039A029B04999942ACBF5218F6\r
+:10E1A000D2185E9B03922BB1584651465CAAFFF7EA\r
+:10E1B0005EFB60B9002342AE5D930EE45E9B574662\r
+:10E1C00033B1584651465CAAFFF751FB00E0574671\r
+:10E1D000BB89039A03F04003002B18BF4FF0FF32B6\r
+:10E1E000039202E04FF0FF330393039861B0BDE860\r
+:10E1F000F08F00BF100E010010B55143F8F7F8FF83\r
+:10E20000044618B350F8042C22F00302043A242ADE\r
+:10E2100019D8132A03460FD9002140F8041B031D07\r
+:10E220001B2A616008D94160181D59600833242AEF\r
+:10E2300002D14160596008331A46002142F8041B9C\r
+:10E240005960516002E00021F9F715FA204610BD2F\r
+:10E2500093892DE9F34113F4005F06460D461446F9\r
+:10E2600006D143F400539381536E43F40053536635\r
+:10E27000FDF7FCFC012806D12DB1FF2D03D88DF848\r
+:10E28000045080460FE0304601A92A4604F15C03A1\r
+:10E2900000F070FBB0F1FF3F804604D1A38943F04A\r
+:10E2A0004003A38131E0002729E0A26801AB013AD5\r
+:10E2B000A260002A1ADAA1698A420CDBDB5D2268BF\r
+:10E2C0001370236819780A2903D0013300202360D2\r
+:10E2D00013E0304601E0D95D30462246FCF77EFC73\r
+:10E2E000A0F1FF33584240EB030006E0DB5D2268FB\r
+:10E2F000137023680133236000E020B901374745DC\r
+:10E30000D3D1284601E04FF0FF30BDE8FC81F0B5E5\r
+:10E310004A11066900F11403B24226DA043200EB16\r
+:10E320008606143600EB8202141D11F01F011AD06C\r
+:10E330005268C1F12007251DCA400AE054F804CFF5\r
+:10E340000CFA07FC42EA0C0243F8042B55F8042BA4\r
+:10E35000CA40B542F2D31A603AB1043305E054F82A\r
+:10E36000042B43F8042BA642F9D800F114029B1A9F\r
+:10E370009B10036103B94361F0BD000030B5002379\r
+:10E3800003E0044C5D180133A554C25C002AF8D1A7\r
+:10E3900030BD00BFB408001010B510210648FFF7CB\r
+:10E3A000EDFF1A210548FFF7E9FF05481A21BDE8EE\r
+:10E3B0001040FFF7E3BF00BF300E01003B0B010030\r
+:10E3C0002A0B01002DE9F04F89B014460493019106\r
+:10E3D0000290FDF751FC00680390F9F7DFFB039A08\r
+:10E3E0001318814613F8013C0593994B9B4693F80B\r
+:10E3F00030200AB9FFF7D0FF019A4FF000081368E8\r
+:10E40000023301E008F101081F4613F8012B302AFE\r
+:10E41000F8D01BF80260DEB9384603994A46F9F78E\r
+:10E42000C5FB002839D117F8093007EB090A884ADB\r
+:10E43000D65C002E32D053461F4613F8012B302AEB\r
+:10E44000FAD01BF8023033B901255646A84606E03B\r
+:10E4500000252E4603E0564600254FF001083B46B6\r
+:10E460009A4613F8012B1BF80220002AF8D15046D7\r
+:10E4700003994A46F9F79AFB50B956B90AEB0906CF\r
+:10E4800033461A789A4601331BF80220002AF8D145\r
+:10E490002EB1CAEB0606B60001E0BA4601259AF88D\r
+:10E4A0000030502B01D0702B28D19AF801300AF19E\r
+:10E4B00001002B2B02D02D2B05D101E0002100E023\r
+:10E4C0000121013000E0002103781BF80330ABB1DB\r
+:10E4D000192B13DC103B04E010380A2202FB030363\r
+:10E4E000604600F1010C407862461BF8000008B15C\r
+:10E4F0001928F1DD01B15B42F61800E05246019B9C\r
+:10E500001A603DB1B8F1000F0CBF4FF006084FF094\r
+:10E51000000882E10AF1FF332946DB1B01E00131EB\r
+:10E520005B10072BFBDC02984FF00008FDF7F9FBAE\r
+:10E5300007962646444600F114020690019294463E\r
+:10E5400026E01AF8012C0AF1FF35059B9A420ED1FC\r
+:10E55000C9F1010AAA44BA4509D3504603994A466B\r
+:10E56000CDF800C0F9F722FBDDF800C080B1202C07\r
+:10E5700004D14CF8048B4FF0000844462A78AA4690\r
+:10E580001BF8022002F00F02A240043448EA0208FD\r
+:10E59000BA45D6D8069D63463446079E05F1140752\r
+:10E5A00043F8048BDF1B4046BF102F61FDF77DFC55\r
+:10E5B0007F01C0EB07082768B8452CDDC7EB0808CA\r
+:10E5C00028464146FDF788FFD8B108F1FF314FF0EA\r
+:10E5D000010901F01F024B1109FA02F205EB830356\r
+:10E5E0005B691A4211D049450DDD2846A8F10201A8\r
+:10E5F000FDF772FF002814BF4FF003094FF0020926\r
+:10E6000003E0814601E04FF0020928464146FFF74A\r
+:10E610007EFE46440FE00CDAC8EB07082946424666\r
+:10E620000298FDF781FDC8EB0606054600F11402CD\r
+:10E6300001924FF00009A3689E420BDD0298294623\r
+:10E64000FDF7A0FB129A00234FF0A3081360E4E04B\r
+:10E65000B408001063689E4256DA9E1BBE422BDB54\r
+:10E66000E368022B0DD0032B0ED0012B1AD1BE4232\r
+:10E6700018D1012F0ADD2846791EFDF72DFF28B994\r
+:10E6800010E0139B13B10DE0139A5AB163684FF079\r
+:10E690006208049A13600123019A2B611360129B94\r
+:10E6A0001D60BAE002982946FDF76CFB129A002320\r
+:10E6B0004FF050081360B0E006F1FF38B9F1000FD9\r
+:10E6C00008D1B8F1000F07DD28464146FDF704FFE9\r
+:10E6D000814601E04FF0010901224FEA681308F07A\r
+:10E6E0001F08314602FA08F8019A2846BF1B52F863\r
+:10E6F000233018EA030F4FF0020818BF49F002094F\r
+:10E70000FFF705FE666801E04FF00108B9F1000F60\r
+:10E710007FD0E368022B0ED0032B10D0012B76D1D3\r
+:10E7200019F0020F73D0019A136849EA030919F02E\r
+:10E73000010F07D16BE0139AC2F1010300E0139BB4\r
+:10E74000002B64D0D5F8109005F1140305EB890077\r
+:10E750001430194653F8042BB2F1FF3F02D00132B6\r
+:10E760000A6021E00022984243F8042CF1D8AB68FB\r
+:10E77000994512DB696802980131FDF7D2FA2A69DE\r
+:10E7800005F10C010232920082460C30F8F750FF7E\r
+:10E79000294602985546FDF7F5FA2B69012105EB4C\r
+:10E7A00083025B182B615161B8F1020F12D123680B\r
+:10E7B000013B9F4228D107F01F037F11012205EB87\r
+:10E7C00087079A407B691A420CBF4FF002084FF04E\r
+:10E7D000010819E02B694B450BDC17F01F0711D01E\r
+:10E7E00005EB8903C7F120071869FDF75EFBB84206\r
+:10E7F00008DA01212846FFF78AFDA36801369E4208\r
+:10E800003FF71CAF4FF0010848F0200801E048F046\r
+:10E810001008129B049A1D601660404609B0BDE8BE\r
+:10E82000F08F00BFC2F108020346F0B59200C2F1BA\r
+:10E8300020060546044655F804CF07680CFA06FC86\r
+:10E840004CEA070740F8047B53F8047FD74088421E\r
+:10E8500044F8047FEFD3F0BD454B2DE9F74F154643\r
+:10E8600093F830200C4601900AB9FFF795FD236814\r
+:10E8700001985F1113F01F03009305EB87070368EE\r
+:10E8800018BF043700223E1F924647F8042CB046BA\r
+:10E890003446914631E03648C15CD1B9202B11D8BD\r
+:10E8A000CA4529DA444505D2072A03DC20464146F9\r
+:10E8B000FFF7B8FFAC421ED90022CA4644F8042D27\r
+:10E8C000A04619E0292B4DD101990BF101030B60F2\r
+:10E8D00018E0013209F10109082A05DDAC420BD923\r
+:10E8E0000122002344F8043D236801F00F0141EAAE\r
+:10E8F0000311216000E008225B4603F1010B5B7805\r
+:10E90000002BC8D1B9F1000F2CD0444505D2072AFD\r
+:10E9100003DC20464146FFF785FFAC420DD92B466C\r
+:10E9200054F8042BA64243F8042B1A46F8D20023CD\r
+:10E9300042F8043BB242FAD90BE0009A4AB1C2F164\r
+:10E9400020034FF0FF3232FA03F3326802EA030386\r
+:10E95000336057F8043C043F33B9BD42F9D1013369\r
+:10E960002B6001E0042000E00520BDE8FE8F00BF21\r
+:10E97000B40800102DE9F0411D4686B00446174644\r
+:10E9800088460F4B41B91E68FDF76CF9009503A945\r
+:10E9900042460346204607E01E68FDF763F94146FC\r
+:10E9A0003A46009503462046B047B0F1FF3F03D1F9\r
+:10E9B00000232B608A33236006B0BDE8F08100BFDE\r
+:10E9C0003007001049B1FF2A04D98A2303604FF0B1\r
+:10E9D000FF3070470A7001207047084670470000FA\r
+:10E9E0004A1E08BF7047C0F02481884240F2168159\r
+:10E9F000114200F01781B0FA80F3B1FA81F2A2EB74\r
+:10EA00000303C3F11F0304A202EB03134FF0000240\r
+:10EA10009F4600BFAFF30080B0EBC17F00BF42EB69\r
+:10EA2000020228BFA0EBC170B0EB817F00BF42EBB8\r
+:10EA3000020228BFA0EB8170B0EB417F00BF42EB28\r
+:10EA4000020228BFA0EB4170B0EB017F00BF42EB98\r
+:10EA5000020228BFA0EB0170B0EBC16F00BF42EB18\r
+:10EA6000020228BFA0EBC160B0EB816F00BF42EB98\r
+:10EA7000020228BFA0EB8160B0EB416F00BF42EB08\r
+:10EA8000020228BFA0EB4160B0EB016F00BF42EB78\r
+:10EA9000020228BFA0EB0160B0EBC15F00BF42EBF8\r
+:10EAA000020228BFA0EBC150B0EB815F00BF42EB78\r
+:10EAB000020228BFA0EB8150B0EB415F00BF42EBE8\r
+:10EAC000020228BFA0EB4150B0EB015F00BF42EB58\r
+:10EAD000020228BFA0EB0150B0EBC14F00BF42EBD8\r
+:10EAE000020228BFA0EBC140B0EB814F00BF42EB58\r
+:10EAF000020228BFA0EB8140B0EB414F00BF42EBC8\r
+:10EB0000020228BFA0EB4140B0EB014F00BF42EB37\r
+:10EB1000020228BFA0EB0140B0EBC13F00BF42EBB7\r
+:10EB2000020228BFA0EBC130B0EB813F00BF42EB37\r
+:10EB3000020228BFA0EB8130B0EB413F00BF42EBA7\r
+:10EB4000020228BFA0EB4130B0EB013F00BF42EB17\r
+:10EB5000020228BFA0EB0130B0EBC12F00BF42EB97\r
+:10EB6000020228BFA0EBC120B0EB812F00BF42EB17\r
+:10EB7000020228BFA0EB8120B0EB412F00BF42EB87\r
+:10EB8000020228BFA0EB4120B0EB012F00BF42EBF7\r
+:10EB9000020228BFA0EB0120B0EBC11F00BF42EB77\r
+:10EBA000020228BFA0EBC110B0EB811F00BF42EBF7\r
+:10EBB000020228BFA0EB8110B0EB411F00BF42EB67\r
+:10EBC000020228BFA0EB4110B0EB011F00BF42EBD7\r
+:10EBD000020228BFA0EB0110B0EBC10F00BF42EB57\r
+:10EBE000020228BFA0EBC100B0EB810F00BF42EBD7\r
+:10EBF000020228BFA0EB8100B0EB410F00BF42EB47\r
+:10EC0000020228BFA0EB4100B0EB010F00BF42EBB6\r
+:10EC1000020228BFA0EB0100104670470CBF012084\r
+:10EC200000207047B1FA81F2C2F11F0220FA02F00F\r
+:10EC3000704708B14FF0FF3000F066B90029F8D0F6\r
+:10EC40002DE90340FFF7CCFEBDE8064002FB00F3D0\r
+:10EC5000A1EB0301704700BF002900F03E8180EA6C\r
+:10EC6000010C48BF49424A1E00F01F81030048BF03\r
+:10EC700043428B4240F21E81114200F02381B3FADD\r
+:10EC800083F2B1FA81F0A0EB0202C2F11F0204A0EC\r
+:10EC900000EB02124FF00000974600BFAFF3008078\r
+:10ECA000B3EBC17F00BF40EB000028BFA3EBC173F3\r
+:10ECB000B3EB817F00BF40EB000028BFA3EB817363\r
+:10ECC000B3EB417F00BF40EB000028BFA3EB4173D3\r
+:10ECD000B3EB017F00BF40EB000028BFA3EB017343\r
+:10ECE000B3EBC16F00BF40EB000028BFA3EBC163D3\r
+:10ECF000B3EB816F00BF40EB000028BFA3EB816343\r
+:10ED0000B3EB416F00BF40EB000028BFA3EB4163B2\r
+:10ED1000B3EB016F00BF40EB000028BFA3EB016322\r
+:10ED2000B3EBC15F00BF40EB000028BFA3EBC153B2\r
+:10ED3000B3EB815F00BF40EB000028BFA3EB815322\r
+:10ED4000B3EB415F00BF40EB000028BFA3EB415392\r
+:10ED5000B3EB015F00BF40EB000028BFA3EB015302\r
+:10ED6000B3EBC14F00BF40EB000028BFA3EBC14392\r
+:10ED7000B3EB814F00BF40EB000028BFA3EB814302\r
+:10ED8000B3EB414F00BF40EB000028BFA3EB414372\r
+:10ED9000B3EB014F00BF40EB000028BFA3EB0143E2\r
+:10EDA000B3EBC13F00BF40EB000028BFA3EBC13372\r
+:10EDB000B3EB813F00BF40EB000028BFA3EB8133E2\r
+:10EDC000B3EB413F00BF40EB000028BFA3EB413352\r
+:10EDD000B3EB013F00BF40EB000028BFA3EB0133C2\r
+:10EDE000B3EBC12F00BF40EB000028BFA3EBC12352\r
+:10EDF000B3EB812F00BF40EB000028BFA3EB8123C2\r
+:10EE0000B3EB412F00BF40EB000028BFA3EB412331\r
+:10EE1000B3EB012F00BF40EB000028BFA3EB0123A1\r
+:10EE2000B3EBC11F00BF40EB000028BFA3EBC11331\r
+:10EE3000B3EB811F00BF40EB000028BFA3EB8113A1\r
+:10EE4000B3EB411F00BF40EB000028BFA3EB411311\r
+:10EE5000B3EB011F00BF40EB000028BFA3EB011381\r
+:10EE6000B3EBC10F00BF40EB000028BFA3EBC10311\r
+:10EE7000B3EB810F00BF40EB000028BFA3EB810381\r
+:10EE8000B3EB410F00BF40EB000028BFA3EB4103F1\r
+:10EE9000B3EB010F00BF40EB000028BFA3EB010361\r
+:10EEA000BCF1000F48BF404270479CEA000F48BFCA\r
+:10EEB0004042704738BF002004BF4FEAEC7040F07A\r
+:10EEC00001007047B1FA81F2C2F11F02BCF1000FDC\r
+:10EED00023FA02F048BF404270470028C8BF6FF0D5\r
+:10EEE0000040B8BF4FF0004000F00EB80029F4D049\r
+:10EEF0002DE90340FFF7B3FEBDE8064002FB00F337\r
+:10EF0000A1EB0301704700BF704700BF4FF0FF3C0B\r
+:10EF100006E000BF4FF0010C02E000BF4FF0010C13\r
+:10EF20004DF804CD4FEA410C7FEA6C5C4FEA430C8C\r
+:10EF300018BF7FEA6C5C1BD001B050EA410C0CBFDB\r
+:10EF400052EA430C91EA030F02BF90EA020F00203D\r
+:10EF5000704710F1000F91EA030F58BF994208BFA4\r
+:10EF600090422CBFD8176FEAE37040F00100704761\r
+:10EF70004FEA410C7FEA6C5C02D150EA013C07D1B8\r
+:10EF80004FEA430C7FEA6C5CD6D152EA033CD3D003\r
+:10EF90005DF8040B704700BF8446104662468C46FD\r
+:10EFA0001946634600E000BF01B5FFF7B7FF002830\r
+:10EFB00048BF10F1000F01BD4DF808EDFFF7F4FF59\r
+:10EFC0000CBF012000205DF808FB00BF4DF808EDE4\r
+:10EFD000FFF7EAFF34BF012000205DF808FB00BF07\r
+:10EFE0004DF808EDFFF7E0FF94BF012000205DF829\r
+:10EFF00008FB00BF4DF808EDFFF7CEFF94BF0120DE\r
+:10F0000000205DF808FB00BF4DF808EDFFF7C4FFD6\r
+:10F0100034BF012000205DF808FB00BF4A0011D278\r
+:10F0200012F5001211D20DD56FF47873B3EB625262\r
+:10F030000ED44FEAC12343F0004343EA505323FA6E\r
+:10F0400002F070474FF00000704750EA013002D1E3\r
+:10F050004FF0FF3070474FF0000070474BB942B996\r
+:10F06000002908BF002802D04FF0FF310846FFF703\r
+:10F070004BBF82B0EC462DE9005000F01DF8DDF8E2\r
+:10F0800004E002B00CBC70472DE970431646804680\r
+:10F0900089461D4600F028F800FB05F3A0FB064555\r
+:10F0A00006FB0136069B7519B8EB040469EB0505F0\r
+:10F0B000C3E90045BDE870832DE9704316468046DC\r
+:10F0C00089461D4600F0C0F900FB05F3A0FB06458C\r
+:10F0D00006FB0136069B7519B8EB040469EB0505C0\r
+:10F0E000C3E90045BDE8708300292DE9F04F1C46B7\r
+:10F0F00085B0C0F2CB800026002CC0F2C2808C46C6\r
+:10F1000017461446054688469A46002B4AD18A423D\r
+:10F110006ED9B2FA82F35BB1C3F1200401FA03F8AD\r
+:10F1200030FA04F210FA03F517FA03F442EA080879\r
+:10F130004FEA144A404651461FFA84FBFFF750FC41\r
+:10F14000514681464046FFF779FD280C0BFB09F339\r
+:10F1500040EA0148434509D918EB040809F1FF3991\r
+:10F1600004D2434584BF09F1FF39A044C3EB08082A\r
+:10F1700051464046ADB2FFF733FC51460746404684\r
+:10F18000FFF75CFD0BFB07FB45EA0145AB4505D9E5\r
+:10F19000013F2D1902D2AB4588BF013F47EA09491B\r
+:10F1A000002403E08B420CD90024A1464A462346A2\r
+:10F1B00016B1524263EB43031046194605B0BDE851\r
+:10F1C000F08FB3FA83F4002C40F0B3808B424FF001\r
+:10F1D00001092CBF4FF0000C4FF0010C82428CBF94\r
+:10F1E00067464CF00107002FE0D13C46B946DDE709\r
+:10F1F00022B901201146FFF7F3FB0446B4FA84F369\r
+:10F20000002B49D1C4EB0808270C1FFA84FA01210E\r
+:10F21000029139464046FFF7E3FB394681464046B6\r
+:10F22000FFF70CFD2A0C0AFB09F342EA014B5B4590\r
+:10F2300009D91BEB040B09F1FF3904D25B4584BFEC\r
+:10F2400009F1FF39A344C3EB0B0B39465846ADB265\r
+:10F25000FFF7C6FB394680465846FFF7EFFC0AFB2E\r
+:10F2600008FA45EA0145AA4507D92D1908F1FF38E2\r
+:10F2700003D2AA4588BF08F1FF3848EA0949029C31\r
+:10F2800094E7F643524263EB430338E7404261EBB5\r
+:10F2900041014FF0FF362FE79C40C3F1200728FAC9\r
+:10F2A00007FA35FA07F2270C08FA03FB39465046ED\r
+:10F2B00042EA0B029D400292FFF792FB39468346D9\r
+:10F2C0005046FFF7BBFC029B1FFA84FA4FEA134932\r
+:10F2D0000AFB0BF349EA0148434505D918EB04083A\r
+:10F2E0000BF1FF3BC0F0AA80C3EB0808394640464B\r
+:10F2F000FFF776FB394681464046FFF79FFC0298B0\r
+:10F300000AFB09F31FFA80FC4CEA0148434509D97E\r
+:10F3100018EB040809F1FF3904D2434584BF09F111\r
+:10F32000FF39A04449EA0B4EC3EB0808CDF808E0CA\r
+:10F330006FE7C4F120030AFA04FADA4021FA03F86D\r
+:10F3400042EA0A0A01FA04F930FA03F240464FEAA7\r
+:10F350001A4B42EA09010391594617FA04F3029342\r
+:10F36000FFF73EFB594681464046FFF767FC1FFA10\r
+:10F370008AF3039803FB09F2070C47EA0148424568\r
+:10F3800004D918EB0A0809F1FF3951D3C2EB080878\r
+:10F39000594640460193FFF723FB5946074640462E\r
+:10F3A000FFF74CFC019B039803FB07F31FFA80FC5B\r
+:10F3B0004CEA014C634507D9013F1CEB0A0C03D210\r
+:10F3C000634501D9013FD44447EA0949029FC3EB91\r
+:10F3D0000C0C1FFA89FE4FEA1943B8B23F0C00FB30\r
+:10F3E0000EF800FB03F107FB0E1207FB03F002EB24\r
+:10F3F0001842914288BF00F5803000EB124EF44570\r
+:10F4000012D34FEA02421FFA88F814BF00210121EB\r
+:10F4100002EB080C15FA04F464452CBF002401F03B\r
+:10F420000104002C3FF4C2AE09F1FF390024BDE60F\r
+:10F43000424584BF09F1FF39D044A7E7434584BF63\r
+:10F440000BF1FF3BA0444FE72DE9F04F054683B099\r
+:10F450000C46174680460E46002B4DD18A4261D994\r
+:10F46000B2FA82F353B1C3F1200411FA03F630FA71\r
+:10F4700004F29F4042EA060600FA03F83C0C3046CC\r
+:10F4800021461FFA87FAFFF7ABFA2146814630463C\r
+:10F49000FFF7D4FB4FEA18400AFB09F340EA0146A4\r
+:10F4A000B34208D9F61909F1FF3904D2B34284BF37\r
+:10F4B00009F1FF39F619F61A214630461FFA88F885\r
+:10F4C000FFF78EFA214605463046FFF7B7FB0AFBE9\r
+:10F4D00005FA48EA0148C24506D9013D18EB07087C\r
+:10F4E00002D2C24588BF013D45EA094A002631469D\r
+:10F4F000504603B0BDE8F08F8B425BD8B3FA83F679\r
+:10F50000002E5AD18B424FF0010A2CBF0024012457\r
+:10F5100082428CBF254644F00105002DE7D12E46DE\r
+:10F52000AA46E4E722B901201146FFF759FA074637\r
+:10F53000B7FA87F3002B40F0B680E41B4FEA174B75\r
+:10F54000BDB2012659462046FFF74AFA59464FEA0E\r
+:10F55000184982462046FFF771FB05FB0AF349EA8A\r
+:10F560000144A34208D9E4190AF1FF3A04D2A342A4\r
+:10F5700084BF0AF1FF3AE419E41A59462046FFF71E\r
+:10F580002FFA594681462046FFF758FB1FFA88F3A9\r
+:10F5900005FB09F543EA0148454508D918EB07087A\r
+:10F5A00009F1FF3903D2454588BF09F1FF3949EA1E\r
+:10F5B0000A4A9CE70026B24699E7C6F12001B3400B\r
+:10F5C00032FA01F724FA01F91F43B44030FA01F38B\r
+:10F5D00048464FEA174843EA040101914146B240C8\r
+:10F5E0000092FFF7FDF94146BCB282464846FFF75C\r
+:10F5F00025FB019804FB0AF34FEA104B4BEA014B41\r
+:10F600005B4505D91BEB070B0AF1FF3AC0F093806D\r
+:10F61000C3EB0B0B41465846FFF7E2F941468146E2\r
+:10F620005846FFF70BFB019804FB09F41FFA80FC16\r
+:10F630004CEA01439C4203D9DB1909F1FF3974D329\r
+:10F64000009F49EA0A4A1C1B1FFA8AFEB8B23A0C0C\r
+:10F650004FEA1A4700FB0EFC00FB07F302FB0E31DA\r
+:10F6600002FB07F201EB1C418B4288BF02F580329E\r
+:10F6700002EB114E744512D34FEA01411FFA8CF28E\r
+:10F6800014BF0023012301EB020C15FA06F66645B0\r
+:10F690002CBF002603F00106002E3FF428AF0AF12C\r
+:10F6A000FF3A002623E79F40C3F1200134FA01F618\r
+:10F6B00014FA03F24FEA174B25FA01FA304659467D\r
+:10F6C00005FA03F84AEA020AFFF78AF95946BDB279\r
+:10F6D00081463046FFF7B2FA4FEA1A4C05FB09F3B0\r
+:10F6E0004CEA0144A34203D9E41909F1FF3928D3B4\r
+:10F6F000E41A59462046FFF773F959460646204654\r
+:10F70000FFF79CFA1FFA8AF405FB06F344EA01446A\r
+:10F71000A34206D9013EE41903D2A34201D9013E16\r
+:10F72000E419E41A46EA09460CE79C4284BF09F151\r
+:10F73000FF39DB1984E75B4584BF0AF1FF3ABB441C\r
+:10F7400066E7A34284BF09F1FF39E419D0E700BF9F\r
+:10F750002F737464696E00002F7374646F75740086\r
+:10F760002F737464657272005249503A205F737946\r
+:10F77000735F7365656B282920696E206D6265640F\r
+:10F780002E617220686173206265656E206D6F6402\r
+:10F7900069666965640D0A2020202020616E64205E\r
+:10F7A0005F6C7365656B20696E20676363346D629F\r
+:10F7B00065642F73797363616C6C732E63206E655F\r
+:10F7C00065647320746F2062652075706461746570\r
+:10F7D000640D0A0030FC0000E0F70000F4FA0000BD\r
+:10F7E000395553424D53445F53440000000000001C\r
+:10F7F00000000000D4F70000891700002D1D000054\r
+:10F80000011A0000951A0000A5170000A9170000B2\r
+:10F81000DD050000E1050000E5050000FD25000014\r
+:10F8200059230000E9050000ED050000F105000086\r
+:10F83000651E0000F5050000351E0000F9050000FA\r
+:10F84000DD1700002D1E0000AD170000B5170000E9\r
+:10F85000251E0000BD170000C51700001D1E00007A\r
+:10F86000FD0500003D0C00002D0D0000210E0000E4\r
+:10F8700009060000A50600000106000005060000BC\r
+:10F8800054696D656F75742077616974696E67205E\r
+:10F89000666F722076312E7820636172640A0000F0\r
+:10F8A00054696D656F75742077616974696E67203E\r
+:10F8B000666F722076322E7820636172640A0000CF\r
+:10F8C0004E6F206469736B2C206F7220636F756CB0\r
+:10F8D00064206E6F742070757420534420636172CD\r
+:10F8E0006420696E20746F205350492069646C65F0\r
+:10F8F0002073746174650A004E6F7420696E20690C\r
+:10F90000646C65207374617465206166746572202F\r
+:10F9100073656E64696E6720434D443820286E6FAE\r
+:10F920007420616E20534420636172643F290A0091\r
+:10F930004469646E27742067657420612072657362\r
+:10F94000706F6E73652066726F6D207468652064D9\r
+:10F9500069736B0A00000000436F756C646E277456\r
+:10F9600020726561642063736420726573706F6ECA\r
+:10F9700073652066726F6D206469736B0A00000006\r
+:10F9800054686973206469736B2074617374657360\r
+:10F990002066756E6E79212049206F6E6C79206B20\r
+:10F9A0006E6F772061626F75742074797065203096\r
+:10F9B0002043534420737472756374757265730ABF\r
+:10F9C00000000000536574203531322D6279746572\r
+:10F9D00020626C6F636B2074696D6564206F757451\r
+:10F9E0000A000000000000000000000028FA0000EB\r
+:10F9F000790E00007D0E0000810E0000850E0000D3\r
+:10FA0000890E00008D0E0000DD050000E1050000FC\r
+:10FA1000E5050000710E0000750E0000E90500000C\r
+:10FA2000ED05000000000000B0FB000030FA00000F\r
+:10FA30003655534248414C0030FC000044FA000067\r
+:10FA400028FA000039555342446576696365000021\r
+:10FA50000000000038FA0000891700002D1D00008A\r
+:10FA6000011A0000951A0000A5170000A917000050\r
+:10FA7000DD050000E1050000E5050000710E000055\r
+:10FA8000750E0000E9050000ED050000F10500001D\r
+:10FA90007D170000F505000081170000F905000042\r
+:10FAA000DD17000085170000AD170000B517000036\r
+:10FAB000D5170000BD170000C5170000CD170000C6\r
+:10FAC000FD05000000000000008000012080000013\r
+:10FAD0004D4245442E4F52474D42454420555342D6\r
+:10FAE000204449534B202020312E3020365553429C\r
+:10FAF0004D53440030FC0000ECFA000038FA0000DE\r
+:10FB000000000000F4FA0000891700002D1D00001D\r
+:10FB1000011A0000951A0000A5170000A91700009F\r
+:10FB2000DD050000E1050000E5050000FD25000001\r
+:10FB300059230000E9050000ED050000F105000073\r
+:10FB4000651E0000F5050000351E0000F9050000E7\r
+:10FB5000DD1700002D1E0000AD170000B5170000D6\r
+:10FB6000251E0000BD170000C51700001D1E000067\r
+:10FB7000FD050000052900000529000005290000F9\r
+:10FB800005290000052900000529000000000000EB\r
+:10FB9000700005000000000A0000000030010000B5\r
+:10FBA000000000000000000000000000D8FB000082\r
+:10FBB000392700004D270000392A00003D2A0000A7\r
+:10FBC000112700006B270000BB260000D52600008F\r
+:10FBD000AF2600000000000030FC0000E4FB000045\r
+:10FBE0008CFC00004E31305F5F637878616269762B\r
+:10FBF0003131375F5F636C6173735F747970655F18\r
+:10FC0000696E666F450070757265207669727475ED\r
+:10FC1000616C206D6574686F642063616C6C6564F1\r
+:10FC20000A000000000000000000000058FC000076\r
+:10FC3000052A0000192A0000392A00003D2A000088\r
+:10FC4000112700006B270000192900003D29000042\r
+:10FC5000CD2900000000000030FC000064FC000022\r
+:10FC6000D8FB00004E31305F5F637878616269765F\r
+:10FC70003132305F5F73695F636C6173735F747996\r
+:10FC800070655F696E666F4500000000B0FB0000A4\r
+:10FC900094FC0000537439747970655F696E666F07\r
+:10FCA0000000000000000000000000008CFC0000CC\r
+:10FCB0002D2A0000452A0000392A00003D2A0000B4\r
+:10FCC000972A0000412A000030FC0000D4FC00000C\r
+:10FCD000D8FB00004E31305F5F63787861626976EF\r
+:10FCE0003132315F5F766D695F636C6173735F742E\r
+:10FCF0007970655F696E666F450000000000000066\r
+:10FD000000000000C8FC0000BD2A0000D12A00004D\r
+:10FD1000392A00003D2A0000112700006B2700004F\r
+:10FD20008F2B0000D72C0000F92A000000000000F3\r
+:10FD30007465726D696E6174652063616C6C656475\r
+:10FD4000207265637572736976656C790A007465F3\r
+:10FD5000726D696E6174652063616C6C65642061AD\r
+:10FD600066746572207468726F77696E6720616E61\r
+:10FD700020696E7374616E6365206F6620270027AB\r
+:10FD80000A007465726D696E6174652063616C6CE4\r
+:10FD9000656420776974686F757420616E20616393\r
+:10FDA0007469766520657863657074696F6E0A00A2\r
+:10FDB00074000000720401000300000072040100DE\r
+:10FDC00003000000000000000000000061000000CF\r
+:10FDD000480701000E000000480701000E00000067\r
+:10FDE0004D070100090000006200000057070100F4\r
+:10FDF0001100000057070100110000005C0701001E\r
+:10FE00000C00000073000000690701000B000000F7\r
+:10FE100075070100460000005C0701000C000000AF\r
+:10FE200069000000BC0701000C000000C9070100C8\r
+:10FE300031000000FB0701000D0000006F00000012\r
+:10FE4000090801000C000000160801003100000044\r
+:10FE5000480801000D000000640000005608010081\r
+:10FE60000D00000064080100320000009708010046\r
+:10FE70000E000000A10601000B000000A106010019\r
+:10FE80000B000000000000007006010004000000EC\r
+:10FE9000750601000700000007000000A806010029\r
+:10FEA000040000007D0601000400000000000000C6\r
+:10FEB000870601000600000087060100060000001A\r
+:10FEC00008000000820601000B000000820601000D\r
+:10FED0000B000000080000008E0601000500000075\r
+:10FEE0008E060100050000000800000094060100D5\r
+:10FEF0000A000000940601000A000000080000004B\r
+:10FF00009F0601000D0000009F0601000D0000008B\r
+:10FF100000000000B606010003000000B606010064\r
+:10FF20000300000001000000AD0601000C0000000D\r
+:10FF3000BA060100080000000200000000000000F6\r
+:10FF400000000000000000000000000000000000B1\r
+:10FF5000CC06010004000000CC06010004000000F3\r
+:10FF600003000000C30601000D000000C3060100ED\r
+:10FF70000D00000004000000DA0601000800000087\r
+:10FF8000DA0601000800000000000000D1060100B0\r
+:10FF900011000000D1060100110000000000000067\r
+:10FFA0000000000000000000000000000000000051\r
+:10FFB0000000000000000000000000000000000041\r
+:10FFC0000000000000000000000000000000000031\r
+:10FFD000000000000000000000000000EC0601002E\r
+:10FFE00005000000EC060100050000000000000014\r
+:10FFF000E30601000E000000E30601000E00000011\r
+:020000021000EC\r
+:1000000000000000000000000000000000000000F0\r
+:100010000000000000000000F206010004000000E3\r
+:10002000F20601000400000009000000F7060100CC\r
+:1000300007000000A8060100040000000000000006\r
+:100040000807010009000000CC06010004000000C0\r
+:1000500005000000FF06010012000000FF0601007D\r
+:100060001200000006000000BC05010003000000B3\r
+:10007000BC050100030000000000000012070100A1\r
+:100080000900000012070100090000000000000044\r
+:100090001C070100090000001C0701000900000006\r
+:1000A00000000000260701000A00000026070100EA\r
+:1000B0000A000000000000003107010004000000F9\r
+:1000C00031070100040000000800000036070100AD\r
+:1000D00008000000360701000800000000000000D2\r
+:1000E0003F070100080000003F0701000800000072\r
+:1000F00000000000E30C0100A6080100020000005F\r
+:1001000002000000A90801002F0901000100000001\r
+:1001100002000000AC0801003806010002000000E7\r
+:1001200002000000AF0801003906010001000000D4\r
+:10013000010000007A0601003906010001000000FC\r
+:100140000200000076040100B20801000200000075\r
+:1001500002000000B5080100B8080100010000001D\r
+:1001600002000000BA080100BD0801000100000003\r
+:1001700001000000BF080100C208010002000000E9\r
+:1001800002000000C5080100C808010008000000C6\r
+:1001900001000000D108010051060100010000002B\r
+:1001A00001000000D4080100D7080100060000008B\r
+:1001B0000100000079040100BE05010001000000FB\r
+:1001C00002000000DE080100E1080100010000005B\r
+:1001D00002000000E3080100E60801000200000040\r
+:1001E00002000000E9080100EC0801000100000025\r
+:1001F00002000000EE080100F1080100020000000A\r
+:1002000002000000F4080100710901000200000072\r
+:1002100002000000F7080100BA0701000100000019\r
+:100220000200000089050100CE0801000200000064\r
+:1002300002000000FA080100FD08010003000000B0\r
+:10024000020000008B060100FE0801000200000011\r
+:100250000200000001090100040901000200000081\r
+:10026000020000000709010005090100010000006B\r
+:10027000020000000A0901000D090100020000004F\r
+:100280000200000010090100130901000200000033\r
+:100290000200000016090100200901000100000011\r
+:1002A00002000000190901005106010001000000D0\r
+:1002B000020000001C0901001F09010002000000EB\r
+:1002C00001000000220901002509010005000000CD\r
+:1002D000010000002B0901002E09010002000000AE\r
+:1002E0000200000072070100200901000100000067\r
+:1002F00001000000B7060100310901000100000003\r
+:10030000010000003309010036090100030000006C\r
+:10031000010000003A0901003D090100020000004F\r
+:100320000200000040090100430901000200000032\r
+:100330000200000054070100440901000100000010\r
+:100340000200000046090100490901000200000006\r
+:10035000020000004C0901005A09010001000000E0\r
+:10036000020000004F0901005209010003000000D3\r
+:1003700002000000560901005909010002000000B6\r
+:10038000010000005C0901005A09010001000000A1\r
+:10039000010000007C0401005F0901000200000070\r
+:1003A000020000006209010065090100010000006F\r
+:1003B00003000000670901006A0901000200000053\r
+:1003C000020000006D090100700901000300000037\r
+:1003D000020000007409010077090100010000001B\r
+:1003E00002000000790901007C0901000200000000\r
+:1003F00002000000350601007F090100070000002F\r
+:1004000001000000870901007F09010007000000CA\r
+:1004100001000000910601008A09010008000000A7\r
+:1004200001000000930901008A0901000800000092\r
+:1004300001000000000000000000000000000000BB\r
+:10044000000000005F474C4F42414C5F0028616E46\r
+:100450006F6E796D6F7573206E616D65737061631A\r
+:10046000652900737472696E67206C6974657261C6\r
+:100470006C0073746400636C006474007074004AF0\r
+:1004800041727261790056545420666F7220006385\r
+:100490006F6E737472756374696F6E2076746162C7\r
+:1004A0006C6520666F7220002D696E2D0074797066\r
+:1004B00065696E666F20666F722000747970656979\r
+:1004C0006E666F206E616D6520666F7220007479B4\r
+:1004D0007065696E666F20666E20666F7220006EB2\r
+:1004E0006F6E2D7669727475616C207468756E6BB1\r
+:1004F00020746F2000636F76617269616E74207280\r
+:10050000657475726E207468756E6B20746F200050\r
+:100510006A61766120436C61737320666F7220009C\r
+:100520006775617264207661726961626C652066CC\r
+:100530006F7220007265666572656E636520746512\r
+:100540006D706F7261727920666F722000686964E5\r
+:1005500064656E20616C69617320666F7220005F54\r
+:1005600053617420005F416363756D005F46726183\r
+:100570006374002C20006F70657261746F72006F7D\r
+:1005800070657261746F722000697800203A2000F3\r
+:10059000756C00756C6C0066616C736500747275C7\r
+:1005A00065006A617661207265736F75726365209C\r
+:1005B000006465636C747970652028002E2E2E000F\r
+:1005C0007B7061726D2300676C6F62616C20636F7A\r
+:1005D0006E7374727563746F7273206B6579656482\r
+:1005E00020746F2000676C6F62616C2064657374A7\r
+:1005F000727563746F7273206B6579656420746FB4\r
+:1006000020007B6C616D62646128002923007B758A\r
+:100610006E6E616D6564207479706523002072656B\r
+:100620007374726963740020766F6C6174696C65B1\r
+:100630000020636F6E737400262600636F6D706C0C\r
+:1006400065782000696D6167696E61727920003A92\r
+:100650003A2A00205F5F766563746F7228007B64BE\r
+:10066000656661756C742061726723007D3A3A009B\r
+:10067000626F6F6C00626F6F6C65616E006279749F\r
+:1006800065006C6F6E6720646F75626C6500666CE8\r
+:100690006F6174005F5F666C6F6174313238007532\r
+:1006A0006E7369676E6564206368617200756E734E\r
+:1006B00069676E656420696E7400756E7369676E34\r
+:1006C000656400756E7369676E6564206C6F6E6734\r
+:1006D00000756E7369676E6564205F5F696E743163\r
+:1006E000323800756E7369676E65642073686F7267\r
+:1006F0007400766F69640077636861725F74007577\r
+:100700006E7369676E6564206C6F6E67206C6F6EC8\r
+:100710006700646563696D616C33320064656369A9\r
+:100720006D616C363400646563696D616C313238BB\r
+:100730000068616C66006368617231365F740063E3\r
+:1007400068617233325F74007374643A3A616C6C3E\r
+:100750006F6361746F72007374643A3A62617369B3\r
+:10076000635F737472696E67007374643A3A73748A\r
+:1007700072696E67007374643A3A62617369635FA9\r
+:10078000737472696E673C636861722C2073746461\r
+:100790003A3A636861725F7472616974733C63684A\r
+:1007A00061723E2C207374643A3A616C6C6F6361C1\r
+:1007B000746F723C636861723E203E007374643AE9\r
+:1007C0003A6973747265616D007374643A3A626178\r
+:1007D0007369635F6973747265616D3C63686172AC\r
+:1007E0002C207374643A3A636861725F7472616951\r
+:1007F00074733C636861723E203E0062617369639A\r
+:100800005F6973747265616D007374643A3A6F73F3\r
+:10081000747265616D007374643A3A6261736963FE\r
+:100820005F6F73747265616D3C636861722C2073D5\r
+:1008300074643A3A636861725F7472616974733C9C\r
+:10084000636861723E203E0062617369635F6F732B\r
+:10085000747265616D007374643A3A696F7374728F\r
+:1008600065616D007374643A3A62617369635F69CC\r
+:100870006F73747265616D3C636861722C20737470\r
+:10088000643A3A636861725F7472616974733C635D\r
+:100890006861723E203E0062617369635F696F73D5\r
+:1008A000747265616D00263D0061530061610061F5\r
+:1008B0006400282900636D002C00636F007E0064D3\r
+:1008C00056002F3D0064610064656C6574655B5D76\r
+:1008D00000646500646C0064656C65746500647632\r
+:1008E000002F00654F005E3D00656F005E00657182\r
+:1008F000003D3D006765006774006C53003C3C3D63\r
+:10090000006C73003C3C006C74006D49002D3D0090\r
+:100910006D4C002A3D006D69006D6C006D6D002D01\r
+:100920002D006E61006E65775B5D006E6500213D98\r
+:100930000021006E77006E6577006F52007C3D00ED\r
+:100940006F6F007C7C00704C002B3D00706C007061\r
+:100950006D002D3E2A007070002B2B007073002D4F\r
+:100960003E007175003F00724D00253D007253003E\r
+:100970003E3E3D00726D0025007273003E3E0073E6\r
+:10098000697A656F662000737A00616C69676E6FC3\r
+:10099000662000617A000080808080808080808076\r
+:1009A00098909090908080808080808080808080EF\r
+:1009B000808080808080801804040404040404047F\r
+:1009C00004040404040404020202020202020202F9\r
+:1009D00002040404040404044343434343434141E5\r
+:1009E00041414141414141414141414141414141F7\r
+:1009F0004141040404040404232323232323212149\r
+:100A000021212121212121212121212121212121D6\r
+:100A10002121040404048000000000000000000004\r
+:100A200000000000000000000000000000000000C6\r
+:100A300000000000000000000000000000000000B6\r
+:100A400000000000000000000000000000000000A6\r
+:100A50000000000000000000000000000000000096\r
+:100A60000000000000000000000000000000000086\r
+:100A70000000000000000000000000000000000076\r
+:100A80000000000000000000000000000000000066\r
+:100A90000000000000000000000000000000000056\r
+:100AA0000000000000000000000000000000000046\r
+:100AB0000000000000000000000000000000000036\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF000000000000000000043000000A001001002\r
+:100B000030303030303030303030303030303030E5\r
+:100B1000494E4600696E66004E414E006E616E00A1\r
+:100B20003031323334353637383941424344454623\r
+:100B300000303132333435363738396162636465B9\r
+:100B4000660030002020202020202020202020208F\r
+:100B50002020202065256C6400000A0001000200AE\r
+:100B600003000400050006000700080009000A0051\r
+:100B70000B000C000D000E000F00100020202020A4\r
+:100B80002020202020202020202020203030303025\r
+:100B90003030303030303030303030302C206675EE\r
+:100BA0006E6374696F6E3A20006173736572746965\r
+:100BB0006F6E2022257322206661696C65643A207D\r
+:100BC00066696C6520222573222C206C696E652075\r
+:100BD0002564257325730A00002020202020202072\r
+:100BE00020202828282828202020202020202020DD\r
+:100BF00020202020202020202088101010101010ED\r
+:100C00001010101010101010100404040404040438\r
+:100C100004040410101010101010414141414141D2\r
+:100C200001010101010101010101010101010101B4\r
+:100C300001010101101010101010424242424242C4\r
+:100C40000202020202020202020202020202020284\r
+:100C5000020202021010101020000000000000002C\r
+:100C60000000000000000000000000000000000084\r
+:100C70000000000000000000000000000000000074\r
+:100C80000000000000000000000000000000000064\r
+:100C90000000000000000000000000000000000054\r
+:100CA0000000000000000000000000000000000044\r
+:100CB0000000000000000000000000000000000034\r
+:100CC0000000000000000000000000000000000024\r
+:100CD000000000000000000000496E66696E697443\r
+:100CE00079004E614E00504F5349580005000000F6\r
+:100CF000190000007D000000000000000000F03F2F\r
+:100D000000000000000024400000000000005940E6\r
+:100D10000000000000408F40000000000088C34039\r
+:100D200000000000006AF8400000000080842E41AE\r
+:100D300000000000D01263410000000084D79741FA\r
+:100D40000000000065CDCD41000000205FA0024200\r
+:100D5000000000E876483742000000A2941A6D4275\r
+:100D6000000040E59C30A2420000901EC4BCD64268\r
+:100D700000003426F56B0C430080E03779C3414313\r
+:100D800000A0D8855734764300C84E676DC1AB4389\r
+:100D9000003D9160E458E143408CB5781DAF1544A7\r
+:100DA00050EFE2D6E41A4B4492D54D06CFF0804482\r
+:100DB000F64AE1C7022DB544B49DD9794378EA4497\r
+:100DC0000080E03779C34143176E05B5B5B8934647\r
+:100DD000F5F93FE9034F384D321D30F94877825A13\r
+:100DE0003CBF737FDD4F1575BC89D897B2D29C3C50\r
+:100DF00033A7A8D523F649393DA7F444FD0FA53202\r
+:100E00009D978CCF08BA5B25436FAC642806180EFB\r
+:100E100020202020202020202020202020202020D2\r
+:100E200030303030303030303030303030303030C2\r
+:100E3000303132333435363738390000F8B500BF39\r
+:100E4000F8BC08BC9E4670477D6600001503000094\r
+:100E500099050000F8B500BFF8BC08BC9E46704775\r
+:040E6000010300008A\r
+:080E6400004870473C24010026\r
+:100E6C0070B50D46114600F0ADF90B490446016012\r
+:100E7C00681C04BF204670BD284625F01F01256163\r
+:100E8C00616101F001FA2069012100F01F0001FAF3\r
+:0C0E9C0000F0A061204670BDDC270100C2\r
+:040EA80000F0BEB9DF\r
+:100EAC00F8B5054608781446202803D111F8010F2F\r
+:100EBC002028FBD008782C2818BF3F2807D111F820\r
+:100ECC00010F202803D111F8010F2028FBD0084670\r
+:100EDC00009109780026272904D16946401C00F0AE\r
+:100EEC004EF803E000221146F6F702FFDFF824C0AB\r
+:100EFC00DCF80410DCF8002005EB610311F0010FA5\r
+:100F0C001CBF19688A58014618469047002C18BF18\r
+:080F1C002670F8BD2C24010031\r
+:100F240010B50B491446CA68896800EB620012F0D8\r
+:100F3400010F1CBF026851588847002C08BF10BD20\r
+:100F440002462046BDE810400249F6F77DBD000088\r
+:080F54002C24010054280100C7\r
+:040F5C0000F076B873\r
+:0E0F60008269406900290CBFC261826170473E\r
+:0E0F6E00416949698069084018BF0120704739\r
+:0E0F7C0010B500F053F9BDE81040F1F70DBCC0\r
+:100F8A0038B502460078541C0D465C2847D114F83F\r
+:100F9A00010B0021722808BF0D2040D010DC612807\r
+:100FAA0008BF07203BD0622808BF082037D0662830\r
+:100FBA0008BF0C2033D06E2808BF0A202FD019E0B2\r
+:100FCA00742808BF09202AD0762808BF0B2026D00B\r
+:100FDA0078280FD120788DF8000062788DF80120EA\r
+:100FEA008DF80210A41C102200216846F6F781FE33\r
+:100FFA00C0B214E0A0F130020A2A10D28DF8000023\r
+:10100A0020788DF8010062788DF802208DF803109F\r
+:10101A00A41C082200216846F6F76BFEC0B22C60B9\r
+:02102A0038BDCF\r
+:10102C0010B50446007B002808BF10BDA068F1F77E\r
+:0E103C00B7FB206841682046BDE81040084719\r
+:08104C00004870475C2401001C\r
+:10105400002908BF704782681AB9034A13684360BD\r
+:0C106400106081607047000070010010F7\r
+:101070002DE9F041074600680E46C16890461D46BE\r
+:10108000384688470446002E1CBF307800281ED101\r
+:10109000D5B12026206870B102461AA12846F6F77D\r
+:1010A000D5FC054454F8080F28B12846067020687E\r
+:1010B0006D1C0028F0D1606830B105F8016B6168E3\r
+:1010C000384688470446E5E70120BDE8F0812068FE\r
+:1010D00078B13146F6F74FFD38B963682A46414684\r
+:1010E000384698470120BDE8F08154F8080F0028E1\r
+:1010F000EFD16168081C08BFBDE8F0813846884719\r
+:081100000446E4E7257300003A\r
+:1011080070B50A480468002C08BF70BD254664689D\r
+:10111800287B38B1A868F1F745FB1DB128684168FC\r
+:1011280028468847002CF1D170BD000070010010DE\r
+:1011380070B506460B480D46046884B1A06858B1DE\r
+:101148002A463146F6F72EFD30B9A068F6F722FD9B\r
+:10115800A84204BF204670BD6468002CEED1002070\r
+:0811680070BD000070010010D1\r
+:1011700070B504460C20F1F7C3FB0546224602A1D8\r
+:10118000F6F764FC284670BD6F626A253038580057\r
+:10119000002908BF704770B50B480D460468002C45\r
+:1011A00008BF70BD2026207B50B108A12846A26848\r
+:1011B000F6F74CFC05446068002818BF05F8016B81\r
+:1011C0006468002CEFD170BD700100102573000021\r
+:1011D000064A0260002202738160002904BF426057\r
+:1011E000704703490A684260086070478028010020\r
+:0411F000700100107A\r
+:1011F4000A490160816879B1094A1168814204BFD2\r
+:101204004168116008D04A68824203D0114652688E\r
+:101214008242FBD142684A60F1F7C2BA80280100D9\r
+:041224007001001045\r
+:101228000B4901608168002908BF7047094A1168A5\r
+:10123800814202BF4168116070474A68824203D008\r
+:10124800114652688242FBD142684A6070470000EA\r
+:08125800802801007001001064\r
+:1012600010B5084914464A68096800EB620012F09C\r
+:10127000010F1CBF026851588847002C1CBF00207A\r
+:08128000207010BD5424010090\r
+:101288000328BCBF002070470749002201EB8001FA\r
+:1012980051F80C0C41F80C2C002804BF4FF0FF301B\r
+:0C12A80070470168496808471C080010E6\r
+:1012B4000328BCBF00207047064901EB800050F8AA\r
+:1012C4000C0C002804BF4FF0FF3070470168C96858\r
+:0812D400084700001C0800108F\r
+:1012DC002DE9F8430F4605465449F6F746FC544EA3\r
+:1012EC00544CA6F1010888B93146404600F0E6FCA2\r
+:1012FC00012300220821204600F090FC4FF41651E7\r
+:10130C00204600F0A7FB0020BDE8F8834A49284698\r
+:10131C00F6F72BFC88B93146404600F0CFFC012390\r
+:10132C0000220821204600F079FC4FF4165120468B\r
+:10133C0000F090FB0120BDE8F88340492846F6F701\r
+:10134C0014FC88B93146404600F0B8FC0123002259\r
+:10135C000821204600F062FC4FF41651204600F0A4\r
+:10136C0079FB0220BDE8F883DFF8D480002458F81C\r
+:10137C00240018B1641C102CF9D34EE0102C4CD264\r
+:10138C0028783A2809D16A462EA12846F6F77CFB24\r
+:10139C000098002818BF103043E02F283DD1681C5E\r
+:1013AC000546002115F8012B2F2A04D0002A18BF5E\r
+:1013BC00491CF7D10025FFF7B9FE00282DD017F0F6\r
+:1013CC00020F18BF022608D117F0040F18BF012610\r
+:1013DC0003D117F0080618BF092617F00C0F18BF19\r
+:1013EC0046F4007617F0040F18BF46F480664FF0F1\r
+:1013FC00FF333DB9144A1549F1F7FBF9002818BF22\r
+:10140C00103009E0124A1149F1F7F3F928B10168DB\r
+:10141C0032460B692946984718B94FF0FF30BDE8A2\r
+:10142C00F88348F82400E01CBDE8F883842401000C\r
+:10143C0003C0092000C000408B240100932401004C\r
+:10144C001C0800103A257000CC28010090280100DF\r
+:04145C00A8280100BB\r
+:1014600070B50D461446032805DA0B4800F026FC3B\r
+:10147000287001200EE0094901EB800050F80C0CA7\r
+:10148000002804BF4FF0FF3070BD016822468B6812\r
+:1014900029469847201A70BD00C000401C08001063\r
+:1014A00010B503280EDB084A02EB800050F80C0C44\r
+:1014B00028B10268136900229847401C02D14FF0FE\r
+:0C14C000FF3010BD002010BD1C08001003\r
+:1014CC002DE9F0410E46154603280CDA0024002DB8\r
+:1014DC0007D90E4F315D384600F062FC641CAC42FB\r
+:1014EC00F8D328460FE00A4901EB800050F80C0CA9\r
+:1014FC00002804BF4FF0FF30BDE8F08101682A4698\r
+:10150C000B6831469847281ABDE8F08100C00040AE\r
+:04151C001C08001097\r
+:0815200000487047B4240100EB\r
+:1015280070B504460D4600F007F829462069BDE865\r
+:06153800704000F079BDD7\r
+:1015400070B5094D04462868A04208BF70BD00234D\r
+:10155000A2696169206900F03BFCE169206900F043\r
+:0C15600079FC2C6070BD000084010010BC\r
+:10156C0082614161024A00211160FFF7E3BF000074\r
+:04157C0084010010D6\r
+:10158000C161024A00211160FFF7DABF8401001037\r
+:101590002DE9F0410D4616461F460699FFF718FE45\r
+:1015A00004460C4820604FF0FF333A463146284647\r
+:1015B00000F0ACFC08210022074B04F110050FC518\r
+:1015C000134600F005FCE169206900F043FC204669\r
+:0C15D000BDE8F0812429010040420F001A\r
+:0415DC00FFF724BE33\r
+:1015E00070B5044605469AB00E464FF0FF30304ABB\r
+:1015F00000E06D1C29788B5C9B07FAD15F29F8D03D\r
+:10160000291B4FD068222B496846F5F72EF8217820\r
+:10161000502913D160782179A0F13002E078303977\r
+:10162000303809299CBF00EB800001EB400000EB43\r
+:10163000421000F1005000F51C2033E04FF0FF3065\r
+:10164000702912D16178A2783039303A092A9CBFCA\r
+:1016500001EB810102EB41014A1F1A2A3EBF684695\r
+:1016600000EB810050F8140C1CE04C2910D1E178FB\r
+:10167000312908BF104815D0322908BF0F4811D0B2\r
+:10168000332908BF0E480DD0342908BF0D4809E0A2\r
+:10169000552907D1E178522908BF0B4802D05429B7\r
+:1016A00008BF0A48002E18BF35601AB070BD000090\r
+:1016B00097090100EC27010032C0092034C009203D\r
+:1016C00035C0092037C0092003C0092002C0092005\r
+:1016D000F0B583B0054608461446029100F07DF946\r
+:1016E00001900178272907D101A9401CFFF74DFC83\r
+:1016F0000199491C029103E0002202A9F6F7FEFAC3\r
+:101700000646029800F069F9019001780027272920\r
+:1017100004D101A9401CFFF738FC03E00022114668\r
+:10172000F6F7ECFA0A494A6805EB620C12F0010F71\r
+:1017300008BF0B6803D00968DCF800205358024644\r
+:10174000314660469847002C18BF277003B0F0BDA3\r
+:041750009C240100D4\r
+:10175400F8B506460846144600F03DF900900178B5\r
+:101764000025272904D16946401CFFF70CFC03E03F\r
+:1017740000221146F6F7C0FA084AD168926806EBCF\r
+:10178400610311F0010F1CBF19688A5801461846FD\r
+:101794009047002C18BF2570F8BD00009C24010060\r
+:1017A40038B505460846144600F015F9009001784E\r
+:1017B400272904D16946401CFFF7E5FB03E000221A\r
+:1017C4001146F6F799FA0B4A5169126905EB610360\r
+:1017D40011F0010F1CBF19688A580146184690473A\r
+:1017E400002C08BF38BD02462046BDE838400249F7\r
+:0C17F400F6F72AB99C24010054280100DB\r
+:101800002DE9F04F83B08846029000F0E6F802A977\r
+:10181000FFF7E6FE0190029800F0DFF802A9FFF75B\r
+:10182000DFFE8346029800F0D8F802A9FFF7D8FE41\r
+:101830008246029800F0D1F8002701780446B946A4\r
+:10184000222918BF5E4A6AD1651C00212C462878DF\r
+:1018500005E0491C5C2808BF6D1C15F8010F002825\r
+:1018600018BF2228F5D100296BD0481CF1F748F8A1\r
+:1018700007460646AC424ED014F8010B5C2846D110\r
+:1018800014F8010B722808BF0D2040D010DC61282D\r
+:1018900008BF07203BD0622808BF082037D0662841\r
+:1018A00008BF0C2033D06E2808BF0A202FD019E0C3\r
+:1018B000742808BF09202AD0762808BF0B2026D01C\r
+:1018C00078280FD120788DF8000061788DF801100C\r
+:1018D000A41C8DF80290102200216846F6F70EFA3B\r
+:1018E000C0B214E0A0F130010A2910D28DF8000036\r
+:1018F00020788DF8010061788DF80210A41C8DF815\r
+:101900000390082200216846F6F7F8F9C0B206F8FD\r
+:10191000010BAC42B0D186F8009012E0401C017877\r
+:101920008B5C9B07FAD15F29F8D0051B09D0681C96\r
+:10193000F0F7E6FF07462A462146F4F796FE07F839\r
+:1019400005902020F0F7C8FF3946FFF741FC044618\r
+:101950001C4820604FF0FF3352465946019800F072\r
+:10196000D5FA194BC4F81890E361082161614A4621\r
+:101970002061002300F02CFAE169206900F06AFA86\r
+:1019800001202073A06830B92046FFF7F1FB014623\r
+:101990002046FFF75FFBA168B8F1000F04BF03B05A\r
+:1019A000BDE8F08F002902BF88F8009003B0BDE8C1\r
+:1019B000F08F4046F6F7EAF803B0BDE8F08F00007C\r
+:0C19C000970901002429010040420F009B\r
+:0E19CC0010B5FFF72BFCBDE81040F0F7E5BEAC\r
+:1019DA000178202903D110F8011F2029FBD00178B2\r
+:1019EA002C291CBF3F29704710F8011F202918BF56\r
+:0C19FA00704710F8011F2029FBD0704737\r
+:101A080030B44FF0E025D5F8082D0A4BB2F1805FCD\r
+:101A18000BD0D5F808CD00225CF8224043F82240CC\r
+:101A2800521C312AF8DBC5F8083D03EB800001643D\r
+:081A380030BC704700000010F3\r
+:101A4000EFF30980704780F309887047EFF308804F\r
+:101A5000704780F30888704740BA7047C0BA704733\r
+:101A60002DE9F34F89B008460999674BA1F18042EF\r
+:101A7000B2F5404215D0B2F5804F1DD0B2F50C2F13\r
+:101A800040D0B2F5102F48D1D3F8AC1121F4402149\r
+:101A9000C3F8AC11D3F8AC1141F48021C3F8AC11F8\r
+:101AA00016E0D3F8A81121F0C001C3F8A811D3F8AB\r
+:101AB000A81141F0400109E0D3F8A81121F44071C8\r
+:101AC000C3F8A811D3F8A81141F48071C3F8A81184\r
+:101AD0004E49020109680291B1FBF2F302FB1311B6\r
+:101AE0004FF0000A4FF0010B1FFA83F8D14600298E\r
+:101AF0006ED0F4F799FB08904FEA5807CDF80080B4\r
+:101B000001905FE0D3F8AC1121F44031C3F8AC117F\r
+:101B1000D3F8AC1141F48031C0E773223CA140A05E\r
+:101B2000F4F7A5FD01240125012C45D93846F3F72A\r
+:101B3000C1FF0422F3F7F8FD079006910298F4F72D\r
+:101B40006FFBF3F7D9FF059004912046F4F768FB8B\r
+:101B500003902846F4F764FB0399F4F76DFC4FF00B\r
+:101B60007E51F4F7ADFAF3F7C7FF069B079AF4F737\r
+:101B700017F802460B4604990598F4F73BF9F4F779\r
+:101B800049FA01460898F4F799FA0899F4F754FCD1\r
+:101B900020F0004630460199F4F726FD08D221488E\r
+:101BA000B846AA46A34601968642B8BF4FF001093F\r
+:101BB000681CC5B2A542CCD3601CC4B20F2CB2D9EC\r
+:101BC000781C87B20098874298BFB9F1000FA9D05E\r
+:101BD0000998007B40F080010998017309994FEA48\r
+:101BE00018200871099880F8008009994AEA0B10BA\r
+:101BF00081F828000998007B20F080010998017382\r
+:101C00000BB0BDE8F08F000000C00F409401001041\r
+:101C100073657269616C5F6170692E63000000001A\r
+:081C2000300000006F12833A4E\r
+:101C280030B4DFF880C04D1FDCF80040042D07D326\r
+:101C38000A461D492046F4F7FFFE012000F0B8F8D7\r
+:101C4800A1F1050C052A1CD2DFE802F00305080BF8\r
+:101C58000E00002100E00121002207E001210A46D0\r
+:101C680004E00121022201E001210322012B18BF17\r
+:101C7800022B0DD00D492046F4F7DEFE012000F0BE\r
+:101C880097F80B492046F4F7D7FE012000F090F8AA\r
+:101C98005B1E4CEA830343EAC10141EA0211017366\r
+:101CA80030BC7047AC080010BC2501001C260100A0\r
+:041CB800FC25010006\r
+:0C1CBC00017D11F0010FFBD00078704793\r
+:101CC80070B50E4605462B4900F028FA04462A4905\r
+:101CD800304600F023FA0146204600F001FA044697\r
+:101CE800401C07D12D4825A10068F4F7A5FE012066\r
+:101CF80000F05EF8A4F180402949B0F5404004BFE7\r
+:101D0800D1F8C40040F0080016D0B0F5804F04BFE9\r
+:101D1800D1F8C40040F010000ED0B0F50C2F04BF6D\r
+:101D2800D1F8C40040F0807006D0B0F5102F05D16E\r
+:101D3800D1F8C40040F00070C1F8C400012020723E\r
+:101D4800002060604FF416512046FFF785FE0123FE\r
+:101D5800002208212046FFF763FF02220549284692\r
+:101D680000F008FA02220449304600F003FA20463F\r
+:101D780070BD0000E424010050250100536572691C\r
+:101D8800616C2070696E6F7574206D617070696E1A\r
+:101D980067206661696C656400000000AC0800108B\r
+:041DA80000C00F4028\r
+:0C1DAC00027D12F0200FFBD00170704788\r
+:101DB80010B5044600F08EFA002C1CBFBDE8104098\r
+:061DC80000F0AABAFEE7DC\r
+:101DD000D0F804C02CF0020CC0F804C0A1F1040C2F\r
+:101DE000BCF10C0F05D91A49672201F10C00F4F778\r
+:101DF0003EFC032A05D91649682201F12400F4F7B4\r
+:101E000036FC30B4C2F3400C4C1E02F001021CF14F\r
+:101E1000000118BF0121002A18BF0122D0F800C01C\r
+:101E200044EA81116FF30F0C41EAC21141EA0C013F\r
+:101E30000160416821F00D02191C18BF012142EA1E\r
+:101E400081014160416841F00201416030BC70474E\r
+:041E50005027010016\r
+:101E540030B4426822F002024260A0F18042264B74\r
+:101E6400B2F540320FD0B2F5B02F18D1D3F8AC216F\r
+:101E740022F44062C3F8AC21D3F8AC2142F480626E\r
+:101E8400C3F8AC210BE0D3F8A82122F44012C3F824\r
+:101E9400A821D3F8A82142F48012C3F8A821174A34\r
+:101EA40014680222B4FBF2FC9CFBF1F301FB13CC9B\r
+:101EB400BCF1000F18BF5B1CB3F5807F11DC02611D\r
+:101EC40001686FF31721016001686FF0FF0202EBF4\r
+:101ED400032211430160416841F00201416030BCBA\r
+:101EE4007047921CFE2ADDDD064805490068F4F7B8\r
+:101EF400A5FD0120FFF75EFF00C00F409401001014\r
+:081F040028270100AC080010C1\r
+:101F0C002DE9F05F0F46064690461D46374900F016\r
+:101F1C0003F904463649384600F0FEF88146354947\r
+:101F2C00404600F0F9F882463349284600F0F4F8B0\r
+:101F3C0083464946204600F0D1F80446594650469F\r
+:101F4C0000F0CCF80146204600F0C8F80446401CCE\r
+:101F5C0007D1314829A10068F4F76CFD0120FFF787\r
+:101F6C0025FFA4F180402D49B0F5403004BFD1F8D5\r
+:101F7C00C40040F4806006D0B0F5B02F05D1D1F884\r
+:101F8C00C40040F40010C1F8C400681C06D1002342\r
+:101F9C001A4608212046FFF715FF05E00123002211\r
+:101FAC0008212046FFF70EFF1D492046FFF74CFF86\r
+:101FBC00606840F00200606002220C49304600F07C\r
+:101FCC00D7F802220A49384600F0D2F80222094911\r
+:101FDC00404600F0CDF8681C04D002220649284681\r
+:101FEC0000F0C6F82046BDE8F09F00007426010002\r
+:101FFC00B026010038260100EC2601005350492080\r
+:10200C0070696E6F7574206D617070696E67206693\r
+:10201C0061696C6564000000AC08001000C00F40E2\r
+:04202C0040420F001F\r
+:10203000C26812F0020FFBD08160C16811F0040F7A\r
+:06204000FBD08068704730\r
+:10204800421C08BF7047A0F10050A0F51C200309EE\r
+:102058000007C20E074800EB830003684FF0030C2B\r
+:102068000CFA02FC23EA0C0303600368914019434D\r
+:082078000160704700C0024046\r
+:10208000421C08BF704730B4A0F10050A0F51C20DE\r
+:10209000144C420904EB8202956E00F01F0CC1F350\r
+:1020A000800303FA0CFC25EA0C059566956E45EA5B\r
+:1020B0000C0CC2F868C0002B1CBF30BC7047030971\r
+:1020C0000007C20E04EB8300036C4FF0030C0CFA04\r
+:1020D00002FC23EA0C030364036C9140194301647E\r
+:0820E00030BC704700C0024053\r
+:1020E800884208BF7047421C04BF08467047491C15\r
+:1020F80008BF704703A108480068F4F79DFC012059\r
+:10210800FFF756FE70696E6D6170206D69732D6DF5\r
+:0C2118006174636800000000AC08001057\r
+:10212400421C04BF4FF0FF3070470A68521C08D0AD\r
+:102134000A68824204BF4868704751F80C2F521C49\r
+:10214400F6D10C4803A10068F4F778FC0120FFF7EE\r
+:1021540031FE000070696E6D6170206E6F742066D0\r
+:102164006F756E6420666F72207065726970686541\r
+:0821740072616C00AC08001060\r
+:10217C00F0B4431C04BFF0BC70470B685B1C47D029\r
+:10218C000B68834240D1A0F10053A3F51C23451CDE\r
+:10219C0018098C681907C90E214F4FF0030C0CFA63\r
+:1021AC0001FC07EB8000002D09D0056825EA0C0521\r
+:1021BC000560056804FA01F445EA0404046004BFF0\r
+:1021CC00F0BC70474FEA531503F01F0607EB85036D\r
+:1021DC009F6EC2F3800404FA06F527EA05069E6694\r
+:1021EC009E6E46EA05059D66002C1CBFF0BC704730\r
+:1021FC00036C23EA0C030364036C02FA01F143EA57\r
+:10220C0001010164F0BC704751F80C3F5B1CB7D165\r
+:10221C00094804A10068F4F70DFC0120FFF7C6FD86\r
+:10222C0000C00240636F756C64206E6F742070691F\r
+:0C223C006E6F757400000000AC0800100C\r
+:1022480070B5F3F755FC08A253681268F3F7A4FCBD\r
+:10225800F3F7B4FE054600F043F8044600F040F8F2\r
+:10226800001BA842FAD370BD0000000080842E41F4\r
+:1022780070B54FF47A7100FB01F500F031F80446AF\r
+:0C22880000F02EF8001BA842FAD370BD35\r
+:1022940070B50446401C08BF70BD24F01F0504F04F\r
+:1022A4001F00012101FA00F600212046FFF7CAFEB3\r
+:1022B40002212046FFF7E2FE28683043286070BD03\r
+:1022C40020F01F0200F01F00012303FA00F0002990\r
+:0822D4000CBFD061906170475E\r
+:0C22DC0084B069461820ABBE04B0704707\r
+:1022E80070B50A4C0A4D206858B9284600F05AF8CB\r
+:1022F8000849284600F04CF8284600F08DF80120DF\r
+:1023080020602846BDE8704000F084B898010010AD\r
+:082318000040094040420F00A3\r
+:102320002DE9F0411B4C2046FFF7B4FFA51C2846C1\r
+:10233000FFF7B0FFE61C3046FFF7ACFF671D3846DD\r
+:10234000FFF7A8FF01212046FFF7BCFF0021284628\r
+:10235000FFF7B8FF00213046FFF7B4FF01213846F0\r
+:10236000FFF7B0FF9620FFF787FF00212046FFF719\r
+:10237000A9FF01212846FFF7A5FF01213046FFF7FD\r
+:10238000A1FF00213846FFF79DFF9620FFF774FF5D\r
+:08239000D8E7000032C009206B\r
+:10239800034A12689208B2FBF1F1491EC160704706\r
+:0423A800940100108C\r
+:1023AC00184AB0F1402F04BFD2F8C41041F002011A\r
+:1023BC0018D0A0F18041B1F5004104BFD2F8C4108F\r
+:1023CC0041F004010ED0B1F5082F04BFD2F8C410AF\r
+:1023DC0041F4800106D0B1F50C2F05D1D2F8C41010\r
+:1023EC0041F40001C2F8C4100221416000210167D0\r
+:1023FC000549064A09688908B1FBF2F1491EC1601A\r
+:10240C007047000000C00F409401001040420F00C4\r
+:04241C00806870471D\r
+:0C24200081680029FCD101214160704757\r
+:10242C00610F0100000000006F0F010000000000B0\r
+:10243C008B270100AD0E010091270100250F010033\r
+:10244C00000000005D0F01002D10010000000000D5\r
+:10245C00A127010061120100000000000000000033\r
+:10246C00A827010009110100AE27010091110100FC\r
+:10247C0000000000000000002F737464696E002FD0\r
+:10248C007374646F7574002F7374646572720000DA\r
+:10249C006D15010000000000811501000000000016\r
+:1024AC001000000001000000BB270100D116010044\r
+:1024BC00C2270100551701008B270100A517010049\r
+:1024CC00000000005D0F0100D02701000118010081\r
+:1024DC00000000000000000000C0092000C00940FE\r
+:1024EC000200000002C0092000C0004001000000F2\r
+:1024FC000AC0092000800940010000000FC009201B\r
+:10250C00000001400100000019C0092000C0094072\r
+:10251C000300000040C00920000001400200000040\r
+:10252C0048C0092000800940020000009CC009201E\r
+:10253C0000C0094003000000FFFFFFFFFFFFFFFF8B\r
+:10254C000000000001C0092000C00940020000008A\r
+:10255C0003C0092000C00040010000000BC009208E\r
+:10256C00008009400100000010C00920000001405B\r
+:10257C00010000001AC0092000C00940030000003F\r
+:10258C0041C00920000001400200000049C00920A0\r
+:10259C0000800940020000009DC0092000C00940D5\r
+:1025AC0003000000FFFFFFFFFFFFFFFF0000000024\r
+:1025BC00496E76616C6964206E756D626572206F10\r
+:1025CC00662062697473202825642920696E207343\r
+:1025DC00657269616C20666F726D61742C20736812\r
+:1025EC006F756C6420626520352E2E38000000005B\r
+:1025FC00496E76616C69642073657269616C2070D8\r
+:10260C0061726974792073657474696E6700000077\r
+:10261C00496E76616C69642073746F7020626974A2\r
+:10262C0073207370656369666965640007C009206F\r
+:10263C0000000340020000000FC009200080084089\r
+:10264C000200000034C00920008008400300000094\r
+:10265C003FC009200000034002000000FFFFFFFF05\r
+:10266C00FFFFFFFF0000000009C00920000003402D\r
+:10267C00020000000DC00920000003400200000011\r
+:10268C0012C00920008008400200000038C0092058\r
+:10269C000080084003000000FFFFFFFFFFFFFFFF6B\r
+:1026AC000000000008C009200000034002000000E8\r
+:1026BC000CC00920000003400200000011C00920DA\r
+:1026CC00008008400200000037C00920008008404C\r
+:1026DC0003000000FFFFFFFFFFFFFFFF00000000F3\r
+:1026EC0006C0092000000340020000000BC00920B6\r
+:1026FC00000003400200000010C0092000800840C8\r
+:10270C000200000035C009200080084003000000D2\r
+:10271C00FFFFFFFFFFFFFFFF00000000436F756C22\r
+:10272C00646E27742073657475702072657175659D\r
+:10273C007374656420535049206672657175656EBB\r
+:10274C00637900007370695F6170692E630000002B\r
+:10275C0062697473203E3D20342026262062697401\r
+:10276C0073203C3D203136006D6F6465203E3D206A\r
+:0F277C0030202626206D6F6465203C3D20330001\r
+:10278B007772697465007265616400446967697486\r
+:10279B00616C4F75740064656C65746500636C6582\r
+:1027AB006172006F626A65637473004261736500E6\r
+:1027BB00666F726D6174006672657175656E6379B3\r
+:0927CB0000535049006E657700CF\r
+:1027D4000000000058280100A90E01007D0F01002F\r
+:0827E40071100100650E0100F7\r
+:1027EC0009C0092008C0092007C0092006C009201B\r
+:1027FC0000C0092001C0092012C0092011C0092005\r
+:10280C000FC0092010C0092017C0092018C00920CA\r
+:10281C0019C009201AC009203EC009203FC0092058\r
+:10282C0045C0092044C0092043C0092042C00920EA\r
+:10283C0041C0092040C009200BC009200AC0092052\r
+:08284C0005C0092004C00920A9\r
+:03285400256900F3\r
+:0C28580030FC0000642801009028010002\r
+:102864004E346D62656431304469676974616C4FDC\r
+:042874007574450032\r
+:10287800000000009028010029120100F511010054\r
+:08288800711001004D10010068\r
+:08289000B0FB000098280100D4\r
+:0D2898004E346D6265643442617365450025\r
+:0C28A80030FC0000B42801009028010062\r
+:1028B4004E346D626564313446696C655379737462\r
+:0828C400656D4C696B65450070\r
+:1028CC0008FD0000F42801000000000002000000D8\r
+:1028DC009028010002000000EC280100021000000A\r
+:0828EC00B0FB0000052901000A\r
+:1028F4004E346D6265643846696C654C696B654538\r
+:0129040000D2\r
+:102905004E346D626564313046696C6548616E644C\r
+:042915006C654500A8\r
+:10291C000000000038290100DD150100CD1901006F\r
+:0C292C00711001002115010029150100A7\r
+:0C29380030FC0000442901009028010040\r
+:0C2944004E346D62656433535049450009\r
+:0829500098C7FF7F01000000A1\r
+:10295800000000000000000000000000000000006F\r
+:10296800000000000000000000000000000000005F\r
+:10297800000000000000000000000000000000004F\r
+:10298800000000000000000000000000000000003F\r
+:10299800000000000000000000000000000000002F\r
+:1029A800000000000000000000000000000000001F\r
+:1029B800000000000000000000000000000000000F\r
+:1029C80000000000000000000000000000000000FF\r
+:1029D80000000000000000000000000000000000EF\r
+:1029E80000000000000000000000000000000000DF\r
+:1029F80000000000000000000000000000000000CF\r
+:102A080000000000000000000000000000000000BE\r
+:102A180000000000000000000803550053004200B9\r
+:102A280012036D006200650064002E006F007200E2\r
+:102A380067000000120100020000004000000000D2\r
+:102A4800000001020301000006033000310000000D\r
+:102A580004030900160355005300420020004400F7\r
+:102A680045005600490043004500000016033000A9\r
+:102A780031003200330034003500360037003800AA\r
+:102A88003900000009022000010100C064090400A7\r
+:102A980000020806500407058202400000070502EC\r
+:102AA8000240000008034D005300440012034D008B\r
+:102AB80062006500640020004D00530044000000DF\r
+:102AC8000000000078010010B62701006C24010006\r
+:102AD8000000000000000000CC270100D424010001\r
+:102AE8000000000000D8B80500000000D12F000049\r
+:102AF80000000000980A0100B80A0100D80A010085\r
+:102B080000000000000000000000000000000000BD\r
+:102B1800F80A0100000000000000000000000000AA\r
+:102B2800000000000000000000000000000000009D\r
+:102B3800000000000000000000000000000000008D\r
+:102B4800000000000000000000000000000000007D\r
+:102B5800000000000000000000000000000000006D\r
+:102B6800000000000000000000000000000000005D\r
+:102B7800000000000000000000000000000000004D\r
+:102B8800000000000000000000000000000000003D\r
+:102B9800000000000000000000000000000000002D\r
+:102BA800000000000000000000000000000000001D\r
+:102BB800000000000000000000000000000000000D\r
+:102BC80000000000000000000000000000000000FD\r
+:102BD80000000000000000000000000000000000ED\r
+:102BE800A001001000000000000000009402001086\r
+:102BF800940200109C0200109C020010A402001015\r
+:102C0800A4020010AC020010AC020010B4020010C4\r
+:102C1800B4020010BC020010BC020010C402001074\r
+:102C2800C4020010CC020010CC020010D402001024\r
+:102C3800D4020010DC020010DC020010E4020010D4\r
+:102C4800E4020010EC020010EC020010F402001084\r
+:102C5800F4020010FC020010FC0200100403001033\r
+:102C6800040300100C0300100C03001014030010E0\r
+:102C7800140300101C0300101C0300102403001090\r
+:102C8800240300102C0300102C0300103403001040\r
+:102C9800340300103C0300103C03001044030010F0\r
+:102CA800440300104C0300104C03001054030010A0\r
+:102CB800540300105C0300105C0300106403001050\r
+:102CC800640300106C0300106C0300107403001000\r
+:102CD800740300107C0300107C03001084030010B0\r
+:102CE800840300108C0300108C0300109403001060\r
+:102CF800940300109C0300109C030010A403001010\r
+:102D0800A4030010AC030010AC030010B4030010BF\r
+:102D1800B4030010BC030010BC030010C40300106F\r
+:102D2800C4030010CC030010CC030010D40300101F\r
+:102D3800D4030010DC030010DC030010E4030010CF\r
+:102D4800E4030010EC030010EC030010F40300107F\r
+:102D5800F4030010FC030010FC030010040400102E\r
+:102D6800040400100C0400100C04001014040010DB\r
+:102D7800140400101C0400101C040010240400108B\r
+:102D8800240400102C0400102C040010340400103B\r
+:102D9800340400103C0400103C04001044040010EB\r
+:102DA800440400104C0400104C040010540400109B\r
+:102DB800540400105C0400105C040010640400104B\r
+:102DC800640400106C0400106C04001074040010FB\r
+:102DD800740400107C0400107C04001084040010AB\r
+:102DE800840400108C0400108C040010940400105B\r
+:102DF800940400109C0400109C040010A40400100B\r
+:102E0800A4040010AC040010AC040010B4040010BA\r
+:102E1800B4040010BC040010BC040010C40400106A\r
+:102E2800C4040010CC040010CC040010D40400101A\r
+:102E3800D4040010DC040010DC040010E4040010CA\r
+:102E4800E4040010EC040010EC040010F40400107A\r
+:102E5800F4040010FC040010FC0400100405001029\r
+:102E6800040500100C0500100C05001014050010D6\r
+:102E7800140500101C0500101C0500102405001086\r
+:102E8800240500102C0500102C0500103405001036\r
+:102E9800340500103C0500103C05001044050010E6\r
+:102EA800440500104C0500104C0500105405001096\r
+:102EB800540500105C0500105C0500106405001046\r
+:102EC800640500106C0500106C05001074050010F6\r
+:102ED800740500107C0500107C05001084050010A6\r
+:102EE800840500108C0500108C0500109405001056\r
+:102EF800940500109C0500109C050010A405001006\r
+:102F0800A4050010AC050010AC050010B4050010B5\r
+:102F1800B4050010BC050010BC050010C405001065\r
+:102F2800C4050010CC050010CC050010D405001015\r
+:102F3800D4050010DC050010DC050010E4050010C5\r
+:102F4800E4050010EC050010EC050010F405001075\r
+:102F5800F4050010FC050010FC0500100406001024\r
+:102F6800040600100C0600100C06001014060010D1\r
+:102F7800140600101C0600101C0600102406001081\r
+:102F8800240600102C0600102C0600103406001031\r
+:102F9800340600103C0600103C06001044060010E1\r
+:102FA800440600104C0600104C0600105406001091\r
+:102FB800540600105C0600105C0600106406001041\r
+:102FC800640600106C0600106C06001074060010F1\r
+:102FD800740600107C0600107C06001084060010A1\r
+:102FE800840600108C0600108C06001000000200F9\r
+:102FF800FFFFFFFFD80B0100BE05010081FD0000A7\r
+:1030080081FD000081FD000081FD000081FD0000C0\r
+:1030180081FD000081FD000081FD000081FD0000B0\r
+:10302800FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000A6\r
+:10303800415343494900000000000000000000001F\r
+:103048000000000000000000000000000000000078\r
+:1030580001000000FDBC000034000000CEFBFFFFB3\r
+:10306800CB03000001000000000000003500000054\r
+:10307800CEFBFFFFCB0300000100000000000000B2\r
+:04308800C5E9000096\r
+:040000030000268152\r
+:00000001FF\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/.meta b/gcc4mbed/samples/MSTest/USBDevice/.meta
new file mode 100644 (file)
index 0000000..77ff327
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<root>
+  <global/>
+  <data>
+    <created_ts>1326181726</created_ts>
+    <last_mod_ts>1326181726</last_mod_ts>
+    <is_archive>0</is_archive>
+    <is_published>1</is_published>
+    <is_svn>0</is_svn>
+    <is_module>1</is_module>
+    <is_lib>0</is_lib>
+    <url>http://mbed.org/users/samux/libraries/USBDevice</url>
+    <url_full>http://mbed.org/users/samux/libraries/USBDevice/m24owv</url_full>
+    <rev>m24owv</rev>
+  </data>
+</root>
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio.cpp
new file mode 100644 (file)
index 0000000..fd9a1ad
--- /dev/null
@@ -0,0 +1,436 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBAudio.h"\r
+#include "USBBusInterface.h"\r
+#include "USBAudio_Types.h"\r
+\r
+\r
+\r
+USBAudio::USBAudio(uint32_t frequency, uint8_t channel_nb, uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {\r
+    mute = 0;\r
+    volCur = 0x0080;\r
+    volMin = 0x0000;\r
+    volMax = 0x0100;\r
+    volRes = 0x0004;\r
+    available = false;\r
+\r
+    FREQ = frequency;\r
+\r
+    this->channel_nb = channel_nb;\r
+\r
+    // stereo -> *2, mono -> *1\r
+    PACKET_SIZE_ISO = (FREQ / 500) * channel_nb;\r
+\r
+    // STEREO -> left and right\r
+    channel_config = (channel_nb == 1) ? CHANNEL_M : CHANNEL_L + CHANNEL_R;\r
+\r
+    SOF_handler = false;\r
+    \r
+    buf_stream = NULL;\r
+\r
+    // connect the device\r
+    USBDevice::connect();\r
+}\r
+\r
+bool USBAudio::read(uint8_t * buf) {\r
+    buf_stream = buf;\r
+    while (!available);\r
+    available = false;\r
+    buf_stream = NULL;\r
+    return true;\r
+}\r
+\r
+bool USBAudio::readNB(uint8_t * buf) {\r
+    buf_stream = buf;\r
+    SOF_handler = false;\r
+    while (!SOF_handler);\r
+    if (available) {\r
+        available = false;\r
+        buf_stream = NULL;\r
+        return true;\r
+    }\r
+    buf_stream = NULL;\r
+    return false;\r
+}\r
+\r
+\r
+float USBAudio::getVolume() {\r
+    return (mute) ? 0.0 : (float)volCur/(float)volMax;\r
+}\r
+\r
+\r
+// Called in ISR context on each start of frame\r
+void USBAudio::SOF(int frameNumber) {\r
+    uint16_t size = 0;\r
+\r
+    // read the isochronous endpoint\r
+    if (buf_stream != NULL) {\r
+        USBDevice::readEP_NB(EP3OUT, buf_stream, &size, PACKET_SIZE_ISO);\r
+    }\r
+\r
+    // if we read something, modify the flag "available"\r
+    available = (size) ? true : false;\r
+\r
+    // activate readings on the isochronous\r
+    readStart(EP3OUT, PACKET_SIZE_ISO);\r
+\r
+    SOF_handler = true;\r
+}\r
+\r
+\r
+// Called in ISR context\r
+// Set configuration. Return false if the configuration is not supported.\r
+bool USBAudio::USBCallback_setConfiguration(uint8_t configuration) {\r
+    if (configuration != DEFAULT_CONFIGURATION) {\r
+        return false;\r
+    }\r
+\r
+    // Configure isochronous endpoint\r
+    realiseEndpoint(EP3OUT, PACKET_SIZE_ISO, ISOCHRONOUS);\r
+\r
+    // activate readings on this endpoint\r
+    readStart(EP3OUT, PACKET_SIZE_ISO);\r
+    return true;\r
+}\r
+\r
+\r
+// Called in ISR context\r
+// Set alternate setting. Return false if the alternate setting is not supported\r
+bool USBAudio::USBCallback_setInterface(uint16_t interface, uint8_t alternate) {\r
+    if (interface == 0 && alternate == 0) {\r
+        return true;\r
+    }\r
+    if (interface == 1 && (alternate == 0 || alternate == 1)) {\r
+        return true;\r
+    }\r
+    return false;\r
+}\r
+\r
+\r
+\r
+// Called in ISR context\r
+// Called by USBDevice on Endpoint0 request\r
+// This is used to handle extensions to standard requests and class specific requests.\r
+// Return true if class handles this request\r
+bool USBAudio::USBCallback_request() {\r
+    bool success = false;\r
+    CONTROL_TRANSFER * transfer = getTransferPtr();\r
+\r
+    // Process class-specific requests\r
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {\r
+\r
+        // Feature Unit: Interface = 0, ID = 2\r
+        if (transfer->setup.wIndex == 0x0200) {\r
+\r
+            // Master Channel\r
+            if ((transfer->setup.wValue & 0xff) == 0) {\r
+\r
+                switch (transfer->setup.wValue >> 8) {\r
+                    case MUTE_CONTROL:\r
+                        switch (transfer->setup.bRequest) {\r
+                            case REQUEST_GET_CUR:\r
+                                transfer->remaining = 1;\r
+                                transfer->ptr = &mute;\r
+                                transfer->direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;\r
+\r
+                            case REQUEST_SET_CUR:\r
+                                transfer->remaining = 1;\r
+                                transfer->notify = true;\r
+                                transfer->direction = HOST_TO_DEVICE;\r
+                                success = true;\r
+                                break;\r
+                            default:\r
+                                break;\r
+                        }\r
+                        break;\r
+                    case VOLUME_CONTROL:\r
+                        switch (transfer->setup.bRequest) {\r
+                            case REQUEST_GET_CUR:\r
+                                transfer->remaining = 2;\r
+                                transfer->ptr = (uint8_t *)&volCur;\r
+                                transfer->direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;\r
+                            case REQUEST_GET_MIN:\r
+                                transfer->remaining = 2;\r
+                                transfer->ptr = (uint8_t *)&volMin;\r
+                                transfer->direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;\r
+                            case REQUEST_GET_MAX:\r
+                                transfer->remaining = 2;\r
+                                transfer->ptr = (uint8_t *)&volMax;\r
+                                transfer->direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;\r
+                            case REQUEST_GET_RES:\r
+                                transfer->remaining = 2;\r
+                                transfer->ptr = (uint8_t *)&volRes;\r
+                                transfer->direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;\r
+\r
+                            case REQUEST_SET_CUR:\r
+                                transfer->remaining = 2;\r
+                                transfer->notify = true;\r
+                                transfer->direction = HOST_TO_DEVICE;\r
+                                success = true;\r
+                                break;\r
+                            case REQUEST_SET_MIN:\r
+                                transfer->remaining = 2;\r
+                                transfer->notify = true;\r
+                                transfer->direction = HOST_TO_DEVICE;\r
+                                success = true;\r
+                                break;\r
+                            case REQUEST_SET_MAX:\r
+                                transfer->remaining = 2;\r
+                                transfer->notify = true;\r
+                                transfer->direction = HOST_TO_DEVICE;\r
+                                success = true;\r
+                                break;\r
+                            case REQUEST_SET_RES:\r
+                                transfer->remaining = 2;\r
+                                transfer->notify = true;\r
+                                transfer->direction = HOST_TO_DEVICE;\r
+                                success = true;\r
+                                break;\r
+                        }\r
+                        break;\r
+                    default:\r
+                        break;\r
+                }\r
+            }\r
+        }\r
+    }\r
+    return success;\r
+}\r
+\r
+\r
+// Called in ISR context when a data OUT stage has been performed\r
+void USBAudio::USBCallback_requestCompleted(uint8_t * buf, uint16_t length) {\r
+    uint16_t data = *((uint16_t *)buf);\r
+    CONTROL_TRANSFER * transfer = getTransferPtr();\r
+    switch (transfer->setup.wValue >> 8) {\r
+        case MUTE_CONTROL:\r
+            switch (transfer->setup.bRequest) {\r
+                case REQUEST_SET_CUR:\r
+                    mute = data & 0xff;\r
+                    updateVol.call();\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+            break;\r
+        case VOLUME_CONTROL:\r
+            switch (transfer->setup.bRequest) {\r
+                case REQUEST_SET_CUR:\r
+                    volCur = data;\r
+                    updateVol.call();\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+\r
+\r
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \\r
+                               + (3 * INTERFACE_DESCRIPTOR_LENGTH) \\r
+                               + (1 * CONTROL_INTERFACE_DESCRIPTOR_LENGTH) \\r
+                               + (1 * INPUT_TERMINAL_DESCRIPTOR_LENGTH) \\r
+                               + (1 * FEATURE_UNIT_DESCRIPTOR_LENGTH) \\r
+                               + (1 * OUTPUT_TERMINAL_DESCRIPTOR_LENGTH) \\r
+                               + (1 * STREAMING_INTERFACE_DESCRIPTOR_LENGTH) \\r
+                               + (1 * FORMAT_TYPE_I_DESCRIPTOR_LENGTH) \\r
+                               + (1 * (ENDPOINT_DESCRIPTOR_LENGTH + 2)) \\r
+                               + (1 * STREAMING_ENDPOINT_DESCRIPTOR_LENGTH) )\r
+\r
+#define TOTAL_CONTROL_INTF_LENGTH    (CONTROL_INTERFACE_DESCRIPTOR_LENGTH + \\r
+                                      INPUT_TERMINAL_DESCRIPTOR_LENGTH     + \\r
+                                      FEATURE_UNIT_DESCRIPTOR_LENGTH    + \\r
+                                      OUTPUT_TERMINAL_DESCRIPTOR_LENGTH)\r
+\r
+uint8_t * USBAudio::configurationDesc() {\r
+    static uint8_t configDescriptor[] = {\r
+        // Configuration 1\r
+        CONFIGURATION_DESCRIPTOR_LENGTH,        // bLength\r
+        CONFIGURATION_DESCRIPTOR,               // bDescriptorType\r
+        LSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (LSB)\r
+        MSB(TOTAL_DESCRIPTOR_LENGTH),           // wTotalLength (MSB)\r
+        0x02,                                   // bNumInterfaces\r
+        DEFAULT_CONFIGURATION,                  // bConfigurationValue\r
+        0x00,                                   // iConfiguration\r
+        0x80,                                   // bmAttributes\r
+        50,                                     // bMaxPower\r
+\r
+        // Interface 0, Alternate Setting 0, Audio Control\r
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength\r
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType\r
+        0x00,                                   // bInterfaceNumber\r
+        0x00,                                   // bAlternateSetting\r
+        0x00,                                   // bNumEndpoints\r
+        AUDIO_CLASS,                            // bInterfaceClass\r
+        SUBCLASS_AUDIOCONTROL,                  // bInterfaceSubClass\r
+        0x00,                                   // bInterfaceProtocol\r
+        0x00,                                   // iInterface\r
+\r
+\r
+        // Audio Control Interface\r
+        CONTROL_INTERFACE_DESCRIPTOR_LENGTH,    // bLength\r
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType\r
+        CONTROL_HEADER,                         // bDescriptorSubtype\r
+        LSB(0x0100),                            // bcdADC (LSB)\r
+        MSB(0x0100),                            // bcdADC (MSB)\r
+        LSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength\r
+        MSB(TOTAL_CONTROL_INTF_LENGTH),         // wTotalLength\r
+        0x01,                                   // bInCollection\r
+        0x01,                                   // baInterfaceNr\r
+\r
+        // Audio Input Terminal\r
+        INPUT_TERMINAL_DESCRIPTOR_LENGTH,       // bLength\r
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType\r
+        CONTROL_INPUT_TERMINAL,                 // bDescriptorSubtype\r
+        0x01,                                   // bTerminalID\r
+        LSB(TERMINAL_USB_STREAMING),            // wTerminalType\r
+        MSB(TERMINAL_USB_STREAMING),            // wTerminalType\r
+        0x00,                                   // bAssocTerminal\r
+        channel_nb,                             // bNrChannels\r
+        LSB(channel_config),                    // wChannelConfig\r
+        MSB(channel_config),                    // wChannelConfig\r
+        0x00,                                   // iChannelNames\r
+        0x00,                                   // iTerminal\r
+\r
+        // Audio Feature Unit\r
+        FEATURE_UNIT_DESCRIPTOR_LENGTH,         // bLength\r
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType\r
+        CONTROL_FEATURE_UNIT,                   // bDescriptorSubtype\r
+        0x02,                                   // bUnitID\r
+        0x01,                                   // bSourceID\r
+        0x01,                                   // bControlSize\r
+        CONTROL_MUTE |\r
+        CONTROL_VOLUME,                         // bmaControls(0)\r
+        0x00,                                   // bmaControls(1)\r
+        0x00,                                   // iTerminal\r
+\r
+        // Audio Output Terminal\r
+        OUTPUT_TERMINAL_DESCRIPTOR_LENGTH,      // bLength\r
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType\r
+        CONTROL_OUTPUT_TERMINAL,                // bDescriptorSubtype\r
+        0x03,                                   // bTerminalID\r
+        LSB(TERMINAL_SPEAKER),                  // wTerminalType\r
+        MSB(TERMINAL_SPEAKER),                  // wTerminalType\r
+        0x00,                                   // bAssocTerminal\r
+        0x02,                                   // bSourceID\r
+        0x00,                                   // iTerminal\r
+\r
+\r
+        // Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith\r
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength\r
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType\r
+        0x01,                                   // bInterfaceNumber\r
+        0x00,                                   // bAlternateSetting\r
+        0x00,                                   // bNumEndpoints\r
+        AUDIO_CLASS,                            // bInterfaceClass\r
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass\r
+        0x00,                                   // bInterfaceProtocol\r
+        0x00,                                   // iInterface\r
+\r
+        // Interface 1, Alternate Setting 1, Audio Streaming - Operational\r
+        INTERFACE_DESCRIPTOR_LENGTH,            // bLength\r
+        INTERFACE_DESCRIPTOR,                   // bDescriptorType\r
+        0x01,                                   // bInterfaceNumber\r
+        0x01,                                   // bAlternateSetting\r
+        0x01,                                   // bNumEndpoints\r
+        AUDIO_CLASS,                            // bInterfaceClass\r
+        SUBCLASS_AUDIOSTREAMING,                // bInterfaceSubClass\r
+        0x00,                                   // bInterfaceProtocol\r
+        0x00,                                   // iInterface\r
+\r
+        // Audio Streaming Interface\r
+        STREAMING_INTERFACE_DESCRIPTOR_LENGTH,  // bLength\r
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType\r
+        STREAMING_GENERAL,                      // bDescriptorSubtype\r
+        0x01,                                   // bTerminalLink\r
+        0x00,                                   // bDelay\r
+        LSB(FORMAT_PCM),                        // wFormatTag\r
+        MSB(FORMAT_PCM),                        // wFormatTag\r
+\r
+        // Audio Type I Format\r
+        FORMAT_TYPE_I_DESCRIPTOR_LENGTH,        // bLength\r
+        INTERFACE_DESCRIPTOR_TYPE,              // bDescriptorType\r
+        STREAMING_FORMAT_TYPE,                  // bDescriptorSubtype\r
+        FORMAT_TYPE_I,                          // bFormatType\r
+        channel_nb,                             // bNrChannels\r
+        0x02,                                   // bSubFrameSize\r
+        16,                                     // bBitResolution\r
+        0x01,                                   // bSamFreqType\r
+        LSB(FREQ),                              // tSamFreq\r
+        (FREQ >> 8) & 0xff,                     // tSamFreq\r
+        (FREQ >> 16) & 0xff,                    // tSamFreq\r
+\r
+        // Endpoint - Standard Descriptor\r
+        ENDPOINT_DESCRIPTOR_LENGTH + 2,         // bLength\r
+        ENDPOINT_DESCRIPTOR,                    // bDescriptorType\r
+        PHY_TO_DESC(EPISO_OUT),                 // bEndpointAddress\r
+        E_ISOCHRONOUS,                          // bmAttributes\r
+        LSB(PACKET_SIZE_ISO),                   // wMaxPacketSize\r
+        MSB(PACKET_SIZE_ISO),                   // wMaxPacketSize\r
+        0x01,                                   // bInterval\r
+        0x00,                                   // bRefresh\r
+        0x00,                                   // bSynchAddress\r
+\r
+        // Endpoint - Audio Streaming\r
+        STREAMING_ENDPOINT_DESCRIPTOR_LENGTH,   // bLength\r
+        ENDPOINT_DESCRIPTOR_TYPE,               // bDescriptorType\r
+        ENDPOINT_GENERAL,                       // bDescriptor\r
+        0x00,                                   // bmAttributes\r
+        0x00,                                   // bLockDelayUnits\r
+        LSB(0x0000),                            // wLockDelay\r
+        MSB(0x0000),                            // wLockDelay\r
+\r
+        // Terminator\r
+        0                                       // bLength\r
+    };\r
+    return configDescriptor;\r
+}\r
+\r
+uint8_t * USBAudio::stringIinterfaceDesc() {\r
+    static uint8_t stringIinterfaceDescriptor[] = {\r
+        0x0c,                           //bLength\r
+        STRING_DESCRIPTOR,              //bDescriptorType 0x03\r
+        'A',0,'u',0,'d',0,'i',0,'o',0   //bString iInterface - Audio\r
+    };\r
+    return stringIinterfaceDescriptor;\r
+}\r
+\r
+uint8_t * USBAudio::stringIproductDesc() {\r
+    static uint8_t stringIproductDescriptor[] = {\r
+        0x16,                                                       //bLength\r
+        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03\r
+        'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio\r
+    };\r
+    return stringIproductDescriptor;\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio.h b/gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio.h
new file mode 100644 (file)
index 0000000..b923ffb
--- /dev/null
@@ -0,0 +1,239 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef USBAudio_H\r
+#define USBAudio_H\r
+\r
+/* These headers are included for child class. */\r
+#include "USBEndpoints.h"\r
+#include "USBDescriptor.h"\r
+#include "USBDevice_Types.h"\r
+\r
+#include "USBDevice.h"\r
+\r
+\r
+/**\r
+* USBAudio example\r
+*\r
+* #include "mbed.h"\r
+* #include "USBAudio.h"\r
+*\r
+* Serial pc(USBTX, USBRX);\r
+*\r
+* // frequency: 48 kHz\r
+* #define FREQ 48000\r
+*\r
+* // 1 channel: mono\r
+* #define NB_CHA 1\r
+*\r
+* // length of an audio packet: each ms, we receive 48 * 16bits ->48 * 2 bytes. as there is one channel, the length will be 48 * 2 * 1\r
+* #define AUDIO_LENGTH_PACKET 48 * 2 * 1\r
+*\r
+* // USBAudio\r
+* USBAudio audio(FREQ, NB_CHA);\r
+*\r
+* int main() {\r
+*    int16_t buf[AUDIO_LENGTH_PACKET/2];\r
+*    \r
+*    while (1) {\r
+*        // read an audio packet\r
+*        audio.read((uint8_t *)buf);\r
+*\r
+*\r
+*        // print packet received\r
+*        pc.printf("recv: ");\r
+*        for(int i = 0; i < AUDIO_LENGTH_PACKET/2; i++) {\r
+*            pc.printf("%d ", buf[i]);\r
+*        }\r
+*        pc.printf("\r\n");\r
+*    }\r
+* }\r
+* @endcode\r
+*/\r
+class USBAudio: public USBDevice {\r
+public:\r
+\r
+    /**\r
+    * Constructor\r
+    *\r
+    * @param frequency frequency in Hz (default: 48000)\r
+    * @param channel_nb channel number (1 or 2) (default: 1)\r
+    * @param vendor_id Your vendor_id\r
+    * @param product_id Your product_id\r
+    * @param product_release Your preoduct_release\r
+    */\r
+    USBAudio(uint32_t frequency = 48000, uint8_t channel_nb = 1, uint16_t vendor_id = 0x7bb8, uint16_t product_id = 0x1111, uint16_t product_release = 0x0100);\r
+\r
+    /**\r
+    * Get current volume between 0.0 and 1.0\r
+    *\r
+    * @returns volume\r
+    */\r
+    float getVolume();\r
+    \r
+    /**\r
+    * Read an audio packet. warning: blocking\r
+    *\r
+    * @param buf pointer on a buffer which will be filled with an audio packet\r
+    *\r
+    * @returns true if successfull\r
+    */\r
+    bool read(uint8_t * buf);\r
+    \r
+    /**\r
+    * Try to read an audio packet. warning: non blocking\r
+    *\r
+    * @param buf pointer on a buffer which will be filled if an audio packet is available\r
+    *\r
+    * @returns true if successfull\r
+    */\r
+    bool readNB(uint8_t * buf);\r
+    \r
+\r
+    /** attach a handler to update the volume\r
+     *\r
+     * @param function Function to attach\r
+     *\r
+     */\r
+    void attach(void(*fptr)(void)) {\r
+        updateVol.attach(fptr);\r
+    }\r
+\r
+    /** Attach a nonstatic void/void member function to update the volume\r
+     *\r
+     * @param tptr Object pointer\r
+     * @param mptr Member function pointer\r
+     *\r
+     */\r
+    template<typename T>\r
+    void attach(T *tptr, void(T::*mptr)(void)) {\r
+        updateVol.attach(tptr, mptr);\r
+    }\r
+\r
+\r
+protected:\r
+\r
+    /*\r
+    * Called by USBDevice layer. Set configuration of the device.\r
+    * For instance, you can add all endpoints that you need on this function.\r
+    *\r
+    * @param configuration Number of the configuration\r
+    * @returns true if class handles this request\r
+    */\r
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);\r
+\r
+    /*\r
+    * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context\r
+    * This is used to handle extensions to standard requests\r
+    * and class specific requests\r
+    *\r
+    * @returns true if class handles this request\r
+    */\r
+    virtual bool USBCallback_request();\r
+\r
+    /*\r
+    * Get string product descriptor\r
+    *\r
+    * @returns pointer to the string product descriptor\r
+    */\r
+    virtual uint8_t * stringIproductDesc();\r
+\r
+    /*\r
+    * Get string interface descriptor\r
+    *\r
+    * @returns pointer to the string interface descriptor\r
+    */\r
+    virtual uint8_t * stringIinterfaceDesc();\r
+\r
+    /*\r
+    * Get configuration descriptor\r
+    *\r
+    * @returns pointer to the configuration descriptor\r
+    */\r
+    virtual uint8_t * configurationDesc();\r
+\r
+    /*\r
+     * Called by USBDevice layer. Set interface/alternate of the device.\r
+     *\r
+     * @param interface Number of the interface to be configured\r
+     * @param alternate Number of the alternate to be configured\r
+     * @returns true if class handles this request\r
+     */\r
+    virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate);\r
+\r
+    /*\r
+    * Called by USBDevice on Endpoint0 request completion\r
+    * if the 'notify' flag has been set to true. Warning: Called in ISR context\r
+    *\r
+    * In this case it is used to indicate that a HID report has\r
+    * been received from the host on endpoint 0\r
+    *\r
+    * @param buf buffer received on endpoint 0\r
+    * @param length length of this buffer\r
+    */\r
+    virtual void USBCallback_requestCompleted(uint8_t * buf, uint16_t length);\r
+\r
+    /*\r
+    * Callback called on each Start of Frame event\r
+    */\r
+    virtual void SOF(int frameNumber);\r
+\r
+private:\r
+\r
+    // stream available ?\r
+    volatile bool available;\r
+\r
+    // FREQ\r
+    uint32_t FREQ;\r
+\r
+    // size of the maximum packet for the isochronous endpoint\r
+    uint32_t PACKET_SIZE_ISO;\r
+\r
+    // mono, stereo,...\r
+    uint8_t channel_nb;\r
+    \r
+    // channel config: master, left, right\r
+    uint8_t channel_config;\r
+\r
+    // mute state\r
+    uint8_t mute;\r
+\r
+    // Volume Current Value\r
+    uint16_t volCur;\r
+\r
+    // Volume Minimum Value\r
+    uint16_t volMin;\r
+\r
+    // Volume Maximum Value\r
+    uint16_t volMax;\r
+\r
+    // Volume Resolution\r
+    uint16_t volRes;\r
+\r
+    // Buffer containing one audio packet\r
+    uint8_t * buf_stream;\r
+    \r
+    // callback to update volume\r
+    FunctionPointer updateVol;\r
+    \r
+    // boolean showing that the SOF handler has been called. Useful for readNB.\r
+    volatile bool SOF_handler;\r
+\r
+};\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio_Types.h b/gcc4mbed/samples/MSTest/USBDevice/USBAudio/USBAudio_Types.h
new file mode 100644 (file)
index 0000000..c7f7058
--- /dev/null
@@ -0,0 +1,94 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef USBAUDIO_TYPES_H\r
+#define USBAUDIO_TYPES_H\r
+\r
+\r
+#define DEFAULT_CONFIGURATION (1)\r
+\r
+// Audio Request Codes\r
+#define REQUEST_SET_CUR     0x01\r
+#define REQUEST_GET_CUR     0x81\r
+#define REQUEST_SET_MIN     0x02\r
+#define REQUEST_GET_MIN     0x82\r
+#define REQUEST_SET_MAX     0x03\r
+#define REQUEST_GET_MAX     0x83\r
+#define REQUEST_SET_RES     0x04\r
+#define REQUEST_GET_RES     0x84\r
+\r
+#define MUTE_CONTROL        0x01\r
+#define VOLUME_CONTROL      0x02\r
+\r
+\r
+// Audio Descriptor Sizes\r
+#define CONTROL_INTERFACE_DESCRIPTOR_LENGTH       0x09\r
+#define STREAMING_INTERFACE_DESCRIPTOR_LENGTH     0x07\r
+#define INPUT_TERMINAL_DESCRIPTOR_LENGTH          0x0C\r
+#define OUTPUT_TERMINAL_DESCRIPTOR_LENGTH         0x09\r
+#define FEATURE_UNIT_DESCRIPTOR_LENGTH            0x09\r
+#define STREAMING_ENDPOINT_DESCRIPTOR_LENGTH      0x07\r
+\r
+// Audio Format Type Descriptor Sizes\r
+#define FORMAT_TYPE_I_DESCRIPTOR_LENGTH   0x0b\r
+\r
+#define AUDIO_CLASS                       0x01\r
+#define SUBCLASS_AUDIOCONTROL             0x01\r
+#define SUBCLASS_AUDIOSTREAMING           0x02\r
+\r
+// Audio Descriptor Types\r
+#define INTERFACE_DESCRIPTOR_TYPE         0x24\r
+#define ENDPOINT_DESCRIPTOR_TYPE          0x25\r
+\r
+// Audio Control Interface Descriptor Subtypes\r
+#define CONTROL_HEADER                    0x01\r
+#define CONTROL_INPUT_TERMINAL            0x02\r
+#define CONTROL_OUTPUT_TERMINAL           0x03\r
+#define CONTROL_FEATURE_UNIT              0x06\r
+\r
+// USB Terminal Types\r
+#define TERMINAL_USB_STREAMING            0x0101\r
+\r
+// Predefined Audio Channel Configuration Bits\r
+// Mono\r
+#define CHANNEL_M                         0x0000\r
+#define CHANNEL_L                         0x0001  /* Left Front */\r
+#define CHANNEL_R                         0x0002  /* Right Front */\r
+\r
+// Feature Unit Control Bits\r
+#define CONTROL_MUTE                      0x0001\r
+#define CONTROL_VOLUME                    0x0002\r
+\r
+// Output Terminal Types\r
+#define TERMINAL_SPEAKER                  0x0301\r
+#define TERMINAL_HEADPHONES               0x0302\r
+\r
+// Audio Streaming Interface Descriptor Subtypes\r
+#define STREAMING_GENERAL                 0x01\r
+#define STREAMING_FORMAT_TYPE             0x02\r
+\r
+// Audio Data Format Type I Codes\r
+#define FORMAT_PCM                        0x0001\r
+\r
+// Audio Format Types\r
+#define FORMAT_TYPE_I                     0x01\r
+\r
+// Audio Endpoint Descriptor Subtypes\r
+#define ENDPOINT_GENERAL                  0x01\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface.h
new file mode 100644 (file)
index 0000000..9ad02d4
--- /dev/null
@@ -0,0 +1,64 @@
+/* USBBusInterface.h */\r
+/* USB Bus Interface */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#ifndef USBBUSINTERFACE_H\r
+#define USBBUSINTERFACE_H\r
+\r
+#include "mbed.h"\r
+#include "USBEndpoints.h"\r
+\r
+class USBHAL {\r
+public:\r
+    /* Configuration */\r
+    USBHAL();\r
+    ~USBHAL();\r
+    void connect(void);\r
+    void disconnect(void);\r
+    void configureDevice(void);\r
+    void unconfigureDevice(void);\r
+    void setAddress(uint8_t address);\r
+    void remoteWakeup(void);\r
+\r
+    /* Endpoint 0 */\r
+    void EP0setup(uint8_t *buffer);\r
+    void EP0read(void);\r
+    uint32_t EP0getReadResult(uint8_t *buffer);\r
+    void EP0write(uint8_t *buffer, uint32_t size);\r
+    void EP0getWriteResult(void);\r
+    void EP0stall(void);\r
+\r
+    /* Other endpoints */\r
+    EP_STATUS endpointRead(uint8_t endpoint, uint32_t maximumSize);\r
+    EP_STATUS endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead);\r
+    EP_STATUS endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size);\r
+    EP_STATUS endpointWriteResult(uint8_t endpoint);\r
+    void stallEndpoint(uint8_t endpoint);\r
+    void unstallEndpoint(uint8_t endpoint);\r
+    bool realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options);\r
+    bool getEndpointStallState(unsigned char endpoint);\r
+    uint32_t endpointReadcore(uint8_t endpoint, uint8_t *buffer);\r
+    \r
+protected:\r
+    virtual void busReset(void){};\r
+    virtual void EP0setupCallback(void){};\r
+    virtual void EP0out(void){};\r
+    virtual void EP0in(void){};\r
+    virtual void connectStateChanged(unsigned int connected){};\r
+    virtual void suspendStateChanged(unsigned int suspended){};\r
+    virtual void SOF(int frameNumber){};\r
+    virtual bool EP1_OUT_callback(){return false;};\r
+    virtual bool EP1_IN_callback(){return false;};\r
+    virtual bool EP2_OUT_callback(){return false;};\r
+    virtual bool EP2_IN_callback(){return false;};\r
+    virtual bool EP3_OUT_callback(){return false;};\r
+    virtual bool EP3_IN_callback(){return false;};\r
+    \r
+private:\r
+    void usbisr(void);\r
+    static void _usbisr(void);\r
+    static USBHAL * instance;\r
+};\r
+#endif\r
+\r
+\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface_LPC11U.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface_LPC11U.cpp
new file mode 100644 (file)
index 0000000..6b07528
--- /dev/null
@@ -0,0 +1,706 @@
+// USBBusInterface_LPC11U.c\r
+// USB Bus Interface for NXP LPC11Uxx\r
+// Copyright (c) 2011 ARM Limited. All rights reserved.\r
+\r
+// Reference:\r
+// NXP UM10462 LPC11U1x User manual Rev. 1 &#65533; 14 April 2011\r
+\r
+#ifdef TARGET_LPC11U24\r
+\r
+#include "USBBusInterface.h"\r
+\r
+USBHAL * USBHAL::instance;\r
+\r
+\r
+// Valid physical endpoint numbers are 0 to (NUMBER_OF_PHYSICAL_ENDPOINTS-1)\r
+#define LAST_PHYSICAL_ENDPOINT (NUMBER_OF_PHYSICAL_ENDPOINTS-1)\r
+\r
+// Convert physical endpoint number to register bit\r
+#define EP(endpoint) (1UL<<endpoint)\r
+\r
+// Convert physical to logical\r
+#define PHY_TO_LOG(endpoint)    ((endpoint)>>1)\r
+\r
+// Get endpoint direction\r
+#define IN_EP(endpoint)     ((endpoint) & 1U ? true : false)\r
+#define OUT_EP(endpoint)    ((endpoint) & 1U ? false : true)\r
+\r
+// USB RAM\r
+#define USB_RAM_START (0x20004000)\r
+#define USB_RAM_SIZE  (0x00000800)\r
+\r
+// SYSAHBCLKCTRL\r
+#define CLK_USB     (1UL<<14)\r
+#define CLK_USBRAM  (1UL<<27)\r
+\r
+// USB Information register\r
+#define FRAME_NR(a)     ((a) & 0x7ff)   // Frame number\r
+\r
+// USB Device Command/Status register\r
+#define DEV_ADDR_MASK   (0x7f)          // Device address\r
+#define DEV_ADDR(a)     ((a) & DEV_ADDR_MASK)\r
+#define DEV_EN          (1UL<<7)        // Device enable\r
+#define SETUP           (1UL<<8)        // SETUP token received\r
+#define PLL_ON          (1UL<<9)        // PLL enabled in suspend\r
+#define DCON            (1UL<<16)       // Device status - connect\r
+#define DSUS            (1UL<<17)       // Device status - suspend\r
+#define DCON_C          (1UL<<24)       // Connect change\r
+#define DSUS_C          (1UL<<25)       // Suspend change\r
+#define DRES_C          (1UL<<26)       // Reset change\r
+#define VBUSDEBOUNCED   (1UL<<28)       // Vbus detected\r
+\r
+// Endpoint Command/Status list\r
+#define CMDSTS_A                 (1UL<<31)          // Active\r
+#define CMDSTS_D                 (1UL<<30)          // Disable\r
+#define CMDSTS_S                 (1UL<<29)          // Stall\r
+#define CMDSTS_TR                (1UL<<28)          // Toggle Reset\r
+#define CMDSTS_RF                (1UL<<27)          // Rate Feedback mode\r
+#define CMDSTS_TV                (1UL<<27)          // Toggle Value\r
+#define CMDSTS_T                 (1UL<<26)          // Endpoint Type\r
+#define CMDSTS_NBYTES(n)         (((n)&0x3ff)<<16)  // Number of bytes\r
+#define CMDSTS_ADDRESS_OFFSET(a) (((a)>>6)&0xffff)  // Buffer start address\r
+\r
+#define BYTES_REMAINING(s)       (((s)>>16)&0x3ff)  // Bytes remaining after transfer\r
+\r
+// USB Non-endpoint interrupt sources\r
+#define FRAME_INT   (1UL<<30)\r
+#define DEV_INT     (1UL<<31)\r
+\r
+static volatile int epComplete = 0;\r
+\r
+// One entry for a double-buffered logical endpoint in the endpoint\r
+// command/status list. Endpoint 0 is single buffered, out[1] is used\r
+// for the SETUP packet and in[1] is not used\r
+typedef __packed struct {\r
+    uint32_t out[2];\r
+    uint32_t in[2];\r
+} EP_COMMAND_STATUS;\r
+\r
+typedef __packed struct {\r
+    uint8_t out[MAX_PACKET_SIZE_EP0];\r
+    uint8_t in[MAX_PACKET_SIZE_EP0];\r
+    uint8_t setup[SETUP_PACKET_SIZE];\r
+} CONTROL_TRANSFER;\r
+\r
+typedef __packed struct {\r
+    uint32_t    maxPacket;\r
+    uint32_t    buffer[2];\r
+    uint32_t    options;\r
+} EP_STATE;\r
+\r
+static volatile EP_STATE endpointState[NUMBER_OF_PHYSICAL_ENDPOINTS];\r
+\r
+// Pointer to the endpoint command/status list\r
+static EP_COMMAND_STATUS *ep = NULL;\r
+\r
+// Pointer to endpoint 0 data (IN/OUT and SETUP)\r
+static CONTROL_TRANSFER *ct = NULL;\r
+\r
+// Shadow DEVCMDSTAT register to avoid accidentally clearing flags or\r
+// initiating a remote wakeup event.\r
+static volatile uint32_t devCmdStat;\r
+\r
+// Pointers used to allocate USB RAM\r
+static uint32_t usbRamPtr = USB_RAM_START;\r
+static uint32_t epRamPtr = 0; // Buffers for endpoints > 0 start here\r
+\r
+#define ROUND_UP_TO_MULTIPLE(x, m) ((((x)+((m)-1))/(m))*(m))\r
+\r
+void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size);\r
+void USBMemCopy(uint8_t *dst, uint8_t *src, uint32_t size) {\r
+    if (size > 0) {\r
+        do {\r
+            *dst++ = *src++;\r
+        } while (--size > 0);\r
+    }\r
+}\r
+\r
+\r
+USBHAL::USBHAL(void) {\r
+    NVIC_DisableIRQ(USB_IRQn);\r
+\r
+    // nUSB_CONNECT output\r
+    LPC_IOCON->PIO0_6 = 0x00000001;\r
+\r
+    // Enable clocks (USB registers, USB RAM)\r
+    LPC_SYSCON->SYSAHBCLKCTRL |= CLK_USB | CLK_USBRAM;\r
+\r
+    // Ensure device disconnected (DCON not set)\r
+    LPC_USB->DEVCMDSTAT = 0;\r
+\r
+    // to ensure that the USB host sees the device as\r
+    // disconnected if the target CPU is reset.\r
+    wait(0.3);\r
+\r
+    // Reserve space in USB RAM for endpoint command/status list\r
+    // Must be 256 byte aligned\r
+    usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 256);\r
+    ep = (EP_COMMAND_STATUS *)usbRamPtr;\r
+    usbRamPtr += (sizeof(EP_COMMAND_STATUS) * NUMBER_OF_LOGICAL_ENDPOINTS);\r
+    LPC_USB->EPLISTSTART = (uint32_t)(ep) & 0xffffff00;\r
+\r
+    // Reserve space in USB RAM for Endpoint 0\r
+    // Must be 64 byte aligned\r
+    usbRamPtr = ROUND_UP_TO_MULTIPLE(usbRamPtr, 64);\r
+    ct = (CONTROL_TRANSFER *)usbRamPtr;\r
+    usbRamPtr += sizeof(CONTROL_TRANSFER);\r
+    LPC_USB->DATABUFSTART =(uint32_t)(ct) & 0xffc00000;\r
+\r
+    // Setup command/status list for EP0\r
+    ep[0].out[0] = 0;\r
+    ep[0].in[0] =  0;\r
+    ep[0].out[1] = CMDSTS_ADDRESS_OFFSET((uint32_t)ct->setup);\r
+\r
+    // Route all interrupts to IRQ, some can be routed to\r
+    // USB_FIQ if you wish.\r
+    LPC_USB->INTROUTING = 0;\r
+\r
+    // Set device address 0, enable USB device, no remote wakeup\r
+    devCmdStat = DEV_ADDR(0) | DEV_EN | DSUS;\r
+    LPC_USB->DEVCMDSTAT = devCmdStat;\r
+\r
+    // Enable interrupts for device events and EP0\r
+    LPC_USB->INTEN = DEV_INT | EP(EP0IN) | EP(EP0OUT) | FRAME_INT;\r
+    instance = this;\r
+\r
+    //attach IRQ handler and enable interrupts\r
+    NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);\r
+    NVIC_EnableIRQ(USB_IRQn);\r
+}\r
+\r
+USBHAL::~USBHAL(void) {\r
+    // Ensure device disconnected (DCON not set)\r
+    LPC_USB->DEVCMDSTAT = 0;\r
+\r
+    // Disable USB interrupts\r
+    NVIC_DisableIRQ(USB_IRQn);\r
+}\r
+\r
+void USBHAL::connect(void) {\r
+    devCmdStat |= DCON;\r
+    LPC_USB->DEVCMDSTAT = devCmdStat;\r
+}\r
+\r
+void USBHAL::disconnect(void) {\r
+    devCmdStat &= ~DCON;\r
+    LPC_USB->DEVCMDSTAT = devCmdStat;\r
+}\r
+\r
+void USBHAL::configureDevice(void) {\r
+}\r
+\r
+void USBHAL::unconfigureDevice(void) {\r
+}\r
+\r
+void USBHAL::EP0setup(uint8_t *buffer) {\r
+    // Copy setup packet data\r
+    USBMemCopy(buffer, ct->setup, SETUP_PACKET_SIZE);\r
+}\r
+\r
+void USBHAL::EP0read(void) {\r
+    // Start an endpoint 0 read\r
+\r
+    // The USB ISR will call USBDevice_EP0out() when a packet has been read,\r
+    // the USBDevice layer then calls USBBusInterface_EP0getReadResult() to\r
+    // read the data.\r
+\r
+    ep[0].out[0] = CMDSTS_A |CMDSTS_NBYTES(MAX_PACKET_SIZE_EP0) \\r
+                   | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out);\r
+}\r
+\r
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {\r
+    // Complete an endpoint 0 read\r
+    uint32_t bytesRead;\r
+\r
+    // Find how many bytes were read\r
+    bytesRead = MAX_PACKET_SIZE_EP0 - BYTES_REMAINING(ep[0].out[0]);\r
+\r
+    // Copy data\r
+    USBMemCopy(buffer, ct->out, bytesRead);\r
+    return bytesRead;\r
+}\r
+\r
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {\r
+    // Start and endpoint 0 write\r
+\r
+    // The USB ISR will call USBDevice_EP0in() when the data has\r
+    // been written, the USBDevice layer then calls\r
+    // USBBusInterface_EP0getWriteResult() to complete the transaction.\r
+\r
+    // Copy data\r
+    USBMemCopy(ct->in, buffer, size);\r
+\r
+    // Start transfer\r
+    ep[0].in[0] = CMDSTS_A | CMDSTS_NBYTES(size) \\r
+                  | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->in);\r
+}\r
+\r
+\r
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {\r
+    uint8_t bf = 0;\r
+    uint32_t flags = 0;\r
+\r
+    //check which buffer must be filled\r
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {\r
+        // Double buffered\r
+        if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+            bf = 1;\r
+        } else {\r
+            bf = 0;\r
+        }\r
+    }\r
+    \r
+    // if isochronous endpoint, T = 1\r
+    if(endpointState[endpoint].options & ISOCHRONOUS)\r
+    {\r
+        flags |= CMDSTS_T;\r
+    }\r
+        \r
+    //Active the endpoint for reading\r
+    ep[PHY_TO_LOG(endpoint)].out[bf] = CMDSTS_A | CMDSTS_NBYTES(maximumSize) \\r
+                                       | CMDSTS_ADDRESS_OFFSET((uint32_t)ct->out) | flags;\r
+    return EP_PENDING;\r
+}\r
+\r
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t *data, uint32_t *bytesRead) {\r
+\r
+    uint8_t bf = 0;\r
+\r
+    if (!(epComplete & EP(endpoint)))\r
+        return EP_PENDING;\r
+    else {\r
+        epComplete &= ~EP(endpoint);\r
+\r
+        //check which buffer has been filled\r
+        if (LPC_USB->EPBUFCFG & EP(endpoint)) {\r
+            // Double buffered (here we read the previous buffer which was used)\r
+            if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+                bf = 0;\r
+            } else {\r
+                bf = 1;\r
+            }\r
+        }\r
+\r
+        // Find how many bytes were read\r
+        *bytesRead = (uint32_t) (endpointState[endpoint].maxPacket - BYTES_REMAINING(ep[PHY_TO_LOG(endpoint)].out[bf]));\r
+\r
+        // Copy data\r
+        USBMemCopy(data, ct->out, *bytesRead);\r
+        return EP_COMPLETED;\r
+    }\r
+}\r
+\r
+void USBHAL::EP0getWriteResult(void) {\r
+    // Complete an endpoint 0 write\r
+\r
+    // Nothing required for this target\r
+    return;\r
+}\r
+\r
+void USBHAL::EP0stall(void) {\r
+    ep[0].in[0] = CMDSTS_S;\r
+    ep[0].out[0] = CMDSTS_S;\r
+}\r
+\r
+void USBHAL::setAddress(uint8_t address) {\r
+    devCmdStat &= ~DEV_ADDR_MASK;\r
+    devCmdStat |= DEV_ADDR(address);\r
+    LPC_USB->DEVCMDSTAT = devCmdStat;\r
+}\r
+\r
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {\r
+    uint32_t flags = 0;\r
+    uint32_t bf;\r
+\r
+    // Validate parameters\r
+    if (data == NULL) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    if (endpoint > LAST_PHYSICAL_ENDPOINT) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    if ((endpoint==EP0IN) || (endpoint==EP0OUT)) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    if (size > endpointState[endpoint].maxPacket) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {\r
+        // Double buffered\r
+        if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+            bf = 1;\r
+        } else {\r
+            bf = 0;\r
+        }\r
+    } else {\r
+        // Single buffered\r
+        bf = 0;\r
+    }\r
+\r
+    // Check if already active\r
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    // Check if stalled\r
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) {\r
+        return EP_STALLED;\r
+    }\r
+\r
+    // Copy data to USB RAM\r
+    USBMemCopy((uint8_t *)endpointState[endpoint].buffer[bf], data, size);\r
+\r
+    // Add options\r
+    if (endpointState[endpoint].options & RATE_FEEDBACK_MODE) {\r
+        flags |= CMDSTS_RF;\r
+    }\r
+\r
+    if (endpointState[endpoint].options & ISOCHRONOUS) {\r
+        flags |= CMDSTS_T;\r
+    }\r
+\r
+    // Add transfer\r
+    ep[PHY_TO_LOG(endpoint)].in[bf] = CMDSTS_ADDRESS_OFFSET( \\r
+                                      endpointState[endpoint].buffer[bf]) \\r
+                                      | CMDSTS_NBYTES(size) | CMDSTS_A | flags;\r
+\r
+    return EP_PENDING;\r
+}\r
+\r
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {\r
+    uint32_t bf;\r
+    // Validate parameters\r
+\r
+    if (endpoint > LAST_PHYSICAL_ENDPOINT) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    if (OUT_EP(endpoint)) {\r
+        return EP_INVALID;\r
+    }\r
+\r
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {\r
+        // Double buffered     // TODO: FIX THIS\r
+        if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+            bf = 1;\r
+        } else {\r
+            bf = 0;\r
+        }\r
+    } else {\r
+        // Single buffered\r
+        bf = 0;\r
+    }\r
+\r
+    // Check if endpoint still active\r
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_A) {\r
+        return EP_PENDING;\r
+    }\r
+\r
+    // Check if stalled\r
+    if (ep[PHY_TO_LOG(endpoint)].in[bf] & CMDSTS_S) {\r
+        return EP_STALLED;\r
+    }\r
+\r
+    return EP_COMPLETED;\r
+}\r
+\r
+void USBHAL::stallEndpoint(uint8_t endpoint) {\r
+\r
+    // TODO: should this clear active bit?\r
+\r
+    if (IN_EP(endpoint)) {\r
+        ep[PHY_TO_LOG(endpoint)].in[0] |= CMDSTS_S;\r
+        ep[PHY_TO_LOG(endpoint)].in[1] |= CMDSTS_S;\r
+    } else {\r
+        ep[PHY_TO_LOG(endpoint)].out[0] |= CMDSTS_S;\r
+        ep[PHY_TO_LOG(endpoint)].out[1] |= CMDSTS_S;\r
+    }\r
+}\r
+\r
+void USBHAL::unstallEndpoint(uint8_t endpoint) {\r
+    if (LPC_USB->EPBUFCFG & EP(endpoint)) {\r
+        // Double buffered\r
+        if (IN_EP(endpoint)) {\r
+            ep[PHY_TO_LOG(endpoint)].in[0] = 0; // S = 0\r
+            ep[PHY_TO_LOG(endpoint)].in[1] = 0; // S = 0\r
+\r
+            if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+                ep[PHY_TO_LOG(endpoint)].in[1] = CMDSTS_TR; // S =0, TR=1, TV = 0\r
+            } else {\r
+                ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S =0, TR=1, TV = 0\r
+            }\r
+        } else {\r
+            ep[PHY_TO_LOG(endpoint)].out[0] = 0; // S = 0\r
+            ep[PHY_TO_LOG(endpoint)].out[1] = 0; // S = 0\r
+\r
+            if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+                ep[PHY_TO_LOG(endpoint)].out[1] = CMDSTS_TR; // S =0, TR=1, TV = 0\r
+            } else {\r
+                ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S =0, TR=1, TV = 0\r
+            }\r
+        }\r
+    } else {\r
+        // Single buffered\r
+        if (IN_EP(endpoint)) {\r
+            ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S=0, TR=1, TV = 0\r
+        } else {\r
+            ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S=0, TR=1, TV = 0\r
+        }\r
+    }\r
+}\r
+\r
+bool USBHAL::getEndpointStallState(unsigned char endpoint) {\r
+    if (IN_EP(endpoint)) {\r
+        if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+            if (ep[PHY_TO_LOG(endpoint)].in[1] & CMDSTS_S) {\r
+                return true;\r
+            }\r
+        } else {\r
+            if (ep[PHY_TO_LOG(endpoint)].in[0] & CMDSTS_S) {\r
+                return true;\r
+            }\r
+        }\r
+    } else {\r
+        if (LPC_USB->EPINUSE & EP(endpoint)) {\r
+            if (ep[PHY_TO_LOG(endpoint)].out[1] & CMDSTS_S) {\r
+                return true;\r
+            }\r
+        } else {\r
+            if (ep[PHY_TO_LOG(endpoint)].out[0] & CMDSTS_S) {\r
+                return true;\r
+            }\r
+        }\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t options) {\r
+    uint32_t tmpEpRamPtr;\r
+\r
+    if (endpoint > LAST_PHYSICAL_ENDPOINT) {\r
+        return false;\r
+    }\r
+\r
+    // Not applicable to the control endpoints\r
+    if ((endpoint==EP0IN) || (endpoint==EP0OUT)) {\r
+        return false;\r
+    }\r
+\r
+    // Allocate buffers in USB RAM\r
+    tmpEpRamPtr = epRamPtr;\r
+\r
+    // Must be 64 byte aligned\r
+    tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64);\r
+\r
+    if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) {\r
+        // Out of memory\r
+        return false;\r
+    }\r
+\r
+    // Allocate first buffer\r
+    endpointState[endpoint].buffer[0] = tmpEpRamPtr;\r
+    tmpEpRamPtr += maxPacket;\r
+\r
+    if (!(options & SINGLE_BUFFERED)) {\r
+        // Must be 64 byte aligned\r
+        tmpEpRamPtr = ROUND_UP_TO_MULTIPLE(tmpEpRamPtr, 64);\r
+\r
+        if ((tmpEpRamPtr + maxPacket) > (USB_RAM_START + USB_RAM_SIZE)) {\r
+            // Out of memory\r
+            return false;\r
+        }\r
+\r
+        // Allocate second buffer\r
+        endpointState[endpoint].buffer[1] = tmpEpRamPtr;\r
+        tmpEpRamPtr += maxPacket;\r
+    }\r
+\r
+    // Commit to this USB RAM allocation\r
+    epRamPtr = tmpEpRamPtr;\r
+\r
+    // Remaining endpoint state values\r
+    endpointState[endpoint].maxPacket = maxPacket;\r
+    endpointState[endpoint].options = options;\r
+\r
+    // Enable double buffering if required\r
+    if (options & SINGLE_BUFFERED) {\r
+        LPC_USB->EPBUFCFG &= ~EP(endpoint);\r
+    } else {\r
+        // Double buffered\r
+        LPC_USB->EPBUFCFG |= EP(endpoint);\r
+    }\r
+\r
+    // Enable interrupt\r
+    LPC_USB->INTEN |= EP(endpoint);\r
+\r
+    // Enable endpoint\r
+    unstallEndpoint(endpoint);\r
+    return true;\r
+}\r
+\r
+void USBHAL::remoteWakeup(void) {\r
+    // Clearing DSUS bit initiates a remote wakeup if the\r
+    // device is currently enabled and suspended - otherwise\r
+    // it has no effect.\r
+    LPC_USB->DEVCMDSTAT = devCmdStat & ~DSUS;\r
+}\r
+\r
+\r
+static void disableEndpoints(void) {\r
+    uint32_t logEp;\r
+\r
+    // Ref. Table 158 "When a bus reset is received, software\r
+    // must set the disable bit of all endpoints to 1".\r
+\r
+    for (logEp = 1; logEp < NUMBER_OF_LOGICAL_ENDPOINTS; logEp++) {\r
+        ep[logEp].out[0] = CMDSTS_D;\r
+        ep[logEp].out[1] = CMDSTS_D;\r
+        ep[logEp].in[0] =  CMDSTS_D;\r
+        ep[logEp].in[1] =  CMDSTS_D;\r
+    }\r
+\r
+    // Start of USB RAM for endpoints > 0\r
+    epRamPtr = usbRamPtr;\r
+}\r
+\r
+\r
+\r
+void USBHAL::_usbisr(void) {\r
+    instance->usbisr();\r
+}\r
+\r
+\r
+void USBHAL::usbisr(void) {\r
+    // Start of frame\r
+    if (LPC_USB->INTSTAT & FRAME_INT) {\r
+        // Clear SOF interrupt\r
+        LPC_USB->INTSTAT = FRAME_INT;\r
+\r
+        // SOF event, read frame number\r
+        SOF(FRAME_NR(LPC_USB->INFO));\r
+    }\r
+\r
+    // Device state\r
+    if (LPC_USB->INTSTAT & DEV_INT) {\r
+        LPC_USB->INTSTAT = DEV_INT;\r
+\r
+        if (LPC_USB->DEVCMDSTAT & DCON_C) {\r
+            // Connect status changed\r
+            LPC_USB->DEVCMDSTAT = devCmdStat | DCON_C;\r
+\r
+            connectStateChanged((LPC_USB->DEVCMDSTAT & DCON) != 0);\r
+        }\r
+\r
+        if (LPC_USB->DEVCMDSTAT & DSUS_C) {\r
+            // Suspend status changed\r
+            LPC_USB->DEVCMDSTAT = devCmdStat | DSUS_C;\r
+\r
+            suspendStateChanged((LPC_USB->DEVCMDSTAT & DSUS) != 0);\r
+        }\r
+\r
+        if (LPC_USB->DEVCMDSTAT & DRES_C) {\r
+            // Bus reset\r
+            LPC_USB->DEVCMDSTAT = devCmdStat | DRES_C;\r
+\r
+            // Disable endpoints > 0\r
+            disableEndpoints();\r
+\r
+            // Bus reset event\r
+            busReset();\r
+        }\r
+    }\r
+\r
+    // Endpoint 0\r
+    if (LPC_USB->INTSTAT & EP(EP0OUT)) {\r
+        // Clear EP0OUT/SETUP interrupt\r
+        LPC_USB->INTSTAT = EP(EP0OUT);\r
+\r
+        // Check if SETUP\r
+        if (LPC_USB->DEVCMDSTAT & SETUP) {\r
+            // Clear Active and Stall bits for EP0\r
+            // Documentation does not make it clear if we must use the\r
+            // EPSKIP register to achieve this, Fig. 16 and NXP reference\r
+            // code suggests we can just clear the Active bits - check with\r
+            // NXP to be sure.\r
+            ep[0].in[0] = 0;\r
+            ep[0].out[0] = 0;\r
+\r
+            // Clear EP0IN interrupt\r
+            LPC_USB->INTSTAT = EP(EP0IN);\r
+\r
+            // Clear SETUP (and INTONNAK_CI/O) in device status register\r
+            LPC_USB->DEVCMDSTAT = devCmdStat | SETUP;\r
+\r
+            // EP0 SETUP event (SETUP data received)\r
+            EP0setupCallback();\r
+        } else {\r
+            // EP0OUT ACK event (OUT data received)\r
+            EP0out();\r
+        }\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP0IN)) {\r
+        // Clear EP0IN interrupt\r
+        LPC_USB->INTSTAT = EP(EP0IN);\r
+\r
+        // EP0IN ACK event (IN data sent)\r
+        EP0in();\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP1IN)) {\r
+        // Clear EP1IN interrupt\r
+        LPC_USB->INTSTAT = EP(EP1IN);\r
+        epComplete |= EP(EP1IN);\r
+        if (EP1_IN_callback())\r
+            epComplete &= ~EP(EP1IN);\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP1OUT)) {\r
+        // Clear EP1OUT interrupt\r
+        LPC_USB->INTSTAT = EP(EP1OUT);\r
+        epComplete |= EP(EP1OUT);\r
+        if (EP1_OUT_callback())\r
+            epComplete &= ~EP(EP1OUT);\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP2IN)) {\r
+        // Clear EPBULK_IN interrupt\r
+        LPC_USB->INTSTAT = EP(EP2IN);\r
+        epComplete |= EP(EP2IN);\r
+        if (EP2_IN_callback())\r
+            epComplete &= ~EP(EP2IN);\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP2OUT)) {\r
+        // Clear EPBULK_OUT interrupt\r
+        LPC_USB->INTSTAT = EP(EP2OUT);\r
+        epComplete |= EP(EP2OUT);\r
+        //Call callback function. If true, clear epComplete\r
+        if (EP2_OUT_callback())\r
+            epComplete &= ~EP(EP2OUT);\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP3IN)) {\r
+        // Clear EP3_IN interrupt\r
+        LPC_USB->INTSTAT = EP(EP3IN);\r
+        epComplete |= EP(EP3IN);\r
+        if (EP3_IN_callback())\r
+            epComplete &= ~EP(EP3IN);\r
+    }\r
+\r
+    if (LPC_USB->INTSTAT & EP(EP3OUT)) {\r
+        // Clear EP3_OUT interrupt\r
+        LPC_USB->INTSTAT = EP(EP3OUT);\r
+        epComplete |= EP(EP3OUT);\r
+        //Call callback function. If true, clear epComplete\r
+        if (EP3_OUT_callback())\r
+            epComplete &= ~EP(EP3OUT);\r
+    }\r
+}\r
+\r
+#endif
\ No newline at end of file
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface_LPC17_LPC23.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBBusInterface_LPC17_LPC23.cpp
new file mode 100644 (file)
index 0000000..43fc17f
--- /dev/null
@@ -0,0 +1,619 @@
+// USBBusInterface_LPC17_LPC23.c\r
+// USB Bus Interface for NXP LPC1768 and LPC2368\r
+// Copyright (c) 2011 ARM Limited. All rights reserved.\r
+\r
+#ifdef TARGET_LPC1768\r
+\r
+#include "USBBusInterface.h"\r
+\r
+\r
+// Get endpoint direction\r
+#define IN_EP(endpoint)     ((endpoint) & 1U ? true : false)\r
+#define OUT_EP(endpoint)    ((endpoint) & 1U ? false : true)\r
+\r
+// Convert physical endpoint number to register bit\r
+#define EP(endpoint) (1UL<<endpoint)\r
+\r
+// Power Control for Peripherals register\r
+#define PCUSB      (1UL<<31)\r
+\r
+// USB Clock Control register\r
+#define DEV_CLK_EN (1UL<<1)\r
+#define AHB_CLK_EN (1UL<<4)\r
+\r
+// USB Clock Status register\r
+#define DEV_CLK_ON (1UL<<1)\r
+#define AHB_CLK_ON (1UL<<4)\r
+\r
+// USB Device Interupt registers\r
+#define FRAME      (1UL<<0)\r
+#define EP_FAST    (1UL<<1)\r
+#define EP_SLOW    (1UL<<2)\r
+#define DEV_STAT   (1UL<<3)\r
+#define CCEMPTY    (1UL<<4)\r
+#define CDFULL     (1UL<<5)\r
+#define RxENDPKT   (1UL<<6)\r
+#define TxENDPKT   (1UL<<7)\r
+#define EP_RLZED   (1UL<<8)\r
+#define ERR_INT    (1UL<<9)\r
+\r
+// USB Control register\r
+#define RD_EN (1<<0)\r
+#define WR_EN (1<<1)\r
+#define LOG_ENDPOINT(endpoint) ((endpoint>>1)<<2)\r
+\r
+// USB Receive Packet Length register\r
+#define DV      (1UL<<10)\r
+#define PKT_RDY (1UL<<11)\r
+#define PKT_LNGTH_MASK (0x3ff)\r
+\r
+// Serial Interface Engine (SIE)\r
+#define SIE_WRITE   (0x01)\r
+#define SIE_READ    (0x02)\r
+#define SIE_COMMAND (0x05)\r
+#define SIE_CMD_CODE(phase, data) ((phase<<8)|(data<<16))\r
+\r
+// SIE Command codes\r
+#define SIE_CMD_SET_ADDRESS        (0xD0)\r
+#define SIE_CMD_CONFIGURE_DEVICE   (0xD8)\r
+#define SIE_CMD_SET_MODE           (0xF3)\r
+#define SIE_CMD_READ_FRAME_NUMBER  (0xF5)\r
+#define SIE_CMD_READ_TEST_REGISTER (0xFD)\r
+#define SIE_CMD_SET_DEVICE_STATUS  (0xFE)\r
+#define SIE_CMD_GET_DEVICE_STATUS  (0xFE)\r
+#define SIE_CMD_GET_ERROR_CODE     (0xFF)\r
+#define SIE_CMD_READ_ERROR_STATUS  (0xFB)\r
+\r
+#define SIE_CMD_SELECT_ENDPOINT(endpoint)                 (0x00+endpoint)\r
+#define SIE_CMD_SELECT_ENDPOINT_CLEAR_INTERRUPT(endpoint) (0x40+endpoint)\r
+#define SIE_CMD_SET_ENDPOINT_STATUS(endpoint)             (0x40+endpoint)\r
+\r
+#define SIE_CMD_CLEAR_BUFFER    (0xF2)\r
+#define SIE_CMD_VALIDATE_BUFFER (0xFA)\r
+\r
+// SIE Device Status register\r
+#define SIE_DS_CON    (1<<0)\r
+#define SIE_DS_CON_CH (1<<1)\r
+#define SIE_DS_SUS    (1<<2)\r
+#define SIE_DS_SUS_CH (1<<3)\r
+#define SIE_DS_RST    (1<<4)\r
+\r
+// SIE Device Set Address register\r
+#define SIE_DSA_DEV_EN  (1<<7)\r
+\r
+// SIE Configue Device register\r
+#define SIE_CONF_DEVICE (1<<0)\r
+\r
+// Select Endpoint register\r
+#define SIE_SE_FE       (1<<0)\r
+#define SIE_SE_ST       (1<<1)\r
+#define SIE_SE_STP      (1<<2)\r
+#define SIE_SE_PO       (1<<3)\r
+#define SIE_SE_EPN      (1<<4)\r
+#define SIE_SE_B_1_FULL (1<<5)\r
+#define SIE_SE_B_2_FULL (1<<6)\r
+\r
+// Set Endpoint Status command\r
+#define SIE_SES_ST      (1<<0)\r
+#define SIE_SES_DA      (1<<5)\r
+#define SIE_SES_RF_MO   (1<<6)\r
+#define SIE_SES_CND_ST  (1<<7)\r
+\r
+\r
+USBHAL * USBHAL::instance;\r
+\r
+volatile int epComplete;\r
+uint32_t endpointStallState;\r
+\r
+static void SIECommand(uint32_t command) {\r
+    // The command phase of a SIE transaction\r
+    LPC_USB->USBDevIntClr = CCEMPTY;\r
+    LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_COMMAND, command);\r
+    while (!(LPC_USB->USBDevIntSt & CCEMPTY));\r
+}\r
+\r
+static void SIEWriteData(uint8_t data) {\r
+    // The data write phase of a SIE transaction\r
+    LPC_USB->USBDevIntClr = CCEMPTY;\r
+    LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_WRITE, data);\r
+    while (!(LPC_USB->USBDevIntSt & CCEMPTY));\r
+}\r
+\r
+static uint8_t SIEReadData(uint32_t command) {\r
+    // The data read phase of a SIE transaction\r
+    LPC_USB->USBDevIntClr = CDFULL;\r
+    LPC_USB->USBCmdCode = SIE_CMD_CODE(SIE_READ, command);\r
+    while (!(LPC_USB->USBDevIntSt & CDFULL));\r
+    return (uint8_t)LPC_USB->USBCmdData;\r
+}\r
+\r
+static void SIEsetDeviceStatus(uint8_t status) {\r
+    // Write SIE device status register\r
+    SIECommand(SIE_CMD_SET_DEVICE_STATUS);\r
+    SIEWriteData(status);\r
+}\r
+\r
+static uint8_t SIEgetDeviceStatus(void) {\r
+    // Read SIE device status register\r
+    SIECommand(SIE_CMD_GET_DEVICE_STATUS);\r
+    return SIEReadData(SIE_CMD_GET_DEVICE_STATUS);\r
+}\r
+\r
+void SIEsetAddress(uint8_t address) {\r
+    // Write SIE device address register\r
+    SIECommand(SIE_CMD_SET_ADDRESS);\r
+    SIEWriteData((address & 0x7f) | SIE_DSA_DEV_EN);\r
+}\r
+\r
+static uint8_t SIEselectEndpoint(uint8_t endpoint) {\r
+    // SIE select endpoint command\r
+    SIECommand(SIE_CMD_SELECT_ENDPOINT(endpoint));\r
+    return SIEReadData(SIE_CMD_SELECT_ENDPOINT(endpoint));\r
+}\r
+\r
+static uint8_t SIEclearBuffer(void) {\r
+    // SIE clear buffer command\r
+    SIECommand(SIE_CMD_CLEAR_BUFFER);\r
+    return SIEReadData(SIE_CMD_CLEAR_BUFFER);\r
+}\r
+\r
+static void SIEvalidateBuffer(void) {\r
+    // SIE validate buffer command\r
+    SIECommand(SIE_CMD_VALIDATE_BUFFER);\r
+}\r
+\r
+static void SIEsetEndpointStatus(uint8_t endpoint, uint8_t status) {\r
+    // SIE set endpoint status command\r
+    SIECommand(SIE_CMD_SET_ENDPOINT_STATUS(endpoint));\r
+    SIEWriteData(status);\r
+}\r
+\r
+static uint16_t SIEgetFrameNumber(void) __attribute__ ((unused));\r
+static uint16_t SIEgetFrameNumber(void) {\r
+    // Read current frame number\r
+    uint16_t lowByte;\r
+    uint16_t highByte;\r
+\r
+    SIECommand(SIE_CMD_READ_FRAME_NUMBER);\r
+    lowByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);\r
+    highByte = SIEReadData(SIE_CMD_READ_FRAME_NUMBER);\r
+\r
+    return (highByte << 8) | lowByte;\r
+}\r
+\r
+static void SIEconfigureDevice(void) {\r
+    // SIE Configure device command\r
+    SIECommand(SIE_CMD_CONFIGURE_DEVICE);\r
+    SIEWriteData(SIE_CONF_DEVICE);\r
+}\r
+\r
+static void SIEunconfigureDevice(void) {\r
+    // SIE Configure device command\r
+    SIECommand(SIE_CMD_CONFIGURE_DEVICE);\r
+    SIEWriteData(0);\r
+}\r
+\r
+static void SIEconnect(void) {\r
+    // Connect USB device\r
+    uint8_t status;\r
+\r
+    status = SIEgetDeviceStatus();\r
+    SIEsetDeviceStatus(status | SIE_DS_CON);\r
+}\r
+\r
+\r
+static void SIEdisconnect(void) {\r
+    // Disconnect USB device\r
+    uint8_t status;\r
+\r
+    status = SIEgetDeviceStatus();\r
+    SIEsetDeviceStatus(status & ~SIE_DS_CON);\r
+}\r
+\r
+\r
+static uint8_t selectEndpointClearInterrupt(uint8_t endpoint) {\r
+    // Implemented using using EP_INT_CLR.\r
+    LPC_USB->USBEpIntClr = EP(endpoint);\r
+    while (!(LPC_USB->USBDevIntSt & CDFULL));\r
+    return (uint8_t)LPC_USB->USBCmdData;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+static void enableEndpointEvent(uint8_t endpoint) {\r
+    // Enable an endpoint interrupt\r
+    LPC_USB->USBEpIntEn |= EP(endpoint);\r
+}\r
+\r
+static void disableEndpointEvent(uint8_t endpoint) __attribute__ ((unused));\r
+static void disableEndpointEvent(uint8_t endpoint) {\r
+    // Disable an endpoint interrupt\r
+    LPC_USB->USBEpIntEn &= ~EP(endpoint);\r
+}\r
+\r
+static volatile uint32_t __attribute__((used)) dummyRead;\r
+\r
+\r
+uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {\r
+    // Read from an OUT endpoint\r
+    uint32_t size;\r
+    uint32_t i;\r
+    uint32_t data = 0;\r
+    uint8_t offset;\r
+\r
+    LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | RD_EN;\r
+    while (!(LPC_USB->USBRxPLen & PKT_RDY));\r
+\r
+    size = LPC_USB->USBRxPLen & PKT_LNGTH_MASK;\r
+\r
+    offset = 0;\r
+\r
+    if (size > 0) {\r
+        for (i=0; i<size; i++) {\r
+            if (offset==0) {\r
+                // Fetch up to four bytes of data as a word\r
+                data = LPC_USB->USBRxData;\r
+            }\r
+\r
+            // extract a byte\r
+            *buffer = (data>>offset) & 0xff;\r
+            buffer++;\r
+\r
+            // move on to the next byte\r
+            offset = (offset + 8) % 32;\r
+        }\r
+    } else {\r
+        dummyRead = LPC_USB->USBRxData;\r
+    }\r
+\r
+    LPC_USB->USBCtrl = 0;\r
+\r
+    if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {\r
+        SIEselectEndpoint(endpoint);\r
+        SIEclearBuffer();\r
+    }\r
+    \r
+    return size;\r
+}\r
+\r
+static void endpointWritecore(uint8_t endpoint, uint8_t *buffer, uint32_t size) {\r
+    // Write to an IN endpoint\r
+    uint32_t temp, data;\r
+    uint8_t offset;\r
+\r
+    LPC_USB->USBCtrl = LOG_ENDPOINT(endpoint) | WR_EN;\r
+\r
+    LPC_USB->USBTxPLen = size;\r
+    offset = 0;\r
+    data = 0;\r
+\r
+    if (size>0) {\r
+        do {\r
+            // Fetch next data byte into a word-sized temporary variable\r
+            temp = *buffer++;\r
+\r
+            // Add to current data word\r
+            temp = temp << offset;\r
+            data = data | temp;\r
+\r
+            // move on to the next byte\r
+            offset = (offset + 8) % 32;\r
+            size--;\r
+\r
+            if ((offset==0) || (size==0)) {\r
+                // Write the word to the endpoint\r
+                LPC_USB->USBTxData = data;\r
+                data = 0;\r
+            }\r
+        } while (size>0);\r
+    } else {\r
+        LPC_USB->USBTxData = 0;\r
+    }\r
+\r
+    // Clear WR_EN to cover zero length packet case\r
+    LPC_USB->USBCtrl=0;\r
+\r
+    SIEselectEndpoint(endpoint);\r
+    SIEvalidateBuffer();\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+USBHAL::USBHAL(void) {\r
+    // Disable IRQ\r
+    NVIC_DisableIRQ(USB_IRQn);\r
+\r
+    // Enable power to USB device controller\r
+    LPC_SC->PCONP |= PCUSB;\r
+\r
+    // Enable USB clocks\r
+    LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;\r
+    while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));\r
+\r
+    // Configure pins P0.29 and P0.30 to be USB D+ and USB D-\r
+    LPC_PINCON->PINSEL1 &= 0xc3ffffff;\r
+    LPC_PINCON->PINSEL1 |= 0x14000000;\r
+\r
+    // Disconnect USB device\r
+    SIEdisconnect();\r
+\r
+    // Configure pin P2.9 to be Connect\r
+    LPC_PINCON->PINSEL4 &= 0xfffcffff;\r
+    LPC_PINCON->PINSEL4 |= 0x00040000;\r
+\r
+    // Connect must be low for at least 2.5uS\r
+    wait(0.3);\r
+\r
+    // Set the maximum packet size for the control endpoints\r
+    realiseEndpoint(EP0IN, MAX_PACKET_SIZE_EP0, 0);\r
+    realiseEndpoint(EP0OUT, MAX_PACKET_SIZE_EP0, 0);\r
+\r
+    // Attach IRQ\r
+    instance = this;\r
+    NVIC_SetVector(USB_IRQn, (uint32_t)&_usbisr);\r
+    NVIC_EnableIRQ(USB_IRQn);\r
+\r
+    // Enable interrupts for device events and EP0\r
+    LPC_USB->USBDevIntEn = EP_SLOW | DEV_STAT | FRAME;\r
+    enableEndpointEvent(EP0IN);\r
+    enableEndpointEvent(EP0OUT);\r
+}\r
+\r
+USBHAL::~USBHAL(void) {\r
+    // Ensure device disconnected\r
+    SIEdisconnect();\r
+\r
+    // Disable USB interrupts\r
+    NVIC_DisableIRQ(USB_IRQn);\r
+}\r
+\r
+void USBHAL::connect(void) {\r
+    // Connect USB device\r
+    SIEconnect();\r
+}\r
+\r
+void USBHAL::disconnect(void) {\r
+    // Disconnect USB device\r
+    SIEdisconnect();\r
+}\r
+\r
+void USBHAL::configureDevice(void) {\r
+    SIEconfigureDevice();\r
+}\r
+\r
+void USBHAL::unconfigureDevice(void) {\r
+    SIEunconfigureDevice();\r
+}\r
+\r
+void USBHAL::setAddress(uint8_t address) {\r
+    SIEsetAddress(address);\r
+}\r
+\r
+void USBHAL::EP0setup(uint8_t *buffer) {\r
+    endpointReadcore(EP0OUT, buffer);\r
+}\r
+\r
+void USBHAL::EP0read(void) {\r
+    // Not required\r
+}\r
+\r
+uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {\r
+    return endpointReadcore(EP0OUT, buffer);\r
+}\r
+\r
+void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {\r
+    endpointWritecore(EP0IN, buffer, size);\r
+}\r
+\r
+void USBHAL::EP0getWriteResult(void) {\r
+    // Not required\r
+}\r
+\r
+void USBHAL::EP0stall(void) {\r
+    // This will stall both control endpoints\r
+    stallEndpoint(EP0OUT);\r
+}\r
+\r
+EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {\r
+    return EP_PENDING;\r
+}\r
+\r
+EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_t *bytesRead) {\r
+\r
+    //for isochronous endpoint, we don't wait an interrupt\r
+    if ((endpoint >> 1) % 3 || (endpoint >> 1) == 0) {\r
+        if (!(epComplete & EP(endpoint)))\r
+            return EP_PENDING;\r
+    }\r
+    \r
+    *bytesRead = endpointReadcore(endpoint, buffer);\r
+    epComplete &= ~EP(endpoint);\r
+    return EP_COMPLETED;\r
+}\r
+\r
+EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {\r
+    if (getEndpointStallState(endpoint)) {\r
+        return EP_STALLED;\r
+    }\r
+\r
+    epComplete &= ~EP(endpoint);\r
+\r
+    endpointWritecore(endpoint, data, size);\r
+    return EP_PENDING;\r
+}\r
+\r
+EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {\r
+    if (epComplete & EP(endpoint)) {\r
+        epComplete &= ~EP(endpoint);\r
+        return EP_COMPLETED;\r
+    }\r
+\r
+    return EP_PENDING;\r
+}\r
+\r
+bool USBHAL::realiseEndpoint(uint8_t endpoint, uint32_t maxPacket, uint32_t flags) {\r
+    // Realise an endpoint\r
+    LPC_USB->USBDevIntClr = EP_RLZED;\r
+    LPC_USB->USBReEp |= EP(endpoint);\r
+    LPC_USB->USBEpInd = endpoint;\r
+    LPC_USB->USBMaxPSize = maxPacket;\r
+\r
+    while (!(LPC_USB->USBDevIntSt & EP_RLZED));\r
+    LPC_USB->USBDevIntClr = EP_RLZED;\r
+\r
+    // Clear stall state\r
+    endpointStallState &= ~EP(endpoint);\r
+\r
+    enableEndpointEvent(endpoint);\r
+    return true;\r
+}\r
+\r
+void USBHAL::stallEndpoint(uint8_t endpoint) {\r
+    // Stall an endpoint\r
+    if ( (endpoint==EP0IN) || (endpoint==EP0OUT) ) {\r
+        // Conditionally stall both control endpoints\r
+        SIEsetEndpointStatus(EP0OUT, SIE_SES_CND_ST);\r
+    } else {\r
+        SIEsetEndpointStatus(endpoint, SIE_SES_ST);\r
+\r
+        // Update stall state\r
+        endpointStallState |= EP(endpoint);\r
+    }\r
+}\r
+\r
+void USBHAL::unstallEndpoint(uint8_t endpoint) {\r
+    // Unstall an endpoint. The endpoint will also be reinitialised\r
+    SIEsetEndpointStatus(endpoint, 0);\r
+\r
+    // Update stall state\r
+    endpointStallState &= ~EP(endpoint);\r
+}\r
+\r
+bool USBHAL::getEndpointStallState(uint8_t endpoint) {\r
+    // Returns true if endpoint stalled\r
+    return endpointStallState & EP(endpoint);\r
+}\r
+\r
+void USBHAL::remoteWakeup(void) {\r
+    // Remote wakeup\r
+    uint8_t status;\r
+\r
+    // Enable USB clocks\r
+    LPC_USB->USBClkCtrl |= DEV_CLK_EN | AHB_CLK_EN;\r
+    while (LPC_USB->USBClkSt != (DEV_CLK_ON | AHB_CLK_ON));\r
+\r
+    status = SIEgetDeviceStatus();\r
+    SIEsetDeviceStatus(status & ~SIE_DS_SUS);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+void USBHAL::_usbisr(void) {\r
+    instance->usbisr();\r
+}\r
+\r
+\r
+void USBHAL::usbisr(void) {\r
+    uint8_t devStat;\r
+\r
+    if (LPC_USB->USBDevIntSt & FRAME) {\r
+        // Start of frame event\r
+        SOF(SIEgetFrameNumber());\r
+        // Clear interrupt status flag\r
+        LPC_USB->USBDevIntClr = FRAME;\r
+    }\r
+\r
+    if (LPC_USB->USBDevIntSt & DEV_STAT) {\r
+        // Device Status interrupt\r
+        // Must clear the interrupt status flag before reading the device status from the SIE\r
+        LPC_USB->USBDevIntClr = DEV_STAT;\r
+\r
+        // Read device status from SIE\r
+        devStat = SIEgetDeviceStatus();\r
+\r
+        if (devStat & SIE_DS_RST) {\r
+            // Bus reset\r
+            busReset();\r
+        }\r
+    }\r
+\r
+    if (LPC_USB->USBDevIntSt & EP_SLOW) {\r
+        // (Slow) Endpoint Interrupt\r
+\r
+        // Process each endpoint interrupt\r
+        if (LPC_USB->USBEpIntSt & EP(EP0OUT)) {\r
+            if (selectEndpointClearInterrupt(EP0OUT) & SIE_SE_STP) {\r
+                // this is a setup packet\r
+                EP0setupCallback();\r
+            } else {\r
+                EP0out();\r
+            }\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+        }\r
+\r
+        if (LPC_USB->USBEpIntSt & EP(EP0IN)) {\r
+            selectEndpointClearInterrupt(EP0IN);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            EP0in();\r
+        }\r
+\r
+        // TODO: This should cover all endpoints, not just EP1,2,3:\r
+        if (LPC_USB->USBEpIntSt & EP(EP1IN)) {\r
+            selectEndpointClearInterrupt(EP1IN);\r
+            epComplete |= EP(EP1IN);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            if (EP1_IN_callback())\r
+                epComplete &= ~EP(EP1IN);\r
+        }\r
+\r
+        if (LPC_USB->USBEpIntSt & EP(EP1OUT)) {\r
+            selectEndpointClearInterrupt(EP1OUT);\r
+            epComplete |= EP(EP1OUT);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            if (EP1_OUT_callback())\r
+                epComplete &= ~EP(EP1OUT);\r
+        }\r
+\r
+        if (LPC_USB->USBEpIntSt & EP(EP2IN)) {\r
+            selectEndpointClearInterrupt(EP2IN);\r
+            epComplete |= EP(EP2IN);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            if (EP2_IN_callback())\r
+                epComplete &= ~EP(EP2IN);\r
+        }\r
+\r
+        if (LPC_USB->USBEpIntSt & EP(EP2OUT)) {\r
+            selectEndpointClearInterrupt(EP2OUT);\r
+            epComplete |= EP(EP2OUT);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            if (EP2_OUT_callback())\r
+                epComplete &= ~EP(EP2OUT);\r
+        }\r
+\r
+        if (LPC_USB->USBEpIntSt & EP(EP3IN)) {\r
+            selectEndpointClearInterrupt(EP3IN);\r
+            epComplete |= EP(EP3IN);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            if (EP3_IN_callback())\r
+                epComplete &= ~EP(EP3IN);\r
+        }\r
+\r
+        if (LPC_USB->USBEpIntSt & EP(EP3OUT)) {\r
+            selectEndpointClearInterrupt(EP3OUT);\r
+            epComplete |= EP(EP3OUT);\r
+            LPC_USB->USBDevIntClr = EP_SLOW;\r
+            if (EP3_OUT_callback())\r
+                epComplete &= ~EP(EP3OUT);\r
+        }\r
+    }\r
+}\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDescriptor.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDescriptor.h
new file mode 100644 (file)
index 0000000..8d8073b
--- /dev/null
@@ -0,0 +1,60 @@
+/* USBDescriptor.h */\r
+/* Definitions and macros for constructing USB descriptors */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+/* Standard descriptor types */\r
+#define DEVICE_DESCRIPTOR        (1)\r
+#define CONFIGURATION_DESCRIPTOR (2)\r
+#define STRING_DESCRIPTOR        (3)\r
+#define INTERFACE_DESCRIPTOR     (4)\r
+#define ENDPOINT_DESCRIPTOR      (5)\r
+#define QUALIFIER_DESCRIPTOR     (6)\r
+\r
+/* Standard descriptor lengths */\r
+#define DEVICE_DESCRIPTOR_LENGTH        (0x12)\r
+#define CONFIGURATION_DESCRIPTOR_LENGTH (0x09)\r
+#define INTERFACE_DESCRIPTOR_LENGTH     (0x09)\r
+#define ENDPOINT_DESCRIPTOR_LENGTH      (0x07)\r
+\r
+\r
+/*string offset*/\r
+#define STRING_OFFSET_LANGID            (0) \r
+#define STRING_OFFSET_IMANUFACTURER     (1)\r
+#define STRING_OFFSET_IPRODUCT          (2)\r
+#define STRING_OFFSET_ISERIAL           (3)\r
+#define STRING_OFFSET_ICONFIGURATION    (4)\r
+#define STRING_OFFSET_IINTERFACE        (5)\r
+\r
+/* USB Specification Release Number */\r
+#define USB_VERSION_2_0 (0x0200)\r
+\r
+/* Least/Most significant byte of short integer */\r
+#define LSB(n)  ((n)&0xff)\r
+#define MSB(n)  (((n)&0xff00)>>8)\r
+\r
+/* Convert physical endpoint number to descriptor endpoint number */\r
+#define PHY_TO_DESC(endpoint) (((endpoint)>>1) | (((endpoint) & 1) ? 0x80:0))\r
+\r
+/* bmAttributes in configuration descriptor */\r
+/* C_RESERVED must always be set */\r
+#define C_RESERVED      (1U<<7)\r
+#define C_SELF_POWERED  (1U<<6)\r
+#define C_REMOTE_WAKEUP (1U<<5)\r
+\r
+/* bMaxPower in configuration descriptor */\r
+#define C_POWER(mA)     ((mA)/2)\r
+\r
+/* bmAttributes in endpoint descriptor */\r
+#define E_CONTROL       (0x00)\r
+#define E_ISOCHRONOUS   (0x01)\r
+#define E_BULK          (0x02)\r
+#define E_INTERRUPT     (0x03)\r
+\r
+/* For isochronous endpoints only: */\r
+#define E_NO_SYNCHRONIZATION    (0x00)\r
+#define E_ASYNCHRONOUS          (0x04)\r
+#define E_ADAPTIVE              (0x08)\r
+#define E_SYNCHRONOUS           (0x0C)\r
+#define E_DATA                  (0x00)\r
+#define E_FEEDBACK              (0x10)\r
+#define E_IMPLICIT_FEEDBACK     (0x20)\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice.cpp
new file mode 100644 (file)
index 0000000..1663f77
--- /dev/null
@@ -0,0 +1,911 @@
+/* USBDevice.c */\r
+/* Generic USB device */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+/* Reference: */\r
+/* Universal Serial Bus Specification Revision 2.0, Chapter 9 "USB Device Framework" */\r
+\r
+#include "stdint.h"\r
+\r
+#include "USBEndpoints.h"\r
+#include "USBDevice.h"\r
+#include "USBDescriptor.h"\r
+#include "USBHID_Types.h"\r
+\r
+\r
+/* Device status */\r
+#define DEVICE_STATUS_SELF_POWERED  (1U<<0)\r
+#define DEVICE_STATUS_REMOTE_WAKEUP (1U<<1)\r
+\r
+/* Endpoint status */\r
+#define ENDPOINT_STATUS_HALT        (1U<<0)\r
+\r
+/* Standard feature selectors */\r
+#define DEVICE_REMOTE_WAKEUP        (1)\r
+#define ENDPOINT_HALT               (0)\r
+\r
+/* Macro to convert wIndex endpoint number to physical endpoint number */\r
+#define WINDEX_TO_PHYSICAL(endpoint) (((endpoint & 0x0f) << 1) + \\r
+    ((endpoint & 0x80) ? 1 : 0))\r
+\r
+\r
+bool USBDevice::requestGetDescriptor(void)\r
+{\r
+    bool success = false;\r
+\r
+    switch (DESCRIPTOR_TYPE(transfer.setup.wValue))\r
+    {\r
+        case DEVICE_DESCRIPTOR:\r
+            if (deviceDesc() != NULL)\r
+            {\r
+                if ((deviceDesc()[0] == DEVICE_DESCRIPTOR_LENGTH) \\r
+                    && (deviceDesc()[1] == DEVICE_DESCRIPTOR))\r
+                {\r
+                    transfer.remaining = DEVICE_DESCRIPTOR_LENGTH;\r
+                    transfer.ptr = deviceDesc();\r
+                    transfer.direction = DEVICE_TO_HOST;\r
+                    success = true;\r
+                }\r
+            }\r
+            break;\r
+        case CONFIGURATION_DESCRIPTOR:\r
+            if (configurationDesc() != NULL)\r
+            {\r
+                if ((configurationDesc()[0] == CONFIGURATION_DESCRIPTOR_LENGTH) \\r
+                    && (configurationDesc()[1] == CONFIGURATION_DESCRIPTOR))\r
+                {\r
+                    /* Get wTotalLength */\r
+                    transfer.remaining = configurationDesc()[2] \\r
+                        | (configurationDesc()[3] << 8);\r
+\r
+                    transfer.ptr = configurationDesc();\r
+                    transfer.direction = DEVICE_TO_HOST;\r
+                    success = true;\r
+                }\r
+            }\r
+            break;\r
+        case STRING_DESCRIPTOR:\r
+            switch (DESCRIPTOR_INDEX(transfer.setup.wValue))\r
+            {\r
+                            case STRING_OFFSET_LANGID:\r
+                                transfer.remaining = stringLangidDesc()[0];\r
+                                transfer.ptr = stringLangidDesc();\r
+                                transfer.direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;\r
+                            case STRING_OFFSET_IMANUFACTURER:\r
+                                transfer.remaining =  stringImanufacturerDesc()[0];\r
+                                transfer.ptr = stringImanufacturerDesc();\r
+                                transfer.direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;       \r
+                            case STRING_OFFSET_IPRODUCT:\r
+                                transfer.remaining = stringIproductDesc()[0];\r
+                                transfer.ptr = stringIproductDesc();\r
+                                transfer.direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;            \r
+                            case STRING_OFFSET_ISERIAL:\r
+                                transfer.remaining = stringIserialDesc()[0];\r
+                                transfer.ptr = stringIserialDesc();\r
+                                transfer.direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break;        \r
+                            case STRING_OFFSET_ICONFIGURATION:\r
+                                transfer.remaining = stringIConfigurationDesc()[0];\r
+                                transfer.ptr = stringIConfigurationDesc();\r
+                                transfer.direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break; \r
+                            case STRING_OFFSET_IINTERFACE:\r
+                                transfer.remaining = stringIinterfaceDesc()[0];\r
+                                transfer.ptr = stringIinterfaceDesc();\r
+                                transfer.direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                                break; \r
+            }\r
+            break;\r
+        case INTERFACE_DESCRIPTOR:\r
+        case ENDPOINT_DESCRIPTOR:\r
+            /* TODO: Support is optional, not implemented here */\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+void USBDevice::decodeSetupPacket(uint8_t *data, SETUP_PACKET *packet)\r
+{\r
+    /* Fill in the elements of a SETUP_PACKET structure from raw data */\r
+    packet->bmRequestType.dataTransferDirection = (data[0] & 0x80) >> 7;\r
+    packet->bmRequestType.Type = (data[0] & 0x60) >> 5;\r
+    packet->bmRequestType.Recipient = data[0] & 0x1f;\r
+    packet->bRequest = data[1];\r
+    packet->wValue = (data[2] | (uint16_t)data[3] << 8);\r
+    packet->wIndex = (data[4] | (uint16_t)data[5] << 8);\r
+    packet->wLength = (data[6] | (uint16_t)data[7] << 8);\r
+}\r
+\r
+\r
+bool USBDevice::controlOut(void)\r
+{\r
+    /* Control transfer data OUT stage */\r
+    uint8_t buffer[MAX_PACKET_SIZE_EP0];\r
+    uint32_t packetSize;\r
+\r
+    /* Check we should be transferring data OUT */\r
+    if (transfer.direction != HOST_TO_DEVICE)\r
+    {\r
+        return false;\r
+    }\r
+\r
+    /* Read from endpoint */\r
+    packetSize = EP0getReadResult(buffer);\r
+\r
+    /* Check if transfer size is valid */\r
+    if (packetSize > transfer.remaining)\r
+    {\r
+        /* Too big */\r
+        return false;\r
+    }\r
+\r
+    /* Update transfer */\r
+    transfer.ptr += packetSize;\r
+    transfer.remaining -= packetSize;\r
+\r
+    /* Check if transfer has completed */\r
+    if (transfer.remaining == 0)\r
+    {\r
+        /* Transfer completed */\r
+        if (transfer.notify)\r
+        {\r
+            /* Notify class layer. */\r
+            USBCallback_requestCompleted(buffer, packetSize);\r
+            transfer.notify = false;\r
+        }\r
+        /* Status stage */\r
+        EP0write(NULL, 0);\r
+    }\r
+    else\r
+    {\r
+        EP0read();\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+bool USBDevice::controlIn(void)\r
+{\r
+    /* Control transfer data IN stage */\r
+    uint32_t packetSize;\r
+\r
+    /* Check if transfer has completed (status stage transactions */\r
+    /* also have transfer.remaining == 0) */\r
+    if (transfer.remaining == 0)\r
+    {\r
+        if (transfer.zlp)\r
+        {\r
+            /* Send zero length packet */\r
+            EP0write(NULL, 0);\r
+            transfer.zlp = false;\r
+        }\r
+\r
+        /* Transfer completed */\r
+        if (transfer.notify)\r
+        {\r
+            /* Notify class layer. */\r
+            USBCallback_requestCompleted(NULL, 0);\r
+            transfer.notify = false;\r
+        }\r
+\r
+        EP0read();\r
+\r
+        /* Completed */\r
+        return true;\r
+    }\r
+\r
+    /* Check we should be transferring data IN */\r
+    if (transfer.direction != DEVICE_TO_HOST)\r
+    {\r
+        return false;\r
+    }\r
+\r
+    packetSize = transfer.remaining;\r
+\r
+    if (packetSize > MAX_PACKET_SIZE_EP0)\r
+    {\r
+        packetSize = MAX_PACKET_SIZE_EP0;\r
+    }\r
+\r
+    /* Write to endpoint */\r
+    EP0write(transfer.ptr, packetSize);\r
+\r
+    /* Update transfer */\r
+    transfer.ptr += packetSize;\r
+    transfer.remaining -= packetSize;\r
+\r
+    return true;\r
+}\r
+\r
+bool USBDevice::requestSetAddress(void)\r
+{\r
+    /* Set the device address */\r
+    setAddress(transfer.setup.wValue);\r
+\r
+    if (transfer.setup.wValue == 0)\r
+    {\r
+        device.state = DEFAULT;\r
+    }\r
+    else\r
+    {\r
+        device.state = ADDRESS;\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+bool USBDevice::requestSetConfiguration(void)\r
+{\r
+\r
+    device.configuration = transfer.setup.wValue;\r
+    /* Set the device configuration */\r
+    if (device.configuration == 0)\r
+    {\r
+        /* Not configured */\r
+        unconfigureDevice();\r
+        device.state = ADDRESS;\r
+    }\r
+    else\r
+    {\r
+        if (USBCallback_setConfiguration(device.configuration))\r
+        {\r
+            /* Valid configuration */\r
+            configureDevice();\r
+            device.state = CONFIGURED;\r
+        }\r
+        else\r
+        {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+bool USBDevice::requestGetConfiguration(void)\r
+{\r
+    /* Send the device configuration */\r
+    transfer.ptr = &device.configuration;\r
+    transfer.remaining = sizeof(device.configuration);\r
+    transfer.direction = DEVICE_TO_HOST;\r
+    return true;\r
+}\r
+\r
+bool USBDevice::requestGetInterface(void)\r
+{\r
+    /* Return the selected alternate setting for an interface */\r
+\r
+    if (device.state != CONFIGURED)\r
+    {\r
+        return false;\r
+    }\r
+\r
+    /* Send the alternate setting */\r
+    transfer.setup.wIndex = currentInterface;\r
+    transfer.ptr = &currentAlternate;\r
+    transfer.remaining = sizeof(currentAlternate);\r
+    transfer.direction = DEVICE_TO_HOST;\r
+    return true;\r
+}\r
+\r
+bool USBDevice::requestSetInterface(void)\r
+{\r
+    bool success = false;\r
+    if(USBCallback_setInterface(transfer.setup.wIndex, transfer.setup.wValue))\r
+    {\r
+        success = true;\r
+        currentInterface = transfer.setup.wIndex;\r
+        currentAlternate = transfer.setup.wValue;       \r
+    }\r
+    return success;\r
+}\r
+\r
+bool USBDevice::requestSetFeature()\r
+{\r
+    bool success = false;\r
+\r
+    if (device.state != CONFIGURED)\r
+    {\r
+        /* Endpoint or interface must be zero */\r
+        if (transfer.setup.wIndex != 0)\r
+        {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    switch (transfer.setup.bmRequestType.Recipient)\r
+    {\r
+        case DEVICE_RECIPIENT:\r
+            /* TODO: Remote wakeup feature not supported */\r
+            break;\r
+        case ENDPOINT_RECIPIENT:\r
+            if (transfer.setup.wValue == ENDPOINT_HALT)\r
+            {\r
+                /* TODO: We should check that the endpoint number is valid */\r
+                stallEndpoint(\r
+                    WINDEX_TO_PHYSICAL(transfer.setup.wIndex));\r
+                success = true;\r
+            }\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+bool USBDevice::requestClearFeature()\r
+{\r
+    bool success = false;\r
+\r
+    if (device.state != CONFIGURED)\r
+    {\r
+        /* Endpoint or interface must be zero */\r
+        if (transfer.setup.wIndex != 0)\r
+        {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    switch (transfer.setup.bmRequestType.Recipient)\r
+    {\r
+        case DEVICE_RECIPIENT:\r
+            /* TODO: Remote wakeup feature not supported */\r
+            break;\r
+        case ENDPOINT_RECIPIENT:\r
+            /* TODO: We should check that the endpoint number is valid */\r
+            if (transfer.setup.wValue == ENDPOINT_HALT)\r
+            {\r
+                unstallEndpoint( WINDEX_TO_PHYSICAL(transfer.setup.wIndex));\r
+                success = true;\r
+            }\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+bool USBDevice::requestGetStatus(void)\r
+{\r
+    static uint16_t status;\r
+    bool success = false;\r
+\r
+    if (device.state != CONFIGURED)\r
+    {\r
+        /* Endpoint or interface must be zero */\r
+        if (transfer.setup.wIndex != 0)\r
+        {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    switch (transfer.setup.bmRequestType.Recipient)\r
+    {\r
+        case DEVICE_RECIPIENT:\r
+            /* TODO: Currently only supports self powered devices */\r
+            status = DEVICE_STATUS_SELF_POWERED;\r
+            success = true;\r
+            break;\r
+        case INTERFACE_RECIPIENT:\r
+            status = 0;\r
+            success = true;\r
+            break;\r
+        case ENDPOINT_RECIPIENT:\r
+            /* TODO: We should check that the endpoint number is valid */\r
+            if (getEndpointStallState(\r
+                WINDEX_TO_PHYSICAL(transfer.setup.wIndex)))\r
+            {\r
+                status = ENDPOINT_STATUS_HALT;\r
+            }\r
+            else\r
+            {\r
+                status = 0;\r
+            }\r
+            success = true;\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+\r
+    if (success)\r
+    {\r
+        /* Send the status */ \r
+        transfer.ptr = (uint8_t *)&status; /* Assumes little endian */\r
+        transfer.remaining = sizeof(status);\r
+        transfer.direction = DEVICE_TO_HOST;\r
+    }\r
+    \r
+    return success;\r
+}\r
+\r
+bool USBDevice::requestSetup(void)\r
+{\r
+    bool success = false;\r
+\r
+    /* Process standard requests */\r
+    if ((transfer.setup.bmRequestType.Type == STANDARD_TYPE))\r
+    {\r
+        switch (transfer.setup.bRequest)\r
+        {\r
+             case GET_STATUS:\r
+                 success = requestGetStatus();\r
+                 break;\r
+             case CLEAR_FEATURE:\r
+                 success = requestClearFeature();\r
+                 break;\r
+             case SET_FEATURE:\r
+                 success = requestSetFeature();\r
+                 break;\r
+             case SET_ADDRESS:\r
+                success = requestSetAddress();\r
+                 break;\r
+             case GET_DESCRIPTOR:\r
+                 success = requestGetDescriptor();\r
+                 break;\r
+             case SET_DESCRIPTOR:\r
+                 /* TODO: Support is optional, not implemented here */\r
+                 success = false;\r
+                 break;\r
+             case GET_CONFIGURATION:\r
+                 success = requestGetConfiguration();\r
+                 break;\r
+             case SET_CONFIGURATION:\r
+                 success = requestSetConfiguration();\r
+                 break;\r
+             case GET_INTERFACE:\r
+                 success = requestGetInterface();\r
+                 break;\r
+             case SET_INTERFACE:\r
+                 success = requestSetInterface();\r
+                 break;\r
+             default:\r
+                 break;\r
+        }\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+bool USBDevice::controlSetup(void)\r
+{\r
+    bool success = false;\r
+\r
+    /* Control transfer setup stage */\r
+    uint8_t buffer[MAX_PACKET_SIZE_EP0];\r
+\r
+    EP0setup(buffer);\r
+\r
+    /* Initialise control transfer state */\r
+    decodeSetupPacket(buffer, &transfer.setup);\r
+    transfer.ptr = NULL;\r
+    transfer.remaining = 0;\r
+    transfer.direction = 0;\r
+    transfer.zlp = false;\r
+    transfer.notify = false;\r
+\r
+    /* Class / vendor specific */\r
+    success = USBCallback_request();\r
+\r
+    if (!success)\r
+    {\r
+        /* Standard requests */\r
+        if (!requestSetup())\r
+        {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    /* Check transfer size and direction */\r
+    if (transfer.setup.wLength>0)\r
+    {\r
+        if (transfer.setup.bmRequestType.dataTransferDirection \\r
+            == DEVICE_TO_HOST)\r
+        {\r
+            /* IN data stage is required */\r
+            if (transfer.direction != DEVICE_TO_HOST)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            /* Transfer must be less than or equal to the size */\r
+            /* requested by the host */\r
+            if (transfer.remaining > transfer.setup.wLength)\r
+            {\r
+                transfer.remaining = transfer.setup.wLength;\r
+            }\r
+        }\r
+        else\r
+        {\r
+            \r
+            /* OUT data stage is required */\r
+            if (transfer.direction != HOST_TO_DEVICE)\r
+            {\r
+                return false;\r
+            }\r
+\r
+            /* Transfer must be equal to the size requested by the host */\r
+            if (transfer.remaining != transfer.setup.wLength)\r
+            {\r
+                return false;\r
+            }\r
+        }\r
+    }\r
+    else\r
+    {\r
+        /* No data stage; transfer size must be zero */\r
+        if (transfer.remaining != 0)\r
+        {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    /* Data or status stage if applicable */\r
+    if (transfer.setup.wLength>0)\r
+    {\r
+        if (transfer.setup.bmRequestType.dataTransferDirection \\r
+            == DEVICE_TO_HOST)\r
+        {\r
+            /* Check if we'll need to send a zero length packet at */\r
+            /* the end of this transfer */\r
+            if (transfer.setup.wLength > transfer.remaining)\r
+            {\r
+                /* Device wishes to transfer less than host requested */\r
+                if ((transfer.remaining % MAX_PACKET_SIZE_EP0) == 0)\r
+                {\r
+                    /* Transfer is a multiple of EP0 max packet size */\r
+                    transfer.zlp = true;\r
+                }\r
+            }\r
+\r
+            /* IN stage */\r
+            controlIn();\r
+        }\r
+        else\r
+        {\r
+            /* OUT stage */\r
+            EP0read();\r
+        }\r
+    }\r
+    else\r
+    {\r
+        /* Status stage */\r
+        EP0write(NULL, 0);\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+void USBDevice::busReset(void)\r
+{\r
+    device.state = DEFAULT;\r
+    device.configuration = 0;\r
+    device.suspended = false;\r
+\r
+    /* Call class / vendor specific busReset function */\r
+    USBCallback_busReset();\r
+}\r
+\r
+void USBDevice::EP0setupCallback(void)\r
+{\r
+    /* Endpoint 0 setup event */\r
+    if (!controlSetup())\r
+    {\r
+        /* Protocol stall */\r
+        EP0stall();\r
+    }\r
+\r
+    /* Return true if an OUT data stage is expected */\r
+}\r
+\r
+void USBDevice::EP0out(void)\r
+{\r
+    /* Endpoint 0 OUT data event */\r
+    if (!controlOut())\r
+    {\r
+        /* Protocol stall; this will stall both endpoints */\r
+        EP0stall();\r
+    }\r
+}\r
+\r
+void USBDevice::EP0in(void)\r
+{\r
+    /* Endpoint 0 IN data event */\r
+    if (!controlIn())\r
+    {\r
+        /* Protocol stall; this will stall both endpoints */\r
+        EP0stall();\r
+    }\r
+}\r
+\r
+bool USBDevice::configured(void)\r
+{\r
+    /* Returns true if device is in the CONFIGURED state */\r
+    return (device.state == CONFIGURED);\r
+}\r
+\r
+void USBDevice::connect(void)\r
+{\r
+    /* Connect device */\r
+    USBHAL::connect();\r
+    /* Block if not configured */\r
+    while (!configured());\r
+}\r
+\r
+void USBDevice::disconnect(void)\r
+{\r
+    /* Disconnect device */\r
+    USBHAL::disconnect();\r
+}\r
+\r
+CONTROL_TRANSFER * USBDevice::getTransferPtr(void)\r
+{\r
+    return &transfer;\r
+}\r
+\r
+bool USBDevice::addEndpoint(uint8_t endpoint, uint32_t maxPacket)\r
+{\r
+    return realiseEndpoint(endpoint, maxPacket, 0);\r
+}\r
+\r
+bool USBDevice::addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket)\r
+{\r
+    /* For interrupt endpoints only */\r
+    return realiseEndpoint(endpoint, maxPacket, RATE_FEEDBACK_MODE);\r
+}\r
+\r
+uint8_t * USBDevice::findDescriptor(uint8_t descriptorType)\r
+{\r
+    /* Find a descriptor within the list of descriptors */\r
+    /* following a configuration descriptor. */\r
+    uint16_t wTotalLength;\r
+    uint8_t *ptr;\r
+\r
+    if (configurationDesc() == NULL)\r
+    {\r
+        return NULL;\r
+    }\r
+\r
+    /* Check this is a configuration descriptor */\r
+    if ((configurationDesc()[0] != CONFIGURATION_DESCRIPTOR_LENGTH) \\r
+            || (configurationDesc()[1] != CONFIGURATION_DESCRIPTOR))\r
+    {\r
+        return NULL;\r
+    }\r
+\r
+    wTotalLength = configurationDesc()[2] | (configurationDesc()[3] << 8);\r
+\r
+    /* Check there are some more descriptors to follow */\r
+    if (wTotalLength <= (CONFIGURATION_DESCRIPTOR_LENGTH+2))\r
+    /* +2 is for bLength and bDescriptorType of next descriptor */\r
+    {\r
+        return false;\r
+    }\r
+\r
+    /* Start at first descriptor after the configuration descriptor */\r
+    ptr = &(configurationDesc()[CONFIGURATION_DESCRIPTOR_LENGTH]);\r
+\r
+    do {\r
+        if (ptr[1] /* bDescriptorType */ == descriptorType)\r
+        {\r
+            /* Found */\r
+            return ptr;\r
+        }\r
+\r
+        /* Skip to next descriptor */\r
+        ptr += ptr[0]; /* bLength */\r
+    } while (ptr < (configurationDesc() + wTotalLength));\r
+\r
+    /* Reached end of the descriptors - not found */\r
+    return NULL;\r
+}\r
+\r
+\r
+void USBDevice::connectStateChanged(unsigned int connected)\r
+{\r
+}\r
+\r
+void USBDevice::suspendStateChanged(unsigned int suspended)\r
+{\r
+}\r
+\r
+\r
+USBDevice::USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release){\r
+    VENDOR_ID = vendor_id; \r
+    PRODUCT_ID = product_id; \r
+    PRODUCT_RELEASE = product_release;\r
+\r
+    /* Set initial device state */\r
+    device.state = POWERED;\r
+    device.configuration = 0;\r
+    device.suspended = false;\r
+};\r
+\r
+\r
+bool USBDevice::readStart(uint8_t endpoint, uint16_t maxSize)\r
+{\r
+    return endpointRead(endpoint, maxSize) == EP_PENDING;\r
+}\r
+\r
+\r
+bool USBDevice::write(uint8_t endpoint, uint8_t * buffer, uint16_t size, uint16_t maxSize)\r
+{\r
+    EP_STATUS result;\r
+\r
+    if (size > maxSize)\r
+    {\r
+        return false;\r
+    }\r
+    \r
+    \r
+    if(!configured()) {\r
+        return false;\r
+    }\r
+    \r
+    /* Send report */\r
+    result = endpointWrite(endpoint, buffer, size);\r
+\r
+    if (result != EP_PENDING)\r
+    {\r
+        return false;\r
+    }\r
+\r
+    /* Wait for completion */\r
+    do {\r
+        result = endpointWriteResult(endpoint);\r
+    } while ((result == EP_PENDING) && configured());\r
+\r
+    return (result == EP_COMPLETED);\r
+}\r
+\r
+\r
+bool USBDevice::writeNB(uint8_t endpoint, uint8_t * buffer, uint16_t size, uint16_t maxSize)\r
+{\r
+    EP_STATUS result;\r
+\r
+    if (size > maxSize)\r
+    {\r
+        return false;\r
+    }\r
+    \r
+    if(!configured()) {\r
+        return false;\r
+    }\r
+\r
+    /* Send report */\r
+    result = endpointWrite(endpoint, buffer, size);\r
+\r
+    if (result != EP_PENDING)\r
+    {\r
+        return false;\r
+    }\r
+\r
+    result = endpointWriteResult(endpoint);\r
+\r
+    return (result == EP_COMPLETED);\r
+}\r
+\r
+\r
+\r
+bool USBDevice::readEP(uint8_t endpoint, uint8_t * buffer, uint16_t * size, uint16_t maxSize)\r
+{\r
+    EP_STATUS result;\r
+    \r
+    if(!configured()) {\r
+        return false;\r
+    }\r
+\r
+    /* Wait for completion */\r
+    do {\r
+        result = endpointReadResult(endpoint, buffer, (uint32_t *)size);\r
+    } while ((result == EP_PENDING) && configured());\r
+\r
+    return (result == EP_COMPLETED);\r
+}\r
+\r
+\r
+bool USBDevice::readEP_NB(uint8_t endpoint, uint8_t * buffer, uint16_t * size, uint16_t maxSize)\r
+{\r
+    EP_STATUS result;\r
+    \r
+    if(!configured()) {\r
+        return false;\r
+    }\r
+\r
+    result = endpointReadResult(endpoint, buffer, (uint32_t *)size);\r
+    \r
+    return (result == EP_COMPLETED);\r
+}\r
+\r
+\r
+\r
+uint8_t * USBDevice::deviceDesc() {\r
+    static uint8_t deviceDescriptor[] = {\r
+        DEVICE_DESCRIPTOR_LENGTH,       /* bLength */\r
+        DEVICE_DESCRIPTOR,              /* bDescriptorType */\r
+        LSB(USB_VERSION_2_0),           /* bcdUSB (LSB) */\r
+        MSB(USB_VERSION_2_0),           /* bcdUSB (MSB) */\r
+        0x00,                           /* bDeviceClass */\r
+        0x00,                           /* bDeviceSubClass */\r
+        0x00,                           /* bDeviceprotocol */\r
+        MAX_PACKET_SIZE_EP0,            /* bMaxPacketSize0 */\r
+        LSB(VENDOR_ID),                 /* idVendor (LSB) */\r
+        MSB(VENDOR_ID),                 /* idVendor (MSB) */\r
+        LSB(PRODUCT_ID),                /* idProduct (LSB) */\r
+        MSB(PRODUCT_ID),                /* idProduct (MSB) */\r
+        LSB(PRODUCT_RELEASE),           /* bcdDevice (LSB) */\r
+        MSB(PRODUCT_RELEASE),           /* bcdDevice (MSB) */\r
+        STRING_OFFSET_IMANUFACTURER,    /* iManufacturer */\r
+        STRING_OFFSET_IPRODUCT,         /* iProduct */\r
+        STRING_OFFSET_ISERIAL,          /* iSerialNumber */\r
+        0x01                            /* bNumConfigurations */\r
+    };\r
+    return deviceDescriptor;\r
+}\r
+\r
+uint8_t * USBDevice::stringLangidDesc() {\r
+    static uint8_t stringLangidDescriptor[] = {\r
+        0x04,               /*bLength*/\r
+        STRING_DESCRIPTOR,  /*bDescriptorType 0x03*/\r
+        0x09,0x00,          /*bString Lang ID - 0x009 - English*/\r
+    };\r
+    return stringLangidDescriptor;\r
+}\r
+\r
+uint8_t * USBDevice::stringImanufacturerDesc() {\r
+    static uint8_t stringImanufacturerDescriptor[] = {\r
+        0x12,                                            /*bLength*/\r
+        STRING_DESCRIPTOR,                               /*bDescriptorType 0x03*/\r
+        'm',0,'b',0,'e',0,'d',0,'.',0,'o',0,'r',0,'g',0, /*bString iManufacturer - mbed.org*/\r
+    };\r
+    return stringImanufacturerDescriptor;\r
+}\r
+\r
+uint8_t * USBDevice::stringIserialDesc() {\r
+    static uint8_t stringIserialDescriptor[] = {\r
+        0x16,                                                           /*bLength*/\r
+        STRING_DESCRIPTOR,                                              /*bDescriptorType 0x03*/\r
+        '0',0,'1',0,'2',0,'3',0,'4',0,'5',0,'6',0,'7',0,'8',0,'9',0,    /*bString iSerial - 0123456789*/\r
+    };\r
+    return stringIserialDescriptor;\r
+}\r
+\r
+uint8_t * USBDevice::stringIConfigurationDesc() {\r
+    static uint8_t stringIconfigurationDescriptor[] = {\r
+        0x06,               /*bLength*/\r
+        STRING_DESCRIPTOR,  /*bDescriptorType 0x03*/\r
+        '0',0,'1',0,        /*bString iConfiguration - 01*/\r
+    };\r
+    return stringIconfigurationDescriptor;\r
+}\r
+\r
+uint8_t * USBDevice::stringIinterfaceDesc() {\r
+    static uint8_t stringIinterfaceDescriptor[] = {\r
+        0x08,               /*bLength*/\r
+        STRING_DESCRIPTOR,  /*bDescriptorType 0x03*/\r
+        'U',0,'S',0,'B',0,  /*bString iInterface - USB*/\r
+    };\r
+    return stringIinterfaceDescriptor;\r
+}\r
+\r
+uint8_t * USBDevice::stringIproductDesc() {\r
+    static uint8_t stringIproductDescriptor[] = {\r
+        0x16,                                                       /*bLength*/\r
+        STRING_DESCRIPTOR,                                          /*bDescriptorType 0x03*/\r
+        'U',0,'S',0,'B',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 /*bString iProduct - USB DEVICE*/\r
+    };\r
+    return stringIproductDescriptor;\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice.h
new file mode 100644 (file)
index 0000000..fca7b48
--- /dev/null
@@ -0,0 +1,257 @@
+/* USBDevice.h */\r
+/* Generic USB device */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#ifndef USBDEVICE_H\r
+#define USBDEVICE_H\r
+\r
+#include "mbed.h"\r
+#include "USBDevice_Types.h"\r
+#include "USBBusInterface.h"\r
+\r
+\r
+\r
+class USBDevice: public USBHAL\r
+{\r
+public:\r
+    USBDevice(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);\r
+    \r
+    /*\r
+    * Check if the device is configured\r
+    *\r
+    * @returns true if configured, false otherwise\r
+    */\r
+    bool configured(void);\r
+    \r
+    /*\r
+    * Connect a device\r
+    */\r
+    void connect(void);\r
+    \r
+    /*\r
+    * Disconnect a device\r
+    */\r
+    void disconnect(void);\r
+    \r
+    /*\r
+    * Add an endpoint\r
+    *\r
+    * @param endpoint endpoint which will be added\r
+    * @param maxPacket Maximum size of a packet which can be sent for this endpoint\r
+    * @returns true if successful, false otherwise\r
+    */\r
+    bool addEndpoint(uint8_t endpoint, uint32_t maxPacket);\r
+\r
+    /*\r
+    * Start a reading on a certain endpoint.\r
+    * You can access the result of the reading by USBDevice_read\r
+    *\r
+    * @param endpoint endpoint which will be read\r
+    * @param maxSize the maximum length that can be read\r
+    * @return true if successful\r
+    */\r
+    bool readStart(uint8_t endpoint, uint16_t maxSize);\r
+    \r
+    /*\r
+    * Read a certain endpoint. Before calling this function, USBUSBDevice_readStart\r
+    * must be called.\r
+    *\r
+    * Warning: blocking\r
+    *\r
+    * @param endpoint endpoint which will be read\r
+    * @param buffer buffer will be filled with the data received\r
+    * @param size the number of bytes read will be stored in *size\r
+    * @param maxSize the maximum length that can be read\r
+    * @returns true if successful\r
+    */\r
+    bool readEP(uint8_t endpoint, uint8_t * buffer, uint16_t * size, uint16_t maxSize);\r
+    \r
+    /*\r
+    * Read a certain endpoint.\r
+    *\r
+    * Warning: non blocking\r
+    *\r
+    * @param endpoint endpoint which will be read\r
+    * @param buffer buffer will be filled with the data received (if data are available) \r
+    * @param size the number of bytes read will be stored in *size\r
+    * @param maxSize the maximum length that can be read\r
+    * @returns true if successful\r
+    */\r
+    bool readEP_NB(uint8_t endpoint, uint8_t * buffer, uint16_t * size, uint16_t maxSize);\r
+    \r
+    /*\r
+    * Write a certain endpoint.\r
+    *\r
+    * Warning: blocking\r
+    *\r
+    * @param endpoint endpoint to write\r
+    * @param buffer data contained in buffer will be write\r
+    * @param size the number of bytes to write\r
+    * @param maxSize the maximum length that can be written on this endpoint\r
+    */\r
+    bool write(uint8_t endpoint, uint8_t * buffer, uint16_t size, uint16_t maxSize);\r
+    \r
+    \r
+    /*\r
+    * Write a certain endpoint.\r
+    *\r
+    * Warning: non blocking\r
+    *\r
+    * @param endpoint endpoint to write\r
+    * @param buffer data contained in buffer will be write\r
+    * @param size the number of bytes to write\r
+    * @param maxSize the maximum length that can be written on this endpoint\r
+    */\r
+    bool writeNB(uint8_t endpoint, uint8_t * buffer, uint16_t size, uint16_t maxSize);\r
+\r
+    \r
+    /*\r
+    * Called by USBDevice layer on bus reset. Warning: Called in ISR context\r
+    *\r
+    * May be used to reset state\r
+    */\r
+    virtual void USBCallback_busReset(void) {};\r
+    \r
+    /*\r
+    * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context\r
+    * This is used to handle extensions to standard requests\r
+    * and class specific requests\r
+    *\r
+    * @returns true if class handles this request\r
+    */\r
+    virtual bool USBCallback_request() { return false; };   \r
+    \r
+    /*\r
+    * Called by USBDevice on Endpoint0 request completion\r
+    * if the 'notify' flag has been set to true. Warning: Called in ISR context\r
+    *\r
+    * In this case it is used to indicate that a HID report has\r
+    * been received from the host on endpoint 0\r
+    *\r
+    * @param buf buffer received on endpoint 0\r
+    * @param length length of this buffer\r
+    */\r
+    virtual void USBCallback_requestCompleted(uint8_t * buf, uint16_t length) {};\r
+    \r
+    /*\r
+    * Called by USBDevice layer. Set configuration of the device.\r
+    * For instance, you can add all endpoints that you need on this function.\r
+    *\r
+    * @param configuration Number of the configuration\r
+    */\r
+    virtual bool USBCallback_setConfiguration(uint8_t configuration) { return false; };\r
+    \r
+    /*\r
+     * Called by USBDevice layer. Set interface/alternate of the device.\r
+     *\r
+     * @param interface Number of the interface to be configured\r
+     * @param alternate Number of the alternate to be configured\r
+     * @returns true if class handles this request\r
+     */\r
+    virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate) { return false; };\r
+\r
+    /*\r
+    * Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.\r
+    *\r
+    * @returns pointer to the device descriptor\r
+    */\r
+    virtual uint8_t * deviceDesc();\r
+    \r
+    /*\r
+    * Get configuration descriptor\r
+    *\r
+    * @returns pointer to the configuration descriptor\r
+    */\r
+    virtual uint8_t * configurationDesc(){return NULL;};\r
+    \r
+    /*\r
+    * Get string lang id descriptor\r
+    *\r
+    * @return pointer to the string lang id descriptor\r
+    */\r
+    virtual uint8_t * stringLangidDesc();\r
+    \r
+    /*\r
+    * Get string manufacturer descriptor\r
+    *\r
+    * @returns pointer to the string manufacturer descriptor\r
+    */\r
+    virtual uint8_t * stringImanufacturerDesc();\r
+    \r
+    /*\r
+    * Get string product descriptor\r
+    *\r
+    * @returns pointer to the string product descriptor\r
+    */\r
+    virtual uint8_t * stringIproductDesc();\r
+    \r
+    /*\r
+    * Get string serial descriptor\r
+    *\r
+    * @returns pointer to the string serial descriptor\r
+    */\r
+    virtual uint8_t * stringIserialDesc();\r
+    \r
+    /*\r
+    * Get string configuration descriptor\r
+    *\r
+    * @returns pointer to the string configuration descriptor\r
+    */\r
+    virtual uint8_t * stringIConfigurationDesc();\r
+    \r
+    /*\r
+    * Get string interface descriptor\r
+    *\r
+    * @returns pointer to the string interface descriptor\r
+    */\r
+    virtual uint8_t * stringIinterfaceDesc();\r
+    \r
+    /*\r
+    * Get the length of the report descriptor\r
+    *\r
+    * @returns length of the report descriptor\r
+    */\r
+    virtual uint16_t reportDescLength() { return 0; };\r
+    \r
+\r
+\r
+protected:\r
+    virtual void busReset(void);\r
+    virtual void EP0setupCallback(void);\r
+    virtual void EP0out(void);\r
+    virtual void EP0in(void);\r
+    virtual void connectStateChanged(unsigned int connected);\r
+    virtual void suspendStateChanged(unsigned int suspended);\r
+    uint8_t * findDescriptor(uint8_t descriptorType);\r
+    CONTROL_TRANSFER * getTransferPtr(void);\r
+    \r
+    uint16_t VENDOR_ID;\r
+    uint16_t PRODUCT_ID;\r
+    uint16_t PRODUCT_RELEASE;\r
+\r
+private:\r
+    bool addRateFeedbackEndpoint(uint8_t endpoint, uint32_t maxPacket);\r
+    bool requestGetDescriptor(void);\r
+    bool controlOut(void);\r
+    bool controlIn(void);\r
+    bool requestSetAddress(void);\r
+    bool requestSetConfiguration(void);\r
+    bool requestSetFeature(void);\r
+    bool requestClearFeature(void);\r
+    bool requestGetStatus(void);\r
+    bool requestSetup(void);\r
+    bool controlSetup(void);\r
+    void decodeSetupPacket(uint8_t *data, SETUP_PACKET *packet);\r
+    bool requestGetConfiguration(void);\r
+    bool requestGetInterface(void);\r
+    bool requestSetInterface(void);\r
+\r
+    CONTROL_TRANSFER transfer;\r
+    USB_DEVICE device;\r
+    \r
+    uint16_t currentInterface;\r
+    uint8_t currentAlternate;\r
+};\r
+\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice_Types.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBDevice_Types.h
new file mode 100644 (file)
index 0000000..d636712
--- /dev/null
@@ -0,0 +1,69 @@
+/* USBDevice_Types.h */\r
+/* USB Device type definitions, conversions and constants */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#ifndef USBDEVICE_TYPES_H\r
+#define USBDEVICE_TYPES_H\r
+\r
+/* Standard requests */\r
+#define GET_STATUS        (0)\r
+#define CLEAR_FEATURE     (1)\r
+#define SET_FEATURE       (3)\r
+#define SET_ADDRESS       (5)\r
+#define GET_DESCRIPTOR    (6)\r
+#define SET_DESCRIPTOR    (7)\r
+#define GET_CONFIGURATION (8)\r
+#define SET_CONFIGURATION (9)\r
+#define GET_INTERFACE     (10)\r
+#define SET_INTERFACE     (11)\r
+\r
+/* bmRequestType.dataTransferDirection */\r
+#define HOST_TO_DEVICE (0)\r
+#define DEVICE_TO_HOST (1)\r
+\r
+/* bmRequestType.Type*/\r
+#define STANDARD_TYPE  (0)\r
+#define CLASS_TYPE     (1)\r
+#define VENDOR_TYPE    (2)\r
+#define RESERVED_TYPE  (3)\r
+\r
+/* bmRequestType.Recipient */\r
+#define DEVICE_RECIPIENT    (0)\r
+#define INTERFACE_RECIPIENT (1)\r
+#define ENDPOINT_RECIPIENT  (2)\r
+#define OTHER_RECIPIENT     (3)\r
+\r
+/* Descriptors */\r
+#define DESCRIPTOR_TYPE(wValue)  (wValue >> 8)\r
+#define DESCRIPTOR_INDEX(wValue) (wValue & 0xf)\r
+\r
+typedef struct {\r
+    struct {\r
+        uint8_t dataTransferDirection;\r
+        uint8_t Type;\r
+        uint8_t Recipient;\r
+    } bmRequestType;\r
+    uint8_t  bRequest;\r
+    uint16_t wValue;\r
+    uint16_t wIndex;\r
+    uint16_t wLength;\r
+} SETUP_PACKET;\r
+\r
+typedef struct {\r
+    SETUP_PACKET setup;\r
+    uint8_t *ptr;\r
+    uint32_t remaining;\r
+    uint8_t direction;\r
+    bool zlp;\r
+    bool notify;\r
+} CONTROL_TRANSFER;\r
+\r
+typedef enum {ATTACHED, POWERED, DEFAULT, ADDRESS, CONFIGURED} DEVICE_STATE;\r
+\r
+typedef struct {\r
+    volatile DEVICE_STATE state;\r
+    uint8_t configuration;\r
+    bool suspended;\r
+} USB_DEVICE;\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints.h
new file mode 100644 (file)
index 0000000..6a51336
--- /dev/null
@@ -0,0 +1,34 @@
+/* USBEndpoints.h */\r
+/* USB endpoint configuration */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#ifndef USBENDPOINTS_H\r
+#define USBENDPOINTS_H\r
+\r
+/* SETUP packet size */\r
+#define SETUP_PACKET_SIZE (8)\r
+\r
+/* Options flags for configuring endpoints */\r
+#define DEFAULT_OPTIONS     (0)\r
+#define SINGLE_BUFFERED     (1U << 0)\r
+#define ISOCHRONOUS         (1U << 1)\r
+#define RATE_FEEDBACK_MODE  (1U << 2) /* Interrupt endpoints only */\r
+\r
+/* Endpoint transfer status, for endpoints > 0 */\r
+typedef enum {\r
+    EP_COMPLETED,   /* Transfer completed */\r
+    EP_PENDING,     /* Transfer in progress */\r
+    EP_INVALID,     /* Invalid parameter */\r
+    EP_STALLED,     /* Endpoint stalled */\r
+} EP_STATUS;\r
+\r
+/* Include configuration for specific target */\r
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)\r
+#include "USBEndpoints_LPC17_LPC23.h"\r
+#elif defined(TARGET_LPC11U24)\r
+#include "USBEndpoints_LPC11U.h"\r
+#else\r
+#error "Unknown target type"\r
+#endif\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints_LPC11U.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints_LPC11U.h
new file mode 100644 (file)
index 0000000..6b546e0
--- /dev/null
@@ -0,0 +1,51 @@
+/* USBEndpoints_LPC11U.h */\r
+/* Endpoint configuration for LPC11U */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#define NUMBER_OF_LOGICAL_ENDPOINTS (5)\r
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)\r
+\r
+/* Define physical endpoint numbers */\r
+\r
+/*      Endpoint    No.     Type(s)       MaxPacket   DoubleBuffer  */\r
+/*      ----------------    ------------  ----------  ---           */\r
+#define EP0OUT      (0)  /* Control       64          No            */\r
+#define EP0IN       (1)  /* Control       64          No            */\r
+#define EP1OUT      (2)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP1IN       (3)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP2OUT      (4)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP2IN       (5)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP3OUT      (6)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP3IN       (7)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP4OUT      (8)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+#define EP4IN       (9)  /* Int/Bulk/Iso  64/64/1023  Yes           */\r
+\r
+/* Maximum Packet sizes */\r
+\r
+#define MAX_PACKET_SIZE_EP0 (64)\r
+#define MAX_PACKET_SIZE_EP1 (64) /* Int/Bulk */\r
+#define MAX_PACKET_SIZE_EP2 (64) /* Int/Bulk */\r
+#define MAX_PACKET_SIZE_EP3 (64) /* Int/Bulk */\r
+#define MAX_PACKET_SIZE_EP4 (64) /* Int/Bulk */\r
+\r
+#define MAX_PACKET_SIZE_EP1_ISO (1023) /* Isochronous */\r
+#define MAX_PACKET_SIZE_EP2_ISO (1023) /* Isochronous */\r
+#define MAX_PACKET_SIZE_EP3_ISO (1023) /* Isochronous */\r
+#define MAX_PACKET_SIZE_EP4_ISO (1023) /* Isochronous */\r
+\r
+/* Generic endpoints - intended to be portable accross devices */\r
+/* and be suitable for simple USB devices. */\r
+\r
+/* Bulk endpoint */\r
+#define EPBULK_OUT  (EP2OUT)\r
+#define EPBULK_IN   (EP2IN)\r
+/* Interrupt endpoint */\r
+#define EPINT_OUT   (EP1OUT)\r
+#define EPINT_IN    (EP1IN)\r
+/* Isochronous endpoint */\r
+#define EPISO_OUT   (EP3OUT)\r
+#define EPISO_IN    (EP3IN)\r
+\r
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)\r
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)\r
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3_ISO)\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints_LPC17_LPC23.h b/gcc4mbed/samples/MSTest/USBDevice/USBDevice/USBEndpoints_LPC17_LPC23.h
new file mode 100644 (file)
index 0000000..475c977
--- /dev/null
@@ -0,0 +1,79 @@
+/* USBEndpoints_LPC17_LPC23.h */\r
+/* Endpoint configuration for LPC1768 and LPC2368 */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#define NUMBER_OF_LOGICAL_ENDPOINTS (16)\r
+#define NUMBER_OF_PHYSICAL_ENDPOINTS (NUMBER_OF_LOGICAL_ENDPOINTS * 2)\r
+\r
+/* Define physical endpoint numbers */\r
+\r
+/*      Endpoint    No.     Type(s)       MaxPacket   DoubleBuffer  */\r
+/*      ----------------    ------------  ----------  ---           */\r
+#define EP0OUT      (0)  /* Control       64          No            */\r
+#define EP0IN       (1)  /* Control       64          No            */\r
+#define EP1OUT      (2)  /* Interrupt     64          No            */\r
+#define EP1IN       (3)  /* Interrupt     64          No            */\r
+#define EP2OUT      (4)  /* Bulk          64          Yes           */\r
+#define EP2IN       (5)  /* Bulk          64          Yes           */\r
+#define EP3OUT      (6)  /* Isochronous   1023        Yes           */\r
+#define EP3IN       (7)  /* Isochronous   1023        Yes           */\r
+#define EP4OUT      (8)  /* Interrupt     64          No            */\r
+#define EP4IN       (9)  /* Interrupt     64          No            */\r
+#define EP5OUT      (10) /* Bulk          64          Yes           */\r
+#define EP5IN       (11) /* Bulk          64          Yes           */\r
+#define EP6OUT      (12) /* Isochronous   1023        Yes           */\r
+#define EP6IN       (13) /* Isochronous   1023        Yes           */\r
+#define EP7OUT      (14) /* Interrupt     64          No            */\r
+#define EP7IN       (15) /* Interrupt     64          No            */\r
+#define EP8OUT      (16) /* Bulk          64          Yes           */\r
+#define EP8IN       (17) /* Bulk          64          Yes           */\r
+#define EP9OUT      (18) /* Isochronous   1023        Yes           */\r
+#define EP9IN       (19) /* Isochronous   1023        Yes           */\r
+#define EP10OUT     (20) /* Interrupt     64          No            */\r
+#define EP10IN      (21) /* Interrupt     64          No            */\r
+#define EP11OUT     (22) /* Bulk          64          Yes           */\r
+#define EP11IN      (23) /* Bulk          64          Yes           */\r
+#define EP12OUT     (24) /* Isochronous   1023        Yes           */\r
+#define EP12IN      (25) /* Isochronous   1023        Yes           */\r
+#define EP13OUT     (26) /* Interrupt     64          No            */\r
+#define EP13IN      (27) /* Interrupt     64          No            */\r
+#define EP14OUT     (28) /* Bulk          64          Yes           */\r
+#define EP14IN      (29) /* Bulk          64          Yes           */\r
+#define EP15OUT     (30) /* Bulk          64          Yes           */\r
+#define EP15IN      (31) /* Bulk          64          Yes           */\r
+\r
+/* Maximum Packet sizes */\r
+\r
+#define MAX_PACKET_SIZE_EP0  (64)\r
+#define MAX_PACKET_SIZE_EP1  (64)\r
+#define MAX_PACKET_SIZE_EP2  (64)\r
+#define MAX_PACKET_SIZE_EP3  (1023)\r
+#define MAX_PACKET_SIZE_EP4  (64)\r
+#define MAX_PACKET_SIZE_EP5  (64)\r
+#define MAX_PACKET_SIZE_EP6  (1023)\r
+#define MAX_PACKET_SIZE_EP7  (64)\r
+#define MAX_PACKET_SIZE_EP8  (64)\r
+#define MAX_PACKET_SIZE_EP9  (1023)\r
+#define MAX_PACKET_SIZE_EP10 (64)\r
+#define MAX_PACKET_SIZE_EP11 (64)\r
+#define MAX_PACKET_SIZE_EP12 (1023)\r
+#define MAX_PACKET_SIZE_EP13 (64)\r
+#define MAX_PACKET_SIZE_EP14 (64)\r
+#define MAX_PACKET_SIZE_EP15 (64)\r
+\r
+/* Generic endpoints - intended to be portable accross devices */\r
+/* and be suitable for simple USB devices. */\r
+\r
+/* Bulk endpoints */\r
+#define EPBULK_OUT  (EP2OUT)\r
+#define EPBULK_IN   (EP2IN)\r
+/* Interrupt endpoints */\r
+#define EPINT_OUT   (EP1OUT)\r
+#define EPINT_IN    (EP1IN)\r
+/* Isochronous endpoints */\r
+#define EPISO_OUT   (EP3OUT)\r
+#define EPISO_IN    (EP3IN)\r
+\r
+#define MAX_PACKET_SIZE_EPBULK  (MAX_PACKET_SIZE_EP2)\r
+#define MAX_PACKET_SIZE_EPINT   (MAX_PACKET_SIZE_EP1)\r
+#define MAX_PACKET_SIZE_EPISO   (MAX_PACKET_SIZE_EP3)\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID.cpp
new file mode 100644 (file)
index 0000000..e7f6552
--- /dev/null
@@ -0,0 +1,259 @@
+// USBHID.c\r
+// Human Interface Device (HID) class\r
+// Copyright (c) 2011 ARM Limited. All rights reserved.\r
+\r
+#include "stdint.h"\r
+#include "USBBusInterface.h"\r
+#include "USBHID.h"\r
+\r
+\r
+USBHID::USBHID(uint8_t output_report_length, uint8_t input_report_length, uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect): USBDevice(vendor_id, product_id, product_release)\r
+{\r
+    output_length = output_report_length;\r
+    input_length = input_report_length;\r
+    if(connect) {\r
+        USBDevice::connect();\r
+    }\r
+}\r
+\r
+\r
+bool USBHID::send(HID_REPORT *report)\r
+{\r
+    return write(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);\r
+}\r
+\r
+bool USBHID::sendNB(HID_REPORT *report)\r
+{\r
+    return writeNB(EPINT_IN, report->data, report->length, MAX_HID_REPORT_SIZE);\r
+}\r
+\r
+\r
+bool USBHID::read(HID_REPORT *report)\r
+{\r
+    uint16_t bytesRead = 0;\r
+    bool result;\r
+    result = USBDevice::readEP(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);\r
+    if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))\r
+        return false;\r
+    report->length = bytesRead;\r
+    return result;\r
+}\r
+\r
+\r
+bool USBHID::readNB(HID_REPORT *report)\r
+{\r
+    uint16_t bytesRead = 0;\r
+    bool result;\r
+    result = USBDevice::readEP_NB(EPINT_OUT, report->data, &bytesRead, MAX_HID_REPORT_SIZE);\r
+    report->length = bytesRead;\r
+    if(!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))\r
+        return false;\r
+    return result;\r
+}\r
+\r
+\r
+uint16_t USBHID::reportDescLength() {\r
+    reportDesc();\r
+    return reportLength;\r
+}\r
+\r
+\r
+\r
+//\r
+//  Route callbacks from lower layers to class(es)\r
+//\r
+\r
+\r
+// Called in ISR context\r
+// Called by USBDevice on Endpoint0 request\r
+// This is used to handle extensions to standard requests\r
+// and class specific requests\r
+// Return true if class handles this request\r
+bool USBHID::USBCallback_request() {\r
+    bool success = false;\r
+    CONTROL_TRANSFER * transfer = getTransferPtr();\r
+    uint8_t *hidDescriptor;\r
+\r
+    // Process additional standard requests\r
+\r
+    if ((transfer->setup.bmRequestType.Type == STANDARD_TYPE))\r
+    {\r
+        switch (transfer->setup.bRequest)\r
+        {\r
+            case GET_DESCRIPTOR:\r
+                switch (DESCRIPTOR_TYPE(transfer->setup.wValue))\r
+                {\r
+                    case REPORT_DESCRIPTOR:\r
+                        if ((reportDesc() != NULL) \\r
+                            && (reportDescLength() != 0))\r
+                        {\r
+                            transfer->remaining = reportDescLength();\r
+                            transfer->ptr = reportDesc();\r
+                            transfer->direction = DEVICE_TO_HOST;\r
+                            success = true;\r
+                        }\r
+                        break;\r
+                    case HID_DESCRIPTOR:\r
+                            // Find the HID descriptor, after the configuration descriptor\r
+                            hidDescriptor = findDescriptor(HID_DESCRIPTOR);\r
+                            if (hidDescriptor != NULL)\r
+                            {\r
+                                transfer->remaining = HID_DESCRIPTOR_LENGTH;\r
+                                transfer->ptr = hidDescriptor;\r
+                                transfer->direction = DEVICE_TO_HOST;\r
+                                success = true;\r
+                            }\r
+                            break;\r
+                     \r
+                    default:\r
+                        break;\r
+                }\r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+\r
+    // Process class-specific requests\r
+\r
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE)\r
+    {\r
+        switch (transfer->setup.bRequest)\r
+        {\r
+             case SET_REPORT:\r
+                // First byte will be used for report ID\r
+                outputReport.data[0] = transfer->setup.wValue & 0xff;\r
+                outputReport.length = transfer->setup.wLength + 1;\r
+\r
+                transfer->remaining = sizeof(outputReport.data) - 1;\r
+                transfer->ptr = &outputReport.data[1];\r
+                transfer->direction = HOST_TO_DEVICE;\r
+                transfer->notify = true;\r
+                success = true;\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+\r
+#define DEFAULT_CONFIGURATION (1)\r
+\r
+\r
+// Called in ISR context\r
+// Set configuration. Return false if the\r
+// configuration is not supported\r
+bool USBHID::USBCallback_setConfiguration(uint8_t configuration) {\r
+    if (configuration != DEFAULT_CONFIGURATION) {\r
+        return false;\r
+    }\r
+\r
+    // Configure endpoints > 0\r
+    addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);\r
+    addEndpoint(EPINT_OUT, MAX_PACKET_SIZE_EPINT);\r
+\r
+    // We activate the endpoint to be able to recceive data\r
+    readStart(EPINT_OUT, MAX_PACKET_SIZE_EPINT);\r
+    return true;\r
+}\r
+\r
+\r
+uint8_t * USBHID::stringIinterfaceDesc() {\r
+    static uint8_t stringIinterfaceDescriptor[] = {\r
+        0x08,               //bLength\r
+        STRING_DESCRIPTOR,  //bDescriptorType 0x03\r
+        'H',0,'I',0,'D',0,  //bString iInterface - HID\r
+    };\r
+    return stringIinterfaceDescriptor;\r
+}\r
+\r
+uint8_t * USBHID::stringIproductDesc() {\r
+    static uint8_t stringIproductDescriptor[] = {\r
+        0x16,                                                       //bLength\r
+        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03\r
+        'H',0,'I',0,'D',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0 //bString iProduct - HID device\r
+    };\r
+    return stringIproductDescriptor;\r
+}\r
+\r
+\r
+\r
+uint8_t * USBHID::reportDesc() {\r
+    static uint8_t reportDescriptor[] = {\r
+        0x06, LSB(0xFFAB), MSB(0xFFAB),\r
+        0x0A, LSB(0x0200), MSB(0x0200),\r
+        0xA1, 0x01,         // Collection 0x01\r
+        0x75, 0x08,         // report size = 8 bits\r
+        0x15, 0x00,         // logical minimum = 0\r
+        0x26, 0xFF, 0x00,   // logical maximum = 255\r
+        0x95, input_length,           // report count\r
+        0x09, 0x01,         // usage\r
+        0x81, 0x02,         // Input (array)\r
+        0x95, output_length,           // report count\r
+        0x09, 0x02,         // usage\r
+        0x91, 0x02,         // Output (array)\r
+        0xC0                // end collection\r
+\r
+    };\r
+    reportLength = sizeof(reportDescriptor);\r
+    return reportDescriptor;\r
+}\r
+\r
+#define DEFAULT_CONFIGURATION (1)\r
+#define TOTAL_DESCRIPTOR_LENGTH ((1 * CONFIGURATION_DESCRIPTOR_LENGTH) \\r
+                               + (1 * INTERFACE_DESCRIPTOR_LENGTH) \\r
+                               + (1 * HID_DESCRIPTOR_LENGTH) \\r
+                               + (2 * ENDPOINT_DESCRIPTOR_LENGTH))\r
+\r
+uint8_t * USBHID::configurationDesc() {\r
+    static uint8_t configurationDescriptor[] = {\r
+        CONFIGURATION_DESCRIPTOR_LENGTH,// bLength\r
+        CONFIGURATION_DESCRIPTOR,       // bDescriptorType\r
+        LSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (LSB)\r
+        MSB(TOTAL_DESCRIPTOR_LENGTH),   // wTotalLength (MSB)\r
+        0x01,                           // bNumInterfaces\r
+        DEFAULT_CONFIGURATION,          // bConfigurationValue\r
+        0x00,                           // iConfiguration\r
+        C_RESERVED | C_SELF_POWERED,    // bmAttributes\r
+        C_POWER(0),                     // bMaxPower\r
+\r
+        INTERFACE_DESCRIPTOR_LENGTH,    // bLength\r
+        INTERFACE_DESCRIPTOR,           // bDescriptorType\r
+        0x00,                           // bInterfaceNumber\r
+        0x00,                           // bAlternateSetting\r
+        0x02,                           // bNumEndpoints\r
+        HID_CLASS,                      // bInterfaceClass\r
+        HID_SUBCLASS_NONE,              // bInterfaceSubClass\r
+        HID_PROTOCOL_NONE,              // bInterfaceProtocol\r
+        0x00,                           // iInterface\r
+\r
+        HID_DESCRIPTOR_LENGTH,          // bLength\r
+        HID_DESCRIPTOR,                 // bDescriptorType\r
+        LSB(HID_VERSION_1_11),          // bcdHID (LSB)\r
+        MSB(HID_VERSION_1_11),          // bcdHID (MSB)\r
+        0x00,                           // bCountryCode\r
+        0x01,                           // bNumDescriptors\r
+        REPORT_DESCRIPTOR,              // bDescriptorType\r
+        LSB(this->reportDescLength()),  // wDescriptorLength (LSB)\r
+        MSB(this->reportDescLength()),  // wDescriptorLength (MSB)\r
+\r
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength\r
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType\r
+        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress\r
+        E_INTERRUPT,                    // bmAttributes\r
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)\r
+        1,                             // bInterval (milliseconds)\r
+\r
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength\r
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType\r
+        PHY_TO_DESC(EPINT_OUT),          // bEndpointAddress\r
+        E_INTERRUPT,                    // bmAttributes\r
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)\r
+        1,                             // bInterval (milliseconds)\r
+    };\r
+    return configurationDescriptor;\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID.h b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID.h
new file mode 100644 (file)
index 0000000..bc0701e
--- /dev/null
@@ -0,0 +1,172 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef USB_HID_H\r
+#define USB_HID_H\r
+\r
+/* These headers are included for child class. */\r
+#include "USBEndpoints.h"\r
+#include "USBDescriptor.h"\r
+#include "USBDevice_Types.h"\r
+\r
+#include "USBHID_Types.h"\r
+#include "USBDevice.h"\r
+\r
+\r
+/**\r
+ * USBHID example\r
+ * @code\r
+ * #include "mbed.h"\r
+ * #include "USBHID.h"\r
+ *\r
+ * USBHID hid;\r
+ * HID_REPORT recv;\r
+ * BusOut leds(LED1,LED2,LED3,LED4);\r
+ *\r
+ * int main(void) {\r
+ *    while (1) {\r
+ *        hid.read(&recv);\r
+ *        leds = recv.data[0];\r
+ *    }\r
+ * }\r
+ * @endcode\r
+ */\r
+\r
+class USBHID: public USBDevice {\r
+public:\r
+\r
+    /**\r
+    * Constructor\r
+    *\r
+    * @param output_report_length Maximum length of a sent report (up to 64 bytes) (default: 64 bytes)\r
+    * @param input_report_length Maximum length of a received report (up to 64 bytes) (default: 64 bytes)\r
+    * @param vendor_id Your vendor_id\r
+    * @param product_id Your product_id\r
+    * @param product_release Your preoduct_release\r
+    * @param connect Connect the device\r
+    */\r
+    USBHID(uint8_t output_report_length = 64, uint8_t input_report_length = 64, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0006, uint16_t product_release = 0x0001, bool connect = true);\r
+\r
+\r
+    /**\r
+    * Send a Report. warning: blocking\r
+    *\r
+    * @param report Report which will be sent (a report is defined by all data and the length)\r
+    * @returns true if successful\r
+    */\r
+    bool send(HID_REPORT *report);\r
+    \r
+    \r
+    /**\r
+    * Send a Report. warning: non blocking\r
+    *\r
+    * @param report Report which will be sent (a report is defined by all data and the length)\r
+    * @returns true if successful\r
+    */\r
+    bool sendNB(HID_REPORT *report);\r
+    \r
+    /**\r
+    * Read a report: blocking\r
+    *\r
+    * @param report pointer to the report to fill\r
+    * @returns true if successful\r
+    */\r
+    bool read(HID_REPORT * report);\r
+    \r
+    /**\r
+    * Read a report: non blocking\r
+    *\r
+    * @param report pointer to the report to fill\r
+    * @returns true if successful\r
+    */\r
+    bool readNB(HID_REPORT * report);\r
+\r
+protected:\r
+    uint16_t reportLength;\r
+    \r
+    /*\r
+    * Get the Report descriptor\r
+    *\r
+    * @returns pointer to the report descriptor\r
+    */\r
+    virtual uint8_t * reportDesc();\r
+\r
+    /*\r
+    * Get the length of the report descriptor\r
+    *\r
+    * @returns the length of the report descriptor\r
+    */\r
+    virtual uint16_t reportDescLength();\r
+\r
+    /*\r
+    * Get string product descriptor\r
+    *\r
+    * @returns pointer to the string product descriptor\r
+    */\r
+    virtual uint8_t * stringIproductDesc();\r
+    \r
+    /*\r
+    * Get string interface descriptor\r
+    *\r
+    * @returns pointer to the string interface descriptor\r
+    */\r
+    virtual uint8_t * stringIinterfaceDesc();\r
+    \r
+    /*\r
+    * Get configuration descriptor\r
+    *\r
+    * @returns pointer to the configuration descriptor\r
+    */\r
+    virtual uint8_t * configurationDesc();\r
+\r
+\r
+    /*\r
+    * HID Report received by SET_REPORT request. Warning: Called in ISR context\r
+    * First byte of data will be the report ID\r
+    *\r
+    * @param report Data and length received\r
+    */\r
+    virtual void HID_callbackSetReport(HID_REPORT *report){};\r
+\r
+\r
+    /*\r
+    * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context\r
+    * This is used to handle extensions to standard requests\r
+    * and class specific requests\r
+    *\r
+    * @returns true if class handles this request\r
+    */\r
+    virtual bool USBCallback_request();\r
+\r
+\r
+    /*\r
+    * Called by USBDevice layer. Set configuration of the device.\r
+    * For instance, you can add all endpoints that you need on this function.\r
+    *\r
+    * @param configuration Number of the configuration\r
+    * @returns true if class handles this request\r
+    */\r
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);\r
+\r
+private:\r
+    HID_REPORT outputReport;\r
+    uint8_t output_length;\r
+    uint8_t input_length;\r
+};\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID_Types.h b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBHID_Types.h
new file mode 100644 (file)
index 0000000..0459f13
--- /dev/null
@@ -0,0 +1,91 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef USBCLASS_HID_TYPES\r
+#define USBCLASS_HID_TYPES\r
+\r
+#include <stdint.h>\r
+\r
+/* */\r
+#define HID_VERSION_1_11    (0x0111)\r
+\r
+/* HID Class */\r
+#define HID_CLASS           (3)\r
+#define HID_SUBCLASS_NONE   (0)\r
+#define HID_PROTOCOL_NONE   (0)\r
+\r
+/* Descriptors */\r
+#define HID_DESCRIPTOR          (33)\r
+#define HID_DESCRIPTOR_LENGTH   (0x09)\r
+#define REPORT_DESCRIPTOR       (34)\r
+\r
+/* Class requests */\r
+#define GET_REPORT (0x1)\r
+#define GET_IDLE   (0x2)\r
+#define SET_REPORT (0x9)\r
+#define SET_IDLE   (0xa)\r
+\r
+/* HID Class Report Descriptor */\r
+/* Short items: size is 0, 1, 2 or 3 specifying 0, 1, 2 or 4 (four) bytes */\r
+/* of data as per HID Class standard */\r
+\r
+/* Main items */\r
+#define INPUT(size)             (0x80 | size)\r
+#define OUTPUT(size)            (0x90 | size)\r
+#define FEATURE(size)           (0xb0 | size)\r
+#define COLLECTION(size)        (0xa0 | size)\r
+#define END_COLLECTION(size)    (0xc0 | size)\r
+\r
+/* Global items */\r
+#define USAGE_PAGE(size)        (0x04 | size)\r
+#define LOGICAL_MINIMUM(size)   (0x14 | size)\r
+#define LOGICAL_MAXIMUM(size)   (0x24 | size)\r
+#define PHYSICAL_MINIMUM(size)  (0x34 | size)\r
+#define PHYSICAL_MAXIMUM(size)  (0x44 | size)\r
+#define UNIT_EXPONENT(size)     (0x54 | size)\r
+#define UNIT(size)              (0x64 | size)\r
+#define REPORT_SIZE(size)       (0x74 | size)\r
+#define REPORT_ID(size)         (0x84 | size)\r
+#define REPORT_COUNT(size)      (0x94 | size)\r
+#define PUSH(size)              (0xa4 | size)\r
+#define POP(size)               (0xb4 | size)\r
+\r
+/* Local items */\r
+#define USAGE(size)                 (0x08 | size)\r
+#define USAGE_MINIMUM(size)         (0x18 | size)\r
+#define USAGE_MAXIMUM(size)         (0x28 | size)\r
+#define DESIGNATOR_INDEX(size)      (0x38 | size)\r
+#define DESIGNATOR_MINIMUM(size)    (0x48 | size)\r
+#define DESIGNATOR_MAXIMUM(size)    (0x58 | size)\r
+#define STRING_INDEX(size)          (0x78 | size)\r
+#define STRING_MINIMUM(size)        (0x88 | size)\r
+#define STRING_MAXIMUM(size)        (0x98 | size)\r
+#define DELIMITER(size)             (0xa8 | size)\r
+\r
+/* HID Report */\r
+/* Where report IDs are used the first byte of 'data' will be the */\r
+/* report ID and 'length' will include this report ID byte. */\r
+\r
+#define MAX_HID_REPORT_SIZE (64)\r
+\r
+typedef struct {\r
+    uint32_t length;\r
+    uint8_t data[MAX_HID_REPORT_SIZE];\r
+} HID_REPORT;\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBKeyboard.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBKeyboard.cpp
new file mode 100644 (file)
index 0000000..e349069
--- /dev/null
@@ -0,0 +1,485 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+\r
+#include "USBKeyboard.h"\r
+\r
+#define REPORT_ID_KEYBOARD 1\r
+#define REPORT_ID_VOLUME   3\r
+\r
+\r
+typedef struct {\r
+    unsigned char usage;\r
+    unsigned char modifier;\r
+} KEYMAP;\r
+\r
+#ifdef US_KEYBOARD\r
+/* US keyboard (as HID standard) */\r
+#define KEYMAP_SIZE (148)\r
+const KEYMAP keymap[KEYMAP_SIZE] = {\r
+    {0, 0},             /* NUL */\r
+    {0, 0},             /* SOH */\r
+    {0, 0},             /* STX */\r
+    {0, 0},             /* ETX */\r
+    {0, 0},             /* EOT */\r
+    {0, 0},             /* ENQ */\r
+    {0, 0},             /* ACK */\r
+    {0, 0},             /* BEL */\r
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */\r
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */\r
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */\r
+    {0, 0},             /* VT  */\r
+    {0, 0},             /* FF  */\r
+    {0, 0},             /* CR  */\r
+    {0, 0},             /* SO  */\r
+    {0, 0},             /* SI  */\r
+    {0, 0},             /* DEL */\r
+    {0, 0},             /* DC1 */\r
+    {0, 0},             /* DC2 */\r
+    {0, 0},             /* DC3 */\r
+    {0, 0},             /* DC4 */\r
+    {0, 0},             /* NAK */\r
+    {0, 0},             /* SYN */\r
+    {0, 0},             /* ETB */\r
+    {0, 0},             /* CAN */\r
+    {0, 0},             /* EM  */\r
+    {0, 0},             /* SUB */\r
+    {0, 0},             /* ESC */\r
+    {0, 0},             /* FS  */\r
+    {0, 0},             /* GS  */\r
+    {0, 0},             /* RS  */\r
+    {0, 0},             /* US  */\r
+    {0x2c, 0},          /*   */\r
+    {0x1e, KEY_SHIFT},      /* ! */\r
+    {0x34, KEY_SHIFT},      /* " */\r
+    {0x20, KEY_SHIFT},      /* # */\r
+    {0x21, KEY_SHIFT},      /* $ */\r
+    {0x22, KEY_SHIFT},      /* % */\r
+    {0x24, KEY_SHIFT},      /* & */\r
+    {0x34, 0},          /* ' */\r
+    {0x26, KEY_SHIFT},      /* ( */\r
+    {0x27, KEY_SHIFT},      /* ) */\r
+    {0x25, KEY_SHIFT},      /* * */\r
+    {0x2e, KEY_SHIFT},      /* + */\r
+    {0x36, 0},          /* , */\r
+    {0x2d, 0},          /* - */\r
+    {0x37, 0},          /* . */\r
+    {0x38, 0},          /* / */\r
+    {0x27, 0},          /* 0 */\r
+    {0x1e, 0},          /* 1 */\r
+    {0x1f, 0},          /* 2 */\r
+    {0x20, 0},          /* 3 */\r
+    {0x21, 0},          /* 4 */\r
+    {0x22, 0},          /* 5 */\r
+    {0x23, 0},          /* 6 */\r
+    {0x24, 0},          /* 7 */\r
+    {0x25, 0},          /* 8 */\r
+    {0x26, 0},          /* 9 */\r
+    {0x33, KEY_SHIFT},      /* : */\r
+    {0x33, 0},          /* ; */\r
+    {0x36, KEY_SHIFT},      /* < */\r
+    {0x2e, 0},          /* = */\r
+    {0x37, KEY_SHIFT},      /* > */\r
+    {0x38, KEY_SHIFT},      /* ? */\r
+    {0x1f, KEY_SHIFT},      /* @ */\r
+    {0x04, KEY_SHIFT},      /* A */\r
+    {0x05, KEY_SHIFT},      /* B */\r
+    {0x06, KEY_SHIFT},      /* C */\r
+    {0x07, KEY_SHIFT},      /* D */\r
+    {0x08, KEY_SHIFT},      /* E */\r
+    {0x09, KEY_SHIFT},      /* F */\r
+    {0x0a, KEY_SHIFT},      /* G */\r
+    {0x0b, KEY_SHIFT},      /* H */\r
+    {0x0c, KEY_SHIFT},      /* I */\r
+    {0x0d, KEY_SHIFT},      /* J */\r
+    {0x0e, KEY_SHIFT},      /* K */\r
+    {0x0f, KEY_SHIFT},      /* L */\r
+    {0x10, KEY_SHIFT},      /* M */\r
+    {0x11, KEY_SHIFT},      /* N */\r
+    {0x12, KEY_SHIFT},      /* O */\r
+    {0x13, KEY_SHIFT},      /* P */\r
+    {0x14, KEY_SHIFT},      /* Q */\r
+    {0x15, KEY_SHIFT},      /* R */\r
+    {0x16, KEY_SHIFT},      /* S */\r
+    {0x17, KEY_SHIFT},      /* T */\r
+    {0x18, KEY_SHIFT},      /* U */\r
+    {0x19, KEY_SHIFT},      /* V */\r
+    {0x1a, KEY_SHIFT},      /* W */\r
+    {0x1b, KEY_SHIFT},      /* X */\r
+    {0x1c, KEY_SHIFT},      /* Y */\r
+    {0x1d, KEY_SHIFT},      /* Z */\r
+    {0x2f, 0},          /* [ */\r
+    {0x31, 0},          /* \ */\r
+    {0x30, 0},          /* ] */\r
+    {0x23, KEY_SHIFT},      /* ^ */\r
+    {0x2d, KEY_SHIFT},      /* _ */\r
+    {0x35, 0},          /* ` */\r
+    {0x04, 0},          /* a */\r
+    {0x05, 0},          /* b */\r
+    {0x06, 0},          /* c */\r
+    {0x07, 0},          /* d */\r
+    {0x08, 0},          /* e */\r
+    {0x09, 0},          /* f */\r
+    {0x0a, 0},          /* g */\r
+    {0x0b, 0},          /* h */\r
+    {0x0c, 0},          /* i */\r
+    {0x0d, 0},          /* j */\r
+    {0x0e, 0},          /* k */\r
+    {0x0f, 0},          /* l */\r
+    {0x10, 0},          /* m */\r
+    {0x11, 0},          /* n */\r
+    {0x12, 0},          /* o */\r
+    {0x13, 0},          /* p */\r
+    {0x14, 0},          /* q */\r
+    {0x15, 0},          /* r */\r
+    {0x16, 0},          /* s */\r
+    {0x17, 0},          /* t */\r
+    {0x18, 0},          /* u */\r
+    {0x19, 0},          /* v */\r
+    {0x1a, 0},          /* w */\r
+    {0x1b, 0},          /* x */\r
+    {0x1c, 0},          /* y */\r
+    {0x1d, 0},          /* z */\r
+    {0x2f, KEY_SHIFT},      /* { */\r
+    {0x31, KEY_SHIFT},      /* | */\r
+    {0x30, KEY_SHIFT},      /* } */\r
+    {0x35, KEY_SHIFT},      /* ~ */\r
+    {0,0},              /* DEL */\r
+\r
+    {0x3a, 0},          /* F1 */\r
+    {0x3b, 0},          /* F2 */\r
+    {0x3c, 0},          /* F3 */\r
+    {0x3d, 0},          /* F4 */\r
+    {0x3e, 0},          /* F5 */\r
+    {0x3f, 0},          /* F6 */\r
+    {0x40, 0},          /* F7 */\r
+    {0x41, 0},          /* F8 */\r
+    {0x42, 0},          /* F9 */\r
+    {0x43, 0},          /* F10 */\r
+    {0x44, 0},          /* F11 */\r
+    {0x45, 0},          /* F12 */\r
+\r
+    {0x46, 0},          /* PRINT_SCREEN */\r
+    {0x47, 0},          /* SCROLL_LOCK */\r
+    {0x39, 0},          /* CAPS_LOCK */\r
+    {0x53, 0},          /* NUM_LOCK */\r
+    {0x49, 0},          /* INSERT */\r
+    {0x4a, 0},          /* HOME */\r
+    {0x4b, 0},          /* PAGE_UP */\r
+    {0x4e, 0},          /* PAGE_DOWN */\r
+};\r
+\r
+#else\r
+/* UK keyboard */\r
+#define KEYMAP_SIZE (148)\r
+const KEYMAP keymap[KEYMAP_SIZE] = {\r
+    {0, 0},             /* NUL */\r
+    {0, 0},             /* SOH */\r
+    {0, 0},             /* STX */\r
+    {0, 0},             /* ETX */\r
+    {0, 0},             /* EOT */\r
+    {0, 0},             /* ENQ */\r
+    {0, 0},             /* ACK */\r
+    {0, 0},             /* BEL */\r
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */\r
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */\r
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */\r
+    {0, 0},             /* VT  */\r
+    {0, 0},             /* FF  */\r
+    {0, 0},             /* CR  */\r
+    {0, 0},             /* SO  */\r
+    {0, 0},             /* SI  */\r
+    {0, 0},             /* DEL */\r
+    {0, 0},             /* DC1 */\r
+    {0, 0},             /* DC2 */\r
+    {0, 0},             /* DC3 */\r
+    {0, 0},             /* DC4 */\r
+    {0, 0},             /* NAK */\r
+    {0, 0},             /* SYN */\r
+    {0, 0},             /* ETB */\r
+    {0, 0},             /* CAN */\r
+    {0, 0},             /* EM  */\r
+    {0, 0},             /* SUB */\r
+    {0, 0},             /* ESC */\r
+    {0, 0},             /* FS  */\r
+    {0, 0},             /* GS  */\r
+    {0, 0},             /* RS  */\r
+    {0, 0},             /* US  */\r
+    {0x2c, 0},          /*   */\r
+    {0x1e, KEY_SHIFT},      /* ! */\r
+    {0x1f, KEY_SHIFT},      /* " */\r
+    {0x32, 0},          /* # */\r
+    {0x21, KEY_SHIFT},      /* $ */\r
+    {0x22, KEY_SHIFT},      /* % */\r
+    {0x24, KEY_SHIFT},      /* & */\r
+    {0x34, 0},          /* ' */\r
+    {0x26, KEY_SHIFT},      /* ( */\r
+    {0x27, KEY_SHIFT},      /* ) */\r
+    {0x25, KEY_SHIFT},      /* * */\r
+    {0x2e, KEY_SHIFT},      /* + */\r
+    {0x36, 0},          /* , */\r
+    {0x2d, 0},          /* - */\r
+    {0x37, 0},          /* . */\r
+    {0x38, 0},          /* / */\r
+    {0x27, 0},          /* 0 */\r
+    {0x1e, 0},          /* 1 */\r
+    {0x1f, 0},          /* 2 */\r
+    {0x20, 0},          /* 3 */\r
+    {0x21, 0},          /* 4 */\r
+    {0x22, 0},          /* 5 */\r
+    {0x23, 0},          /* 6 */\r
+    {0x24, 0},          /* 7 */\r
+    {0x25, 0},          /* 8 */\r
+    {0x26, 0},          /* 9 */\r
+    {0x33, KEY_SHIFT},      /* : */\r
+    {0x33, 0},          /* ; */\r
+    {0x36, KEY_SHIFT},      /* < */\r
+    {0x2e, 0},          /* = */\r
+    {0x37, KEY_SHIFT},      /* > */\r
+    {0x38, KEY_SHIFT},      /* ? */\r
+    {0x34, KEY_SHIFT},      /* @ */\r
+    {0x04, KEY_SHIFT},      /* A */\r
+    {0x05, KEY_SHIFT},      /* B */\r
+    {0x06, KEY_SHIFT},      /* C */\r
+    {0x07, KEY_SHIFT},      /* D */\r
+    {0x08, KEY_SHIFT},      /* E */\r
+    {0x09, KEY_SHIFT},      /* F */\r
+    {0x0a, KEY_SHIFT},      /* G */\r
+    {0x0b, KEY_SHIFT},      /* H */\r
+    {0x0c, KEY_SHIFT},      /* I */\r
+    {0x0d, KEY_SHIFT},      /* J */\r
+    {0x0e, KEY_SHIFT},      /* K */\r
+    {0x0f, KEY_SHIFT},      /* L */\r
+    {0x10, KEY_SHIFT},      /* M */\r
+    {0x11, KEY_SHIFT},      /* N */\r
+    {0x12, KEY_SHIFT},      /* O */\r
+    {0x13, KEY_SHIFT},      /* P */\r
+    {0x14, KEY_SHIFT},      /* Q */\r
+    {0x15, KEY_SHIFT},      /* R */\r
+    {0x16, KEY_SHIFT},      /* S */\r
+    {0x17, KEY_SHIFT},      /* T */\r
+    {0x18, KEY_SHIFT},      /* U */\r
+    {0x19, KEY_SHIFT},      /* V */\r
+    {0x1a, KEY_SHIFT},      /* W */\r
+    {0x1b, KEY_SHIFT},      /* X */\r
+    {0x1c, KEY_SHIFT},      /* Y */\r
+    {0x1d, KEY_SHIFT},      /* Z */\r
+    {0x2f, 0},          /* [ */\r
+    {0x64, 0},          /* \ */\r
+    {0x30, 0},          /* ] */\r
+    {0x23, KEY_SHIFT},      /* ^ */\r
+    {0x2d, KEY_SHIFT},      /* _ */\r
+    {0x35, 0},          /* ` */\r
+    {0x04, 0},          /* a */\r
+    {0x05, 0},          /* b */\r
+    {0x06, 0},          /* c */\r
+    {0x07, 0},          /* d */\r
+    {0x08, 0},          /* e */\r
+    {0x09, 0},          /* f */\r
+    {0x0a, 0},          /* g */\r
+    {0x0b, 0},          /* h */\r
+    {0x0c, 0},          /* i */\r
+    {0x0d, 0},          /* j */\r
+    {0x0e, 0},          /* k */\r
+    {0x0f, 0},          /* l */\r
+    {0x10, 0},          /* m */\r
+    {0x11, 0},          /* n */\r
+    {0x12, 0},          /* o */\r
+    {0x13, 0},          /* p */\r
+    {0x14, 0},          /* q */\r
+    {0x15, 0},          /* r */\r
+    {0x16, 0},          /* s */\r
+    {0x17, 0},          /* t */\r
+    {0x18, 0},          /* u */\r
+    {0x19, 0},          /* v */\r
+    {0x1a, 0},          /* w */\r
+    {0x1b, 0},          /* x */\r
+    {0x1c, 0},          /* y */\r
+    {0x1d, 0},          /* z */\r
+    {0x2f, KEY_SHIFT},      /* { */\r
+    {0x64, KEY_SHIFT},      /* | */\r
+    {0x30, KEY_SHIFT},      /* } */\r
+    {0x32, KEY_SHIFT},      /* ~ */\r
+    {0,0},             /* DEL */\r
+\r
+    {0x3a, 0},          /* F1 */\r
+    {0x3b, 0},          /* F2 */\r
+    {0x3c, 0},          /* F3 */\r
+    {0x3d, 0},          /* F4 */\r
+    {0x3e, 0},          /* F5 */\r
+    {0x3f, 0},          /* F6 */\r
+    {0x40, 0},          /* F7 */\r
+    {0x41, 0},          /* F8 */\r
+    {0x42, 0},          /* F9 */\r
+    {0x43, 0},          /* F10 */\r
+    {0x44, 0},          /* F11 */\r
+    {0x45, 0},          /* F12 */\r
+\r
+    {0x46, 0},          /* PRINT_SCREEN */\r
+    {0x47, 0},          /* SCROLL_LOCK */\r
+    {0x39, 0},          /* CAPS_LOCK */\r
+    {0x53, 0},          /* NUM_LOCK */\r
+    {0x49, 0},          /* INSERT */\r
+    {0x4a, 0},          /* HOME */\r
+    {0x4b, 0},          /* PAGE_UP */\r
+    {0x4e, 0},          /* PAGE_DOWN */\r
+};\r
+#endif\r
+\r
+uint8_t * USBKeyboard::reportDesc() {\r
+    static uint8_t reportDescriptor[] = {\r
+        USAGE_PAGE(1), 0x01,                    // Generic Desktop\r
+        USAGE(1), 0x06,                         // Keyboard\r
+        COLLECTION(1), 0x01,                    // Application\r
+        REPORT_ID(1),       REPORT_ID_KEYBOARD,\r
+\r
+        USAGE_PAGE(1), 0x07,                    // Key Codes\r
+        USAGE_MINIMUM(1), 0xE0,\r
+        USAGE_MAXIMUM(1), 0xE7,\r
+        LOGICAL_MINIMUM(1), 0x00,\r
+        LOGICAL_MAXIMUM(1), 0x01,\r
+        REPORT_SIZE(1), 0x01,\r
+        REPORT_COUNT(1), 0x08,\r
+        INPUT(1), 0x02,                         // Data, Variable, Absolute\r
+        REPORT_COUNT(1), 0x01,\r
+        REPORT_SIZE(1), 0x08,\r
+        INPUT(1), 0x01,                         // Constant\r
+\r
+\r
+        REPORT_COUNT(1), 0x05,\r
+        REPORT_SIZE(1), 0x01,\r
+        USAGE_PAGE(1), 0x08,                    // LEDs\r
+        USAGE_MINIMUM(1), 0x01,\r
+        USAGE_MAXIMUM(1), 0x05,\r
+        OUTPUT(1), 0x02,                        // Data, Variable, Absolute\r
+        REPORT_COUNT(1), 0x01,\r
+        REPORT_SIZE(1), 0x03,\r
+        OUTPUT(1), 0x01,                        // Constant\r
+\r
+\r
+        REPORT_COUNT(1), 0x06,\r
+        REPORT_SIZE(1), 0x08,\r
+        LOGICAL_MINIMUM(1), 0x00,\r
+        LOGICAL_MAXIMUM(1), 0x65,\r
+        USAGE_PAGE(1), 0x07,                    // Key Codes\r
+        USAGE_MINIMUM(1), 0x00,\r
+        USAGE_MAXIMUM(1), 0x65,\r
+        INPUT(1), 0x00,                         // Data, Array\r
+        END_COLLECTION(0),\r
+\r
+        // Media Control\r
+        USAGE_PAGE(1), 0x0C,\r
+        USAGE(1), 0x01,\r
+        COLLECTION(1), 0x01,\r
+        REPORT_ID(1), REPORT_ID_VOLUME,\r
+        USAGE_PAGE(1), 0x0C,\r
+        LOGICAL_MINIMUM(1), 0x00,\r
+        LOGICAL_MAXIMUM(1), 0x01,\r
+        REPORT_SIZE(1), 0x01,\r
+        REPORT_COUNT(1), 0x07,\r
+        USAGE(1), 0xB5,             // Next Track\r
+        USAGE(1), 0xB6,             // Previous Track\r
+        USAGE(1), 0xB7,             // Stop\r
+        USAGE(1), 0xCD,             // Play / Pause\r
+        USAGE(1), 0xE2,             // Mute\r
+        USAGE(1), 0xE9,             // Volume Up\r
+        USAGE(1), 0xEA,             // Volume Down\r
+        INPUT(1), 0x02,             // Input (Data, Variable, Absolute)\r
+        REPORT_COUNT(1), 0x01,\r
+        INPUT(1), 0x01,\r
+        END_COLLECTION(0),\r
+    };\r
+    reportLength = sizeof(reportDescriptor);\r
+    return reportDescriptor;\r
+}\r
+\r
+\r
+bool USBKeyboard::EP1_OUT_callback() {\r
+    uint16_t bytesRead = 0;\r
+    uint8_t led[65];\r
+    USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);\r
+    \r
+    // we take led[1] because led[0] is the report ID\r
+    lock_status = led[1] & 0x07;\r
+    \r
+    // We activate the endpoint to be able to recceive data\r
+    if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))\r
+        return false;\r
+    return true;\r
+}\r
+\r
+uint8_t USBKeyboard::lockStatus() {\r
+    return lock_status;\r
+}\r
+\r
+int USBKeyboard::_putc(int c) {\r
+    return keyCode(c, keymap[c].modifier);\r
+}\r
+\r
+bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {\r
+    // Send a simulated keyboard keypress. Returns true if successful.\r
+    HID_REPORT report;\r
+\r
+    report.data[0] = REPORT_ID_KEYBOARD;\r
+    report.data[1] = modifier;\r
+    report.data[2] = 0;\r
+    report.data[3] = keymap[key].usage;\r
+    report.data[4] = 0;\r
+    report.data[5] = 0;\r
+    report.data[6] = 0;\r
+    report.data[7] = 0;\r
+    report.data[8] = 0;\r
+\r
+    report.length = 9;\r
+\r
+    if (!send(&report)) {\r
+        return false;\r
+    }\r
+\r
+    report.data[1] = 0;\r
+    report.data[3] = 0;\r
+\r
+    if (!send(&report)) {\r
+        return false;\r
+    }\r
+\r
+    return true;\r
+\r
+}\r
+\r
+\r
+bool USBKeyboard::mediaControl(MEDIA_KEY key) {\r
+    HID_REPORT report;\r
+\r
+    report.data[0] = REPORT_ID_VOLUME;\r
+    report.data[1] = (1 << key) & 0x7f;\r
+\r
+    report.length = 2;\r
+\r
+    if (!send(&report)) {\r
+        return false;\r
+    }\r
+\r
+    report.data[0] = REPORT_ID_VOLUME;\r
+    report.data[1] = 0;\r
+\r
+    report.length = 2;\r
+\r
+    return send(&report);\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBKeyboard.h b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBKeyboard.h
new file mode 100644 (file)
index 0000000..0a369e2
--- /dev/null
@@ -0,0 +1,170 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBKEYBOARD_H
+#define USBKEYBOARD_H
+
+#include "USBHID.h"
+#include "Stream.h"
+
+/* Modifiers */
+enum MODIFIER_KEY
+{
+    KEY_CTRL = 1,
+    KEY_SHIFT = 2,
+    KEY_ALT = 4,
+};
+
+
+enum MEDIA_KEY
+{
+    KEY_NEXT_TRACK,     /*!< next Track Button */
+    KEY_PREVIOUS_TRACK, /*!< Previous track Button */
+    KEY_STOP,           /*!< Stop Button */
+    KEY_PLAY_PAUSE,     /*!< Play/Pause Button */
+    KEY_MUTE,           /*!< Mute Button */
+    KEY_VOLUME_UP,      /*!< Volume Up Button */
+    KEY_VOLUME_DOWN,    /*!< Volume Down Button */
+};
+
+enum FUNCTION_KEY
+{
+    KEY_F1 = 128,   /* F1 key */
+    KEY_F2,         /* F2 key */
+    KEY_F3,         /* F3 key */
+    KEY_F4,         /* F4 key */
+    KEY_F5,         /* F5 key */
+    KEY_F6,         /* F6 key */
+    KEY_F7,         /* F7 key */
+    KEY_F8,         /* F8 key */
+    KEY_F9,         /* F9 key */
+    KEY_F10,        /* F10 key */
+    KEY_F11,        /* F11 key */
+    KEY_F12,        /* F12 key */
+    KEY_PRINT_SCREEN,   /* Print Screen key */
+    KEY_SCROLL_LOCK, /* Scroll lock */
+    KEY_CAPS_LOCK,   /* caps lock */
+    KEY_NUM_LOCK,   /* num lock */
+    KEY_INSERT,         /* Insert key */
+    KEY_HOME,           /* Home key */
+    KEY_PAGE_UP,        /* Page Up key */
+    KEY_PAGE_DOWN,      /* Page Down key */
+};
+
+/** 
+ * USBKeyboard example
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "USBKeyboard.h"
+ *
+ * USBKeyboard key;
+ * 
+ * int main(void)
+ * {
+ *   while (1)
+ *   {
+ *       key.printf("Hello World\r\n");
+ *       wait(1);
+ *   }
+ * }
+ *
+ * @endcode
+ */
+class USBKeyboard: public USBHID, public Stream
+{
+    public:
+    
+        /**
+        *   Constructor
+        *
+        *
+        * @param leds Leds bus: first: NUM_LOCK, second: CAPS_LOCK, third: SCROLL_LOCK
+        * @param vendor_id Your vendor_id (default: 0x1235)
+        * @param product_id Your product_id (default: 0x0050)
+        * @param product_release Your preoduct_release (default: 0x0001)
+        *
+        */
+        USBKeyboard(uint16_t vendor_id = 0x1235, uint16_t product_id = 0x0050, uint16_t product_release = 0x0001): 
+            USBHID(0, 0, vendor_id, product_id, product_release, false){
+                lock_status = 0;
+                connect();
+            };
+        
+        /**
+        * To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key 
+        *
+        * @code
+        * //To send CTRL + s (save)
+        *  keyboard.keyCode('s', KEY_CTRL);
+        * @endcode
+        *
+        * @param modifier bit 0: KEY_CTRL, bit 1: KEY_SHIFT, bit 2: KEY_ALT (default: 0)
+        * @param key character to send
+        * @returns true if there is no error, false otherwise
+        */
+        bool keyCode(uint8_t key, uint8_t modifier = 0);
+        
+        /**
+        * Send a character
+        *
+        * @param c character to be sent
+        * @returns true if there is no error, false otherwise
+        */
+        virtual int _putc(int c);
+        
+        /**
+        * Control media keys
+        *
+        * @param key media key pressed (KEY_NEXT_TRACK, KEY_PREVIOUS_TRACK, KEY_STOP, KEY_PLAY_PAUSE, KEY_MUTE, KEY_VOLUME_UP, KEY_VOLUME_DOWN)
+        * @returns true if there is no error, false otherwise
+        */
+        bool mediaControl(MEDIA_KEY key);
+        
+        /*
+        * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+        *
+        * @returns pointer to the report descriptor
+        */
+        virtual uint8_t * reportDesc();
+        
+        /*
+        * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
+        *
+        * @returns if handle by subclass, return true
+        */
+        virtual bool EP1_OUT_callback();
+        
+        /**
+        * Read status of lock keys. Useful to switch-on/off leds according to key pressed. Only the first three bits of the result is important:
+        *   - First bit: NUM_LOCK
+        *   - Second bit: CAPS_LOCK
+        *   - Third bit: SCROLL_LOCK
+        *
+        * @returns status of lock keys
+        */
+        uint8_t lockStatus();
+        
+   private:
+        //dummy otherwise it doesn,t compile (we must define all methods of an abstract class)
+        virtual int _getc() { return -1;};
+        
+        uint8_t lock_status;
+};
+
+#endif
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouse.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouse.cpp
new file mode 100644 (file)
index 0000000..e3473e1
--- /dev/null
@@ -0,0 +1,190 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBMouse.h"\r
+\r
+bool USBMouse::update(int16_t x, int16_t y, uint8_t button, int8_t z) {\r
+    switch (mouse_type) {\r
+        case REL_MOUSE:\r
+            while (x > 127) {\r
+                if (!mouseSend(127, 0, button, z)) return false;\r
+                x = x - 127;\r
+            }\r
+            while (x < -128) {\r
+                if (!mouseSend(-128, 0, button, z)) return false;\r
+                x = x + 128;\r
+            }\r
+            while (y > 127) {\r
+                if (!mouseSend(0, 127, button, z)) return false;\r
+                y = y - 127;\r
+            }\r
+            while (y < -128) {\r
+                if (!mouseSend(0, -128, button, z)) return false;\r
+                y = y + 128;\r
+            }\r
+            return mouseSend(x, y, button, z);\r
+        case ABS_MOUSE:\r
+            HID_REPORT report;\r
+\r
+            report.data[0] = x & 0xff;\r
+            report.data[1] = (x >> 8) & 0xff;\r
+            report.data[2] = y & 0xff;\r
+            report.data[3] = (y >> 8) & 0xff;\r
+            report.data[4] = -z;\r
+            report.data[5] = button & 0x07;\r
+\r
+            report.length = 6;\r
+\r
+            return send(&report);\r
+        default:\r
+            return false;\r
+    }\r
+}\r
+\r
+bool USBMouse::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {\r
+    HID_REPORT report;\r
+    report.data[0] = buttons & 0x07;\r
+    report.data[1] = x;\r
+    report.data[2] = y;\r
+    report.data[3] = -z; // >0 to scroll down, <0 to scroll up\r
+\r
+    report.length = 4;\r
+\r
+    return send(&report);\r
+}\r
+\r
+bool USBMouse::move(int16_t x, int16_t y) {\r
+    return update(x, y, button, 0);\r
+}\r
+\r
+bool USBMouse::scroll(int8_t z) {\r
+    return update(0, 0, button, z);\r
+}\r
+\r
+\r
+bool USBMouse::doubleClick() {\r
+    if (!click(MOUSE_LEFT))\r
+        return false;\r
+    wait(0.1);\r
+    return click(MOUSE_LEFT);\r
+}\r
+\r
+bool USBMouse::click(uint8_t button) {\r
+    if (!update(0, 0, button, 0))\r
+        return false;\r
+    wait(0.01);\r
+    return update(0, 0, 0, 0);\r
+}\r
+\r
+bool USBMouse::press(uint8_t button_) {\r
+    button = button_ & 0x07;\r
+    return update(0, 0, button, 0);\r
+}\r
+\r
+bool USBMouse::release(uint8_t button_) {\r
+    button = (button & (~button_)) & 0x07;\r
+    return update(0, 0, button, 0);\r
+}\r
+\r
+\r
+uint8_t * USBMouse::reportDesc() {\r
+\r
+    if (mouse_type == REL_MOUSE) {\r
+        static uint8_t reportDescriptor[] = {\r
+            USAGE_PAGE(1),      0x01,       // Genric Desktop\r
+            USAGE(1),           0x02,       // Mouse\r
+            COLLECTION(1),      0x01,       // Application\r
+            USAGE(1),           0x01,       // Pointer\r
+            COLLECTION(1),      0x00,       // Physical\r
+\r
+            REPORT_COUNT(1),    0x03,\r
+            REPORT_SIZE(1),     0x01,\r
+            USAGE_PAGE(1),      0x09,       // Buttons\r
+            USAGE_MINIMUM(1),       0x1,\r
+            USAGE_MAXIMUM(1),       0x3,\r
+            LOGICAL_MINIMUM(1),     0x00,\r
+            LOGICAL_MAXIMUM(1),     0x01,\r
+            INPUT(1),           0x02,\r
+            REPORT_COUNT(1),    0x01,\r
+            REPORT_SIZE(1),     0x05,\r
+            INPUT(1),           0x01,\r
+\r
+            REPORT_COUNT(1),    0x03,\r
+            REPORT_SIZE(1),     0x08,\r
+            USAGE_PAGE(1),      0x01,\r
+            USAGE(1),           0x30,       // X\r
+            USAGE(1),           0x31,       // Y\r
+            USAGE(1),           0x38,       // scroll\r
+            LOGICAL_MINIMUM(1),     0x81,\r
+            LOGICAL_MAXIMUM(1),     0x7f,\r
+            INPUT(1),           0x06,       // Relative data\r
+\r
+            END_COLLECTION(0),\r
+            END_COLLECTION(0),\r
+        };\r
+        reportLength = sizeof(reportDescriptor);\r
+        return reportDescriptor;\r
+    } else if (mouse_type == ABS_MOUSE) {\r
+        static uint8_t reportDescriptor[] = {\r
+\r
+            USAGE_PAGE(1), 0x01,           // Generic Desktop\r
+            USAGE(1), 0x02,                // Mouse\r
+            COLLECTION(1), 0x01,           // Application\r
+            USAGE(1), 0x01,                // Pointer\r
+            COLLECTION(1), 0x00,           // Physical\r
+\r
+            USAGE_PAGE(1), 0x01,            // Generic Desktop\r
+            USAGE(1), 0x30,                 // X\r
+            USAGE(1), 0x31,                 // Y\r
+            LOGICAL_MINIMUM(1), 0x00,       // 0\r
+            LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767\r
+            REPORT_SIZE(1), 0x10,\r
+            REPORT_COUNT(1), 0x02,\r
+            INPUT(1), 0x02,                 // Data, Variable, Absolute\r
+\r
+            USAGE_PAGE(1), 0x01,            // Generic Desktop\r
+            USAGE(1), 0x38,                 // scroll\r
+            LOGICAL_MINIMUM(1), 0x81,       // -127\r
+            LOGICAL_MAXIMUM(1), 0x7f,       // 127\r
+            REPORT_SIZE(1), 0x08,\r
+            REPORT_COUNT(1), 0x01,\r
+            INPUT(1), 0x06,                 // Data, Variable, Relative\r
+\r
+            USAGE_PAGE(1), 0x09,            // Buttons\r
+            USAGE_MINIMUM(1), 0x01,\r
+            USAGE_MAXIMUM(1), 0x03,\r
+            LOGICAL_MINIMUM(1), 0x00,       // 0\r
+            LOGICAL_MAXIMUM(1), 0x01,       // 1\r
+            REPORT_COUNT(1), 0x03,\r
+            REPORT_SIZE(1), 0x01,\r
+            INPUT(1), 0x02,                 // Data, Variable, Absolute\r
+            REPORT_COUNT(1), 0x01,\r
+            REPORT_SIZE(1), 0x05,\r
+            INPUT(1), 0x01,                 // Constant\r
+\r
+            END_COLLECTION(0),\r
+            END_COLLECTION(0)\r
+        };\r
+        reportLength = sizeof(reportDescriptor);\r
+        return reportDescriptor;\r
+    }\r
+    return NULL;\r
+}\r
+\r
+\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouse.h b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouse.h
new file mode 100644 (file)
index 0000000..23eb925
--- /dev/null
@@ -0,0 +1,187 @@
+/* USBMouse.h */\r
+/* USB device example: relative mouse */\r
+/* Copyright (c) 2011 ARM Limited. All rights reserved. */\r
+\r
+#ifndef USBMOUSE_H\r
+#define USBMOUSE_H\r
+\r
+#include "USBHID.h"\r
+\r
+#define REPORT_ID_MOUSE   2\r
+\r
+/* Common usage */\r
+\r
+enum MOUSE_BUTTON\r
+{\r
+    MOUSE_LEFT = 1,\r
+    MOUSE_RIGHT = 2,\r
+    MOUSE_MIDDLE = 4,\r
+};\r
+\r
+/* X and Y limits */\r
+/* These values do not directly map to screen pixels */\r
+/* Zero may be interpreted as meaning 'no movement' */\r
+#define X_MIN_ABS    (1)        /*!< Minimum value on x-axis */  \r
+#define Y_MIN_ABS    (1)        /*!< Minimum value on y-axis */\r
+#define X_MAX_ABS    (0x7fff)   /*!< Maximum value on x-axis */\r
+#define Y_MAX_ABS    (0x7fff)   /*!< Maximum value on y-axis */\r
+\r
+#define X_MIN_REL    (-127)     /*!< The maximum value that we can move to the left on the x-axis */\r
+#define Y_MIN_REL    (-127)     /*!< The maximum value that we can move up on the y-axis */\r
+#define X_MAX_REL    (127)      /*!< The maximum value that we can move to the right on the x-axis */\r
+#define Y_MAX_REL    (127)      /*!< The maximum value that we can move down on the y-axis */\r
+\r
+enum MOUSE_TYPE\r
+{\r
+    ABS_MOUSE,\r
+    REL_MOUSE,\r
+};\r
+\r
+/**\r
+ *\r
+ * USBMouse example\r
+ * @code\r
+ * #include "mbed.h"\r
+ * #include "USBMouse.h"\r
+ *\r
+ * USBMouse mouse;\r
+ *\r
+ * int main(void)\r
+ * {\r
+ *   while (1)\r
+ *   {\r
+ *      mouse.move(20, 0);\r
+ *      wait(0.5);\r
+ *   }\r
+ * }\r
+ *\r
+ * @endcode\r
+ *\r
+ *\r
+ * @code\r
+ * #include "mbed.h"\r
+ * #include "USBMouse.h"\r
+ * #include <math.h>\r
+ *\r
+ * USBMouse mouse(ABS_MOUSE);\r
+ *\r
+ * int main(void)\r
+ * {\r
+ *   uint16_t x_center = (X_MAX_ABS - X_MIN_ABS)/2;\r
+ *   uint16_t y_center = (Y_MAX_ABS - Y_MIN_ABS)/2;\r
+ *   uint16_t x_screen = 0;\r
+ *   uint16_t y_screen = 0;\r
+ *   \r
+ *   uint32_t x_origin = x_center;\r
+ *   uint32_t y_origin = y_center;\r
+ *   uint32_t radius = 5000;\r
+ *   uint32_t angle = 0;\r
+ *\r
+ *   while (1)\r
+ *   {\r
+ *       x_screen = x_origin + cos((double)angle*3.14/180.0)*radius;\r
+ *       y_screen = y_origin + sin((double)angle*3.14/180.0)*radius;\r
+ *       \r
+ *       mouse.move(x_screen, y_screen);\r
+ *       angle += 3;\r
+ *       wait(0.01);\r
+ *   }\r
+ * }\r
+ *\r
+ * @endcode\r
+ */\r
+class USBMouse: public USBHID\r
+{\r
+    public:\r
+        \r
+        /**\r
+        *   Constructor\r
+        *\r
+        * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)\r
+        * @param vendor_id Your vendor_id (default: 0x1234)\r
+        * @param product_id Your product_id (default: 0x0001)\r
+        * @param product_release Your preoduct_release (default: 0x0001)\r
+        *\r
+        */\r
+        USBMouse(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0001, uint16_t product_release = 0x0001): \r
+            USBHID(0, 0, vendor_id, product_id, product_release, false)\r
+            { \r
+                button = 0;\r
+                this->mouse_type = mouse_type;\r
+                connect();\r
+            };\r
+        \r
+        /**\r
+        * Write a state of the mouse\r
+        *\r
+        * @param x x-axis position\r
+        * @param y y-axis position\r
+        * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)\r
+        * @param z wheel state (>0 to scroll down, <0 to scroll up)\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);\r
+        \r
+        \r
+        /**\r
+        * Move the cursor to (x, y)\r
+        *\r
+        * @param x-axis position\r
+        * @param y-axis position\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool move(int16_t x, int16_t y);\r
+        \r
+        /**\r
+        * Press one or several buttons\r
+        *\r
+        * @param button button state (ex: press(MOUSE_LEFT))\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool press(uint8_t button);\r
+        \r
+        /**\r
+        * Release one or several buttons\r
+        *\r
+        * @param button button state (ex: release(MOUSE_LEFT))\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool release(uint8_t button);\r
+        \r
+        /**\r
+        * Double click (MOUSE_LEFT)\r
+        *\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool doubleClick();\r
+        \r
+        /**\r
+        * Click\r
+        *\r
+        * @param button state of the buttons ( ex: clic(MOUSE_LEFT))\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool click(uint8_t button); \r
+        \r
+        /**\r
+        * Scrolling\r
+        *\r
+        * @param z value of the wheel (>0 to go down, <0 to go up)\r
+        * @returns true if there is no error, false otherwise\r
+        */\r
+        bool scroll(int8_t z);\r
+        \r
+        /*\r
+        * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.\r
+        *\r
+        * @returns pointer to the report descriptor\r
+        */\r
+        virtual uint8_t * reportDesc();\r
+        \r
+    private:\r
+        MOUSE_TYPE mouse_type;\r
+        uint8_t button;\r
+        bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);\r
+};\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouseKeyboard.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouseKeyboard.cpp
new file mode 100644 (file)
index 0000000..387f9c1
--- /dev/null
@@ -0,0 +1,696 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBMouseKeyboard.h"\r
+\r
+typedef struct {\r
+    unsigned char usage;\r
+    unsigned char modifier;\r
+} KEYMAP;\r
+\r
+#ifdef US_KEYBOARD\r
+/* US keyboard (as HID standard) */\r
+#define KEYMAP_SIZE (148)\r
+const KEYMAP keymap[KEYMAP_SIZE] = {\r
+    {0, 0},             /* NUL */\r
+    {0, 0},             /* SOH */\r
+    {0, 0},             /* STX */\r
+    {0, 0},             /* ETX */\r
+    {0, 0},             /* EOT */\r
+    {0, 0},             /* ENQ */\r
+    {0, 0},             /* ACK */\r
+    {0, 0},             /* BEL */\r
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */\r
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */\r
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */\r
+    {0, 0},             /* VT  */\r
+    {0, 0},             /* FF  */\r
+    {0, 0},             /* CR  */\r
+    {0, 0},             /* SO  */\r
+    {0, 0},             /* SI  */\r
+    {0, 0},             /* DEL */\r
+    {0, 0},             /* DC1 */\r
+    {0, 0},             /* DC2 */\r
+    {0, 0},             /* DC3 */\r
+    {0, 0},             /* DC4 */\r
+    {0, 0},             /* NAK */\r
+    {0, 0},             /* SYN */\r
+    {0, 0},             /* ETB */\r
+    {0, 0},             /* CAN */\r
+    {0, 0},             /* EM  */\r
+    {0, 0},             /* SUB */\r
+    {0, 0},             /* ESC */\r
+    {0, 0},             /* FS  */\r
+    {0, 0},             /* GS  */\r
+    {0, 0},             /* RS  */\r
+    {0, 0},             /* US  */\r
+    {0x2c, 0},          /*   */\r
+    {0x1e, KEY_SHIFT},      /* ! */\r
+    {0x34, KEY_SHIFT},      /* " */\r
+    {0x20, KEY_SHIFT},      /* # */\r
+    {0x21, KEY_SHIFT},      /* $ */\r
+    {0x22, KEY_SHIFT},      /* % */\r
+    {0x24, KEY_SHIFT},      /* & */\r
+    {0x34, 0},          /* ' */\r
+    {0x26, KEY_SHIFT},      /* ( */\r
+    {0x27, KEY_SHIFT},      /* ) */\r
+    {0x25, KEY_SHIFT},      /* * */\r
+    {0x2e, KEY_SHIFT},      /* + */\r
+    {0x36, 0},          /* , */\r
+    {0x2d, 0},          /* - */\r
+    {0x37, 0},          /* . */\r
+    {0x38, 0},          /* / */\r
+    {0x27, 0},          /* 0 */\r
+    {0x1e, 0},          /* 1 */\r
+    {0x1f, 0},          /* 2 */\r
+    {0x20, 0},          /* 3 */\r
+    {0x21, 0},          /* 4 */\r
+    {0x22, 0},          /* 5 */\r
+    {0x23, 0},          /* 6 */\r
+    {0x24, 0},          /* 7 */\r
+    {0x25, 0},          /* 8 */\r
+    {0x26, 0},          /* 9 */\r
+    {0x33, KEY_SHIFT},      /* : */\r
+    {0x33, 0},          /* ; */\r
+    {0x36, KEY_SHIFT},      /* < */\r
+    {0x2e, 0},          /* = */\r
+    {0x37, KEY_SHIFT},      /* > */\r
+    {0x38, KEY_SHIFT},      /* ? */\r
+    {0x1f, KEY_SHIFT},      /* @ */\r
+    {0x04, KEY_SHIFT},      /* A */\r
+    {0x05, KEY_SHIFT},      /* B */\r
+    {0x06, KEY_SHIFT},      /* C */\r
+    {0x07, KEY_SHIFT},      /* D */\r
+    {0x08, KEY_SHIFT},      /* E */\r
+    {0x09, KEY_SHIFT},      /* F */\r
+    {0x0a, KEY_SHIFT},      /* G */\r
+    {0x0b, KEY_SHIFT},      /* H */\r
+    {0x0c, KEY_SHIFT},      /* I */\r
+    {0x0d, KEY_SHIFT},      /* J */\r
+    {0x0e, KEY_SHIFT},      /* K */\r
+    {0x0f, KEY_SHIFT},      /* L */\r
+    {0x10, KEY_SHIFT},      /* M */\r
+    {0x11, KEY_SHIFT},      /* N */\r
+    {0x12, KEY_SHIFT},      /* O */\r
+    {0x13, KEY_SHIFT},      /* P */\r
+    {0x14, KEY_SHIFT},      /* Q */\r
+    {0x15, KEY_SHIFT},      /* R */\r
+    {0x16, KEY_SHIFT},      /* S */\r
+    {0x17, KEY_SHIFT},      /* T */\r
+    {0x18, KEY_SHIFT},      /* U */\r
+    {0x19, KEY_SHIFT},      /* V */\r
+    {0x1a, KEY_SHIFT},      /* W */\r
+    {0x1b, KEY_SHIFT},      /* X */\r
+    {0x1c, KEY_SHIFT},      /* Y */\r
+    {0x1d, KEY_SHIFT},      /* Z */\r
+    {0x2f, 0},          /* [ */\r
+    {0x31, 0},          /* \ */\r
+    {0x30, 0},          /* ] */\r
+    {0x23, KEY_SHIFT},      /* ^ */\r
+    {0x2d, KEY_SHIFT},      /* _ */\r
+    {0x35, 0},          /* ` */\r
+    {0x04, 0},          /* a */\r
+    {0x05, 0},          /* b */\r
+    {0x06, 0},          /* c */\r
+    {0x07, 0},          /* d */\r
+    {0x08, 0},          /* e */\r
+    {0x09, 0},          /* f */\r
+    {0x0a, 0},          /* g */\r
+    {0x0b, 0},          /* h */\r
+    {0x0c, 0},          /* i */\r
+    {0x0d, 0},          /* j */\r
+    {0x0e, 0},          /* k */\r
+    {0x0f, 0},          /* l */\r
+    {0x10, 0},          /* m */\r
+    {0x11, 0},          /* n */\r
+    {0x12, 0},          /* o */\r
+    {0x13, 0},          /* p */\r
+    {0x14, 0},          /* q */\r
+    {0x15, 0},          /* r */\r
+    {0x16, 0},          /* s */\r
+    {0x17, 0},          /* t */\r
+    {0x18, 0},          /* u */\r
+    {0x19, 0},          /* v */\r
+    {0x1a, 0},          /* w */\r
+    {0x1b, 0},          /* x */\r
+    {0x1c, 0},          /* y */\r
+    {0x1d, 0},          /* z */\r
+    {0x2f, KEY_SHIFT},      /* { */\r
+    {0x31, KEY_SHIFT},      /* | */\r
+    {0x30, KEY_SHIFT},      /* } */\r
+    {0x35, KEY_SHIFT},      /* ~ */\r
+    {0,0},              /* DEL */\r
+\r
+    {0x3a, 0},          /* F1 */\r
+    {0x3b, 0},          /* F2 */\r
+    {0x3c, 0},          /* F3 */\r
+    {0x3d, 0},          /* F4 */\r
+    {0x3e, 0},          /* F5 */\r
+    {0x3f, 0},          /* F6 */\r
+    {0x40, 0},          /* F7 */\r
+    {0x41, 0},          /* F8 */\r
+    {0x42, 0},          /* F9 */\r
+    {0x43, 0},          /* F10 */\r
+    {0x44, 0},          /* F11 */\r
+    {0x45, 0},          /* F12 */\r
+\r
+    {0x46, 0},          /* PRINT_SCREEN */\r
+    {0x47, 0},          /* SCROLL_LOCK */\r
+    {0x39, 0},          /* CAPS_LOCK */\r
+    {0x53, 0},          /* NUM_LOCK */\r
+    {0x49, 0},          /* INSERT */\r
+    {0x4a, 0},          /* HOME */\r
+    {0x4b, 0},          /* PAGE_UP */\r
+    {0x4e, 0},          /* PAGE_DOWN */\r
+};\r
+\r
+#else\r
+/* UK keyboard */\r
+#define KEYMAP_SIZE (148)\r
+const KEYMAP keymap[KEYMAP_SIZE] = {\r
+    {0, 0},             /* NUL */\r
+    {0, 0},             /* SOH */\r
+    {0, 0},             /* STX */\r
+    {0, 0},             /* ETX */\r
+    {0, 0},             /* EOT */\r
+    {0, 0},             /* ENQ */\r
+    {0, 0},             /* ACK */\r
+    {0, 0},             /* BEL */\r
+    {0x2a, 0},          /* BS  */  /* Keyboard Delete (Backspace) */\r
+    {0x2b, 0},          /* TAB */  /* Keyboard Tab */\r
+    {0x28, 0},          /* LF  */  /* Keyboard Return (Enter) */\r
+    {0, 0},             /* VT  */\r
+    {0, 0},             /* FF  */\r
+    {0, 0},             /* CR  */\r
+    {0, 0},             /* SO  */\r
+    {0, 0},             /* SI  */\r
+    {0, 0},             /* DEL */\r
+    {0, 0},             /* DC1 */\r
+    {0, 0},             /* DC2 */\r
+    {0, 0},             /* DC3 */\r
+    {0, 0},             /* DC4 */\r
+    {0, 0},             /* NAK */\r
+    {0, 0},             /* SYN */\r
+    {0, 0},             /* ETB */\r
+    {0, 0},             /* CAN */\r
+    {0, 0},             /* EM  */\r
+    {0, 0},             /* SUB */\r
+    {0, 0},             /* ESC */\r
+    {0, 0},             /* FS  */\r
+    {0, 0},             /* GS  */\r
+    {0, 0},             /* RS  */\r
+    {0, 0},             /* US  */\r
+    {0x2c, 0},          /*   */\r
+    {0x1e, KEY_SHIFT},      /* ! */\r
+    {0x1f, KEY_SHIFT},      /* " */\r
+    {0x32, 0},          /* # */\r
+    {0x21, KEY_SHIFT},      /* $ */\r
+    {0x22, KEY_SHIFT},      /* % */\r
+    {0x24, KEY_SHIFT},      /* & */\r
+    {0x34, 0},          /* ' */\r
+    {0x26, KEY_SHIFT},      /* ( */\r
+    {0x27, KEY_SHIFT},      /* ) */\r
+    {0x25, KEY_SHIFT},      /* * */\r
+    {0x2e, KEY_SHIFT},      /* + */\r
+    {0x36, 0},          /* , */\r
+    {0x2d, 0},          /* - */\r
+    {0x37, 0},          /* . */\r
+    {0x38, 0},          /* / */\r
+    {0x27, 0},          /* 0 */\r
+    {0x1e, 0},          /* 1 */\r
+    {0x1f, 0},          /* 2 */\r
+    {0x20, 0},          /* 3 */\r
+    {0x21, 0},          /* 4 */\r
+    {0x22, 0},          /* 5 */\r
+    {0x23, 0},          /* 6 */\r
+    {0x24, 0},          /* 7 */\r
+    {0x25, 0},          /* 8 */\r
+    {0x26, 0},          /* 9 */\r
+    {0x33, KEY_SHIFT},      /* : */\r
+    {0x33, 0},          /* ; */\r
+    {0x36, KEY_SHIFT},      /* < */\r
+    {0x2e, 0},          /* = */\r
+    {0x37, KEY_SHIFT},      /* > */\r
+    {0x38, KEY_SHIFT},      /* ? */\r
+    {0x34, KEY_SHIFT},      /* @ */\r
+    {0x04, KEY_SHIFT},      /* A */\r
+    {0x05, KEY_SHIFT},      /* B */\r
+    {0x06, KEY_SHIFT},      /* C */\r
+    {0x07, KEY_SHIFT},      /* D */\r
+    {0x08, KEY_SHIFT},      /* E */\r
+    {0x09, KEY_SHIFT},      /* F */\r
+    {0x0a, KEY_SHIFT},      /* G */\r
+    {0x0b, KEY_SHIFT},      /* H */\r
+    {0x0c, KEY_SHIFT},      /* I */\r
+    {0x0d, KEY_SHIFT},      /* J */\r
+    {0x0e, KEY_SHIFT},      /* K */\r
+    {0x0f, KEY_SHIFT},      /* L */\r
+    {0x10, KEY_SHIFT},      /* M */\r
+    {0x11, KEY_SHIFT},      /* N */\r
+    {0x12, KEY_SHIFT},      /* O */\r
+    {0x13, KEY_SHIFT},      /* P */\r
+    {0x14, KEY_SHIFT},      /* Q */\r
+    {0x15, KEY_SHIFT},      /* R */\r
+    {0x16, KEY_SHIFT},      /* S */\r
+    {0x17, KEY_SHIFT},      /* T */\r
+    {0x18, KEY_SHIFT},      /* U */\r
+    {0x19, KEY_SHIFT},      /* V */\r
+    {0x1a, KEY_SHIFT},      /* W */\r
+    {0x1b, KEY_SHIFT},      /* X */\r
+    {0x1c, KEY_SHIFT},      /* Y */\r
+    {0x1d, KEY_SHIFT},      /* Z */\r
+    {0x2f, 0},          /* [ */\r
+    {0x64, 0},          /* \ */\r
+    {0x30, 0},          /* ] */\r
+    {0x23, KEY_SHIFT},      /* ^ */\r
+    {0x2d, KEY_SHIFT},      /* _ */\r
+    {0x35, 0},          /* ` */\r
+    {0x04, 0},          /* a */\r
+    {0x05, 0},          /* b */\r
+    {0x06, 0},          /* c */\r
+    {0x07, 0},          /* d */\r
+    {0x08, 0},          /* e */\r
+    {0x09, 0},          /* f */\r
+    {0x0a, 0},          /* g */\r
+    {0x0b, 0},          /* h */\r
+    {0x0c, 0},          /* i */\r
+    {0x0d, 0},          /* j */\r
+    {0x0e, 0},          /* k */\r
+    {0x0f, 0},          /* l */\r
+    {0x10, 0},          /* m */\r
+    {0x11, 0},          /* n */\r
+    {0x12, 0},          /* o */\r
+    {0x13, 0},          /* p */\r
+    {0x14, 0},          /* q */\r
+    {0x15, 0},          /* r */\r
+    {0x16, 0},          /* s */\r
+    {0x17, 0},          /* t */\r
+    {0x18, 0},          /* u */\r
+    {0x19, 0},          /* v */\r
+    {0x1a, 0},          /* w */\r
+    {0x1b, 0},          /* x */\r
+    {0x1c, 0},          /* y */\r
+    {0x1d, 0},          /* z */\r
+    {0x2f, KEY_SHIFT},      /* { */\r
+    {0x64, KEY_SHIFT},      /* | */\r
+    {0x30, KEY_SHIFT},      /* } */\r
+    {0x32, KEY_SHIFT},      /* ~ */\r
+    {0,0},             /* DEL */\r
+\r
+    {0x3a, 0},          /* F1 */\r
+    {0x3b, 0},          /* F2 */\r
+    {0x3c, 0},          /* F3 */\r
+    {0x3d, 0},          /* F4 */\r
+    {0x3e, 0},          /* F5 */\r
+    {0x3f, 0},          /* F6 */\r
+    {0x40, 0},          /* F7 */\r
+    {0x41, 0},          /* F8 */\r
+    {0x42, 0},          /* F9 */\r
+    {0x43, 0},          /* F10 */\r
+    {0x44, 0},          /* F11 */\r
+    {0x45, 0},          /* F12 */\r
+\r
+    {0x46, 0},          /* PRINT_SCREEN */\r
+    {0x47, 0},          /* SCROLL_LOCK */\r
+    {0x39, 0},          /* CAPS_LOCK */\r
+    {0x53, 0},          /* NUM_LOCK */\r
+    {0x49, 0},          /* INSERT */\r
+    {0x4a, 0},          /* HOME */\r
+    {0x4b, 0},          /* PAGE_UP */\r
+    {0x4e, 0},          /* PAGE_DOWN */\r
+};\r
+#endif\r
+\r
+\r
+uint8_t * USBMouseKeyboard::reportDesc() {\r
+    if (mouse_type == REL_MOUSE) {\r
+        static uint8_t reportDescriptor[] = {\r
+                // Keyboard\r
+                USAGE_PAGE(1),      0x01,\r
+                USAGE(1),           0x06,\r
+                COLLECTION(1),      0x01,\r
+                REPORT_ID(1),       REPORT_ID_KEYBOARD,\r
+                USAGE_PAGE(1),      0x07,\r
+                USAGE_MINIMUM(1),       0xE0,\r
+                USAGE_MAXIMUM(1),       0xE7,\r
+                LOGICAL_MINIMUM(1),     0x00,\r
+                LOGICAL_MAXIMUM(1),     0x01,\r
+                REPORT_SIZE(1),     0x01,\r
+                REPORT_COUNT(1),    0x08,\r
+                INPUT(1),           0x02,\r
+                REPORT_COUNT(1),    0x01,\r
+                REPORT_SIZE(1),     0x08,\r
+                INPUT(1),           0x01,\r
+                REPORT_COUNT(1),    0x05,\r
+                REPORT_SIZE(1),     0x01,\r
+                USAGE_PAGE(1),      0x08,\r
+                USAGE_MINIMUM(1),       0x01,\r
+                USAGE_MAXIMUM(1),       0x05,\r
+                OUTPUT(1),          0x02,\r
+                REPORT_COUNT(1),    0x01,\r
+                REPORT_SIZE(1),     0x03,\r
+                OUTPUT(1),          0x01,\r
+                REPORT_COUNT(1),    0x06,\r
+                REPORT_SIZE(1),     0x08,\r
+                LOGICAL_MINIMUM(1),     0x00,\r
+                LOGICAL_MAXIMUM(2),     0xff, 0x00,\r
+                USAGE_PAGE(1),      0x07,\r
+                USAGE_MINIMUM(1),       0x00,\r
+                USAGE_MAXIMUM(2),       0xff, 0x00,\r
+                INPUT(1),           0x00,\r
+                END_COLLECTION(0),\r
+\r
+                // Mouse\r
+                USAGE_PAGE(1),      0x01,           // Generic Desktop\r
+                USAGE(1),           0x02,           // Mouse\r
+                COLLECTION(1),      0x01,           // Application\r
+                USAGE(1),           0x01,           // Pointer\r
+                COLLECTION(1),      0x00,           // Physical\r
+                REPORT_ID(1),       REPORT_ID_MOUSE,\r
+                REPORT_COUNT(1),    0x03,\r
+                REPORT_SIZE(1),     0x01,\r
+                USAGE_PAGE(1),      0x09,           // Buttons\r
+                USAGE_MINIMUM(1),       0x1,\r
+                USAGE_MAXIMUM(1),       0x3,\r
+                LOGICAL_MINIMUM(1),     0x00,\r
+                LOGICAL_MAXIMUM(1),     0x01,\r
+                INPUT(1),           0x02,\r
+                REPORT_COUNT(1),    0x01,\r
+                REPORT_SIZE(1),     0x05,\r
+                INPUT(1),           0x01,\r
+                REPORT_COUNT(1),    0x03,\r
+                REPORT_SIZE(1),     0x08,\r
+                USAGE_PAGE(1),      0x01,\r
+                USAGE(1),           0x30,           // X\r
+                USAGE(1),           0x31,           // Y\r
+                USAGE(1),           0x38,           // scroll\r
+                LOGICAL_MINIMUM(1),     0x81,\r
+                LOGICAL_MAXIMUM(1),     0x7f,\r
+                INPUT(1),           0x06,\r
+                END_COLLECTION(0),\r
+                END_COLLECTION(0),\r
+\r
+\r
+                // Media Control\r
+                USAGE_PAGE(1), 0x0C,\r
+                USAGE(1), 0x01,\r
+                COLLECTION(1), 0x01,\r
+                REPORT_ID(1), REPORT_ID_VOLUME,\r
+                USAGE_PAGE(1), 0x0C,\r
+                LOGICAL_MINIMUM(1), 0x00,\r
+                LOGICAL_MAXIMUM(1), 0x01,\r
+                REPORT_SIZE(1), 0x01,\r
+                REPORT_COUNT(1), 0x07,\r
+                USAGE(1), 0xB5,             // Next Track\r
+                USAGE(1), 0xB6,             // Previous Track\r
+                USAGE(1), 0xB7,             // Stop\r
+                USAGE(1), 0xCD,             // Play / Pause\r
+                USAGE(1), 0xE2,             // Mute\r
+                USAGE(1), 0xE9,             // Volume Up\r
+                USAGE(1), 0xEA,             // Volume Down\r
+                INPUT(1), 0x02,             // Input (Data, Variable, Absolute)\r
+                REPORT_COUNT(1), 0x01,\r
+                INPUT(1), 0x01,\r
+                END_COLLECTION(0),\r
+        };\r
+        reportLength = sizeof(reportDescriptor);\r
+        return reportDescriptor;\r
+    } else if (mouse_type == ABS_MOUSE) {\r
+        static uint8_t reportDescriptor[] = {\r
+\r
+                // Keyboard\r
+                USAGE_PAGE(1),      0x01,\r
+                USAGE(1),           0x06,\r
+                COLLECTION(1),      0x01,\r
+                REPORT_ID(1),       REPORT_ID_KEYBOARD,\r
+                USAGE_PAGE(1),      0x07,\r
+                USAGE_MINIMUM(1),       0xE0,\r
+                USAGE_MAXIMUM(1),       0xE7,\r
+                LOGICAL_MINIMUM(1),     0x00,\r
+                LOGICAL_MAXIMUM(1),     0x01,\r
+                REPORT_SIZE(1),     0x01,\r
+                REPORT_COUNT(1),    0x08,\r
+                INPUT(1),           0x02,\r
+                REPORT_COUNT(1),    0x01,\r
+                REPORT_SIZE(1),     0x08,\r
+                INPUT(1),           0x01,\r
+                REPORT_COUNT(1),    0x05,\r
+                REPORT_SIZE(1),     0x01,\r
+                USAGE_PAGE(1),      0x08,\r
+                USAGE_MINIMUM(1),       0x01,\r
+                USAGE_MAXIMUM(1),       0x05,\r
+                OUTPUT(1),          0x02,\r
+                REPORT_COUNT(1),    0x01,\r
+                REPORT_SIZE(1),     0x03,\r
+                OUTPUT(1),          0x01,\r
+                REPORT_COUNT(1),    0x06,\r
+                REPORT_SIZE(1),     0x08,\r
+                LOGICAL_MINIMUM(1),     0x00,\r
+                LOGICAL_MAXIMUM(2),     0xff, 0x00,\r
+                USAGE_PAGE(1),      0x07,\r
+                USAGE_MINIMUM(1),       0x00,\r
+                USAGE_MAXIMUM(2),       0xff, 0x00,\r
+                INPUT(1),           0x00,\r
+                END_COLLECTION(0),\r
+\r
+                // Mouse\r
+                USAGE_PAGE(1), 0x01,               // Generic Desktop\r
+                USAGE(1), 0x02,                    // Mouse\r
+                COLLECTION(1), 0x01,               // Application\r
+                USAGE(1), 0x01,                    // Pointer\r
+                COLLECTION(1), 0x00,               // Physical\r
+                REPORT_ID(1),       REPORT_ID_MOUSE,\r
+\r
+                USAGE_PAGE(1), 0x01,                // Generic Desktop\r
+                USAGE(1), 0x30,                     // X\r
+                USAGE(1), 0x31,                     // Y\r
+                LOGICAL_MINIMUM(1), 0x00,           // 0\r
+                LOGICAL_MAXIMUM(2), 0xff, 0x7f,     // 32767\r
+                REPORT_SIZE(1), 0x10,\r
+                REPORT_COUNT(1), 0x02,\r
+                INPUT(1), 0x02,                     // Data, Variable, Absolute\r
+\r
+                USAGE_PAGE(1), 0x01,                // Generic Desktop\r
+                USAGE(1), 0x38,                     // scroll\r
+                LOGICAL_MINIMUM(1), 0x81,           // -127\r
+                LOGICAL_MAXIMUM(1), 0x7f,           // 127\r
+                REPORT_SIZE(1), 0x08,\r
+                REPORT_COUNT(1), 0x01,\r
+                INPUT(1), 0x06,                     // Data, Variable, Relative\r
+\r
+                USAGE_PAGE(1), 0x09,                // Buttons\r
+                USAGE_MINIMUM(1), 0x01,\r
+                USAGE_MAXIMUM(1), 0x03,\r
+                LOGICAL_MINIMUM(1), 0x00,           // 0\r
+                LOGICAL_MAXIMUM(1), 0x01,           // 1\r
+                REPORT_COUNT(1), 0x03,\r
+                REPORT_SIZE(1), 0x01,\r
+                INPUT(1), 0x02,                     // Data, Variable, Absolute\r
+                REPORT_COUNT(1), 0x01,\r
+                REPORT_SIZE(1), 0x05,\r
+                INPUT(1), 0x01,                     // Constant\r
+\r
+                END_COLLECTION(0),\r
+                END_COLLECTION(0),\r
+\r
+                // Media Control\r
+                USAGE_PAGE(1), 0x0C,\r
+                USAGE(1), 0x01,\r
+                COLLECTION(1), 0x01,\r
+                REPORT_ID(1), REPORT_ID_VOLUME,\r
+                USAGE_PAGE(1), 0x0C,\r
+                LOGICAL_MINIMUM(1), 0x00,\r
+                LOGICAL_MAXIMUM(1), 0x01,\r
+                REPORT_SIZE(1), 0x01,\r
+                REPORT_COUNT(1), 0x07,\r
+                USAGE(1), 0xB5,             // Next Track\r
+                USAGE(1), 0xB6,             // Previous Track\r
+                USAGE(1), 0xB7,             // Stop\r
+                USAGE(1), 0xCD,             // Play / Pause\r
+                USAGE(1), 0xE2,             // Mute\r
+                USAGE(1), 0xE9,             // Volume Up\r
+                USAGE(1), 0xEA,             // Volume Down\r
+                INPUT(1), 0x02,             // Input (Data, Variable, Absolute)\r
+                REPORT_COUNT(1), 0x01,\r
+                INPUT(1), 0x01,\r
+                END_COLLECTION(0),\r
+        };\r
+        reportLength = sizeof(reportDescriptor);\r
+        return reportDescriptor;\r
+    }\r
+\r
+    return NULL;\r
+}\r
+\r
+bool USBMouseKeyboard::EP1_OUT_callback() {\r
+    uint16_t bytesRead = 0;\r
+    uint8_t led[65];\r
+    USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);\r
+    \r
+    // we take led[1] because led[0] is the report ID\r
+    lock_status = led[1] & 0x07;\r
+    \r
+    // We activate the endpoint to be able to recceive data\r
+    if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))\r
+        return false;\r
+    return true;\r
+}\r
+\r
+uint8_t USBMouseKeyboard::lockStatus() {\r
+    return lock_status;\r
+}\r
+\r
+bool USBMouseKeyboard::update(int16_t x, int16_t y, uint8_t button, int8_t z) {\r
+    switch (mouse_type) {\r
+    case REL_MOUSE:\r
+        while (x > 127) {\r
+            if (!mouseSend(127, 0, button, z)) return false;\r
+            x = x - 127;\r
+        }\r
+        while (x < -128) {\r
+            if (!mouseSend(-128, 0, button, z)) return false;\r
+            x = x + 128;\r
+        }\r
+        while (y > 127) {\r
+            if (!mouseSend(0, 127, button, z)) return false;\r
+            y = y - 127;\r
+        }\r
+        while (y < -128) {\r
+            if (!mouseSend(0, -128, button, z)) return false;\r
+            y = y + 128;\r
+        }\r
+        return mouseSend(x, y, button, z);\r
+    case ABS_MOUSE:\r
+        HID_REPORT report;\r
+\r
+        report.data[0] = REPORT_ID_MOUSE;\r
+        report.data[1] = x & 0xff;\r
+        report.data[2] = (x >> 8) & 0xff;\r
+        report.data[3] = y & 0xff;\r
+        report.data[4] = (y >> 8) & 0xff;\r
+        report.data[5] = -z;\r
+        report.data[6] = button & 0x07;\r
+\r
+        report.length = 7;\r
+\r
+        return send(&report);\r
+    default:\r
+        return false;\r
+    }\r
+}\r
+\r
+bool USBMouseKeyboard::mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z) {\r
+    HID_REPORT report;\r
+    report.data[0] = REPORT_ID_MOUSE;\r
+    report.data[1] = buttons & 0x07;\r
+    report.data[2] = x;\r
+    report.data[3] = y;\r
+    report.data[4] = -z; // >0 to scroll down, <0 to scroll up\r
+\r
+    report.length = 5;\r
+\r
+    return send(&report);\r
+}\r
+\r
+bool USBMouseKeyboard::move(int16_t x, int16_t y) {\r
+    return update(x, y, button, 0);\r
+}\r
+\r
+bool USBMouseKeyboard::scroll(int8_t z) {\r
+    return update(0, 0, button, z);\r
+}\r
+\r
+bool USBMouseKeyboard::doubleClick() {\r
+    if (!click(MOUSE_LEFT))\r
+        return false;\r
+    wait(0.1);\r
+    return click(MOUSE_LEFT);\r
+}\r
+\r
+bool USBMouseKeyboard::click(uint8_t button) {\r
+    if (!update(0, 0, button, 0))\r
+        return false;\r
+    wait(0.01);\r
+    return update(0, 0, 0, 0);\r
+}\r
+\r
+bool USBMouseKeyboard::press(uint8_t button_) {\r
+    button = button_ & 0x07;\r
+    return update(0, 0, button, 0);\r
+}\r
+\r
+bool USBMouseKeyboard::release(uint8_t button_) {\r
+    button = (button & (~button_)) & 0x07;\r
+    return update(0, 0, button, 0);\r
+}\r
+\r
+int USBMouseKeyboard::_putc(int c) {\r
+    return keyCode(c, keymap[c].modifier);\r
+}\r
+\r
+bool USBMouseKeyboard::keyCode(uint8_t key, uint8_t modifier) {\r
+    // Send a simulated keyboard keypress. Returns true if successful.\r
+\r
+    HID_REPORT report;\r
+\r
+    report.data[0] = REPORT_ID_KEYBOARD;\r
+    report.data[1] = modifier;\r
+    report.data[2] = 0;\r
+    report.data[3] = keymap[key].usage;\r
+    report.data[4] = 0;\r
+    report.data[5] = 0;\r
+    report.data[6] = 0;\r
+    report.data[7] = 0;\r
+    report.data[8] = 0;\r
+\r
+    report.length = 9;\r
+\r
+    if (!send(&report)) {\r
+        return false;\r
+    }\r
+\r
+    report.data[1] = 0;\r
+    report.data[3] = 0;\r
+\r
+    if (!send(&report)) {\r
+        return false;\r
+    }\r
+\r
+    return true;\r
+\r
+}\r
+\r
+\r
+bool USBMouseKeyboard::mediaControl(MEDIA_KEY key) {\r
+    HID_REPORT report;\r
+\r
+    report.data[0] = REPORT_ID_VOLUME;\r
+    report.data[1] = (1 << key) & 0x7f;\r
+\r
+    report.length = 2;\r
+\r
+    send(&report);\r
+    \r
+    report.data[0] = REPORT_ID_VOLUME;\r
+    report.data[1] = 0;\r
+\r
+    report.length = 2;\r
+\r
+    return send(&report);\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouseKeyboard.h b/gcc4mbed/samples/MSTest/USBDevice/USBHID/USBMouseKeyboard.h
new file mode 100644 (file)
index 0000000..ae729d9
--- /dev/null
@@ -0,0 +1,220 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBMOUSEKEYBOARD_H
+#define USBMOUSEKEYBOARD_H
+
+#define REPORT_ID_KEYBOARD 1
+#define REPORT_ID_MOUSE 2
+#define REPORT_ID_VOLUME 3
+
+#include "USBMouse.h"
+#include "USBKeyboard.h"
+#include "Stream.h"
+#include "USBHID.h"
+
+/** 
+ * USBMouseKeyboard example
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "USBMouseKeyboard.h"
+ *
+ * USBMouseKeyboard key_mouse;
+ *
+ * int main(void)
+ * {
+ *   while(1)
+ *   {
+ *       key_mouse.move(20, 0);
+ *       key_mouse.printf("Hello From MBED\r\n");
+ *       wait(1);
+ *   }
+ * }
+ * @endcode
+ *
+ *
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "USBMouseKeyboard.h"
+ *
+ * USBMouseKeyboard key_mouse(ABS_MOUSE);
+ *
+ * int main(void)
+ * {
+ *   while(1)
+ *   {
+ *       key_mouse.move(X_MAX_ABS/2, Y_MAX_ABS/2);
+ *       key_mouse.printf("Hello from MBED\r\n");
+ *       wait(1);
+ *   }
+ * }
+ * @endcode
+ */
+class USBMouseKeyboard: public USBHID, public Stream
+{
+    public:
+    
+        /**
+        *   Constructor
+        *
+        * @param mouse_type Mouse type: ABS_MOUSE (absolute mouse) or REL_MOUSE (relative mouse) (default: REL_MOUSE)
+        * @param leds Leds bus: first: NUM_LOCK, second: CAPS_LOCK, third: SCROLL_LOCK
+        * @param vendor_id Your vendor_id (default: 0x1234)
+        * @param product_id Your product_id (default: 0x0001)
+        * @param product_release Your preoduct_release (default: 0x0001)
+        *
+        */
+        USBMouseKeyboard(MOUSE_TYPE mouse_type = REL_MOUSE, uint16_t vendor_id = 0x0021, uint16_t product_id = 0x0011, uint16_t product_release = 0x0001): 
+            USBHID(0, 0, vendor_id, product_id, product_release, false)
+            {
+                lock_status = 0;
+                button = 0;
+                this->mouse_type = mouse_type;
+                connect();
+            };
+            
+        /**
+        * Write a state of the mouse
+        *
+        * @param x x-axis position
+        * @param y y-axis position
+        * @param buttons buttons state (first bit represents MOUSE_LEFT, second bit MOUSE_RIGHT and third bit MOUSE_MIDDLE)
+        * @param z wheel state (>0 to scroll down, <0 to scroll up)
+        * @returns true if there is no error, false otherwise
+        */
+        bool update(int16_t x, int16_t y, uint8_t buttons, int8_t z);
+        
+        
+        /**
+        * Move the cursor to (x, y)
+        *
+        * @param x x-axis position
+        * @param y y-axis position
+        * @returns true if there is no error, false otherwise
+        */
+        bool move(int16_t x, int16_t y);
+        
+        /**
+        * Press one or several buttons
+        *
+        * @param button button state (ex: press(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool press(uint8_t button);
+        
+        /**
+        * Release one or several buttons
+        *
+        * @param button button state (ex: release(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool release(uint8_t button);
+        
+        /**
+        * Double click (MOUSE_LEFT)
+        *
+        * @returns true if there is no error, false otherwise
+        */
+        bool doubleClick();
+        
+        /**
+        * Click
+        *
+        * @param button state of the buttons ( ex: clic(MOUSE_LEFT))
+        * @returns true if there is no error, false otherwise
+        */
+        bool click(uint8_t button); 
+        
+        /**
+        * Scrolling
+        *
+        * @param z value of the wheel (>0 to go down, <0 to go up)
+        * @returns true if there is no error, false otherwise
+        */
+        bool scroll(int8_t z);
+
+        /**
+        * To send a character defined by a modifier(CTRL, SHIFT, ALT) and the key 
+        *
+        * @code
+        * //To send CTRL + s (save)
+        *  keyboard.keyCode('s', KEY_CTRL);
+        * @endcode
+        *
+        * @param modifier bit 0: KEY_CTRL, bit 1: KEY_SHIFT, bit 2: KEY_ALT (default: 0)
+        * @param key character to send
+        * @returns true if there is no error, false otherwise
+        */
+        bool keyCode(uint8_t key, uint8_t modifier = 0);
+        
+        /**
+        * Send a character
+        *
+        * @param c character to be sent
+        * @returns true if there is no error, false otherwise
+        */
+        virtual int _putc(int c);
+        
+        /**
+        * Control media keys
+        *
+        * @param key media key pressed (KEY_NEXT_TRACK, KEY_PREVIOUS_TRACK, KEY_STOP, KEY_PLAY_PAUSE, KEY_MUTE, KEY_VOLUME_UP, KEY_VOLUME_DOWN)
+        * @returns true if there is no error, false otherwise
+        */
+        bool mediaControl(MEDIA_KEY key);
+        
+        /**
+        * Read status of lock keys. Useful to switch-on/off leds according to key pressed. Only the first three bits of the result is important:
+        *   - First bit: NUM_LOCK
+        *   - Second bit: CAPS_LOCK
+        *   - Third bit: SCROLL_LOCK
+        *
+        * @returns status of lock keys
+        */
+        uint8_t lockStatus();
+        
+        /*
+        * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
+        *
+        * @returns pointer to the report descriptor
+        */
+        virtual uint8_t * reportDesc();
+        
+        /*
+        * Called when a data is received on the OUT endpoint. Useful to switch on LED of LOCK keys
+        *
+        * @returns if handle by subclass, return true
+        */
+        virtual bool EP1_OUT_callback();
+        
+        
+    private:
+        bool mouseWrite(int8_t x, int8_t y, uint8_t buttons, int8_t z);
+        MOUSE_TYPE mouse_type;
+        uint8_t button;
+        bool mouseSend(int8_t x, int8_t y, uint8_t buttons, int8_t z);
+        
+        uint8_t lock_status;
+        
+        //dummy otherwise it doesn't compile (we must define all methods of an abstract class)
+        virtual int _getc() { return -1;}
+};
+
+#endif
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBMIDI/MIDIMessage.h b/gcc4mbed/samples/MSTest/USBDevice/USBMIDI/MIDIMessage.h
new file mode 100644 (file)
index 0000000..4172e2e
--- /dev/null
@@ -0,0 +1,250 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef MIDIMESSAGE_H\r
+#define MIDIMESSAGE_H\r
+\r
+#include "mbed.h"\r
+\r
+// MIDI Message Format\r
+// \r
+// [ msg(4) | channel(4) ] [ 0 | n(7) ] [ 0 | m(7) ]\r
+//\r
+// MIDI Data Messages (Channel Specific)\r
+//\r
+// Message               msg n          m\r
+// ---------------------------------------------\r
+// Note Off              0x8 Key        Velocity\r
+// Note On               0x9 Key        Velocity\r
+// Polyphonic Aftertouch 0xA Key        Pressure\r
+// Control Change        0xB Controller Value\r
+// Program Change        0xC Program    -\r
+// Channel Aftertouch    0xD Pressure   -\r
+// Pitch Wheel           0xE LSB        MSB\r
+\r
+#define CABLE_NUM (0<<4)\r
+\r
+/** A MIDI message container */\r
+class MIDIMessage {\r
+public:\r
+    MIDIMessage() {}\r
+    \r
+    MIDIMessage(uint8_t *buf) {\r
+        *((uint32_t *)data) = *((uint32_t *)buf);\r
+    }\r
+    \r
+    // create messages\r
+    \r
+    /** Create a NoteOff message \r
+     * @param key Key ID\r
+     * @param velocity Key velocity (0-127, default = 127)\r
+     * @param channel Key channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */\r
+    static MIDIMessage NoteOff(int key, int velocity = 127, int channel = 0) {\r
+        MIDIMessage msg;\r
+        msg.data[0] = CABLE_NUM | 0x08;\r
+        msg.data[1] = 0x80 | (channel & 0x0F);\r
+        msg.data[2] = key & 0x7F;\r
+        msg.data[3] = velocity & 0x7F; \r
+        return msg;\r
+    }\r
+    \r
+    /** Create a NoteOn message \r
+     * @param key Key ID\r
+     * @param velocity Key velocity (0-127, default = 127)\r
+     * @param channel Key channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */\r
+    static MIDIMessage NoteOn(int key, int velocity = 127, int channel = 0) {\r
+        MIDIMessage msg;\r
+        msg.data[0] = CABLE_NUM | 0x09;\r
+        msg.data[1] = 0x90 | (channel & 0x0F);\r
+        msg.data[2] = key & 0x7F;\r
+        msg.data[3] = velocity & 0x7F;                 \r
+        return msg;\r
+    }\r
+    \r
+    /** Create a PolyPhonic Aftertouch message \r
+     * @param key Key ID\r
+     * @param pressure Aftertouch pressure (0-127)\r
+     * @param channel Key channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */    \r
+    static MIDIMessage PolyphonicAftertouch(int key, int pressure, int channel = 0) {\r
+        MIDIMessage msg;\r
+        msg.data[0] = CABLE_NUM | 0x0A;\r
+        msg.data[1] = 0xA0 | (channel & 0x0F);\r
+        msg.data[2] = key & 0x7F;\r
+        msg.data[3] = pressure & 0x7F;         \r
+        return msg;\r
+    }\r
+    \r
+    /** Create a Control Change message \r
+     * @param control Controller ID\r
+     * @param value Controller value (0-127)\r
+     * @param channel Controller channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */\r
+    static MIDIMessage ControlChange(int control, int value, int channel = 0) {\r
+        MIDIMessage msg;\r
+        msg.data[0] = CABLE_NUM | 0x0B;\r
+        msg.data[1] = 0xB0 | (channel & 0x0F);\r
+        msg.data[2] = control & 0x7F;\r
+        msg.data[3] = value & 0x7F;         \r
+        return msg;\r
+    }\r
+    \r
+    /** Create a Program Change message \r
+     * @param program Program ID\r
+     * @param channel Channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */    \r
+    static MIDIMessage ProgramChange(int program, int channel = 0) {\r
+        MIDIMessage msg;\r
+        msg.data[0] = CABLE_NUM | 0x0C;\r
+        msg.data[1] = 0xC0 | (channel & 0x0F);\r
+        msg.data[2] = program & 0x7F;\r
+        msg.data[3] = 0x00;         \r
+        return msg;\r
+    }\r
+    \r
+    /** Create a Channel Aftertouch message \r
+     * @param pressure Pressure \r
+     * @param channel Key channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */    \r
+    static MIDIMessage ChannelAftertouch(int pressure, int channel = 0) {\r
+        MIDIMessage msg;\r
+        msg.data[0] = CABLE_NUM | 0x0D;\r
+        msg.data[1] = 0xD0 | (channel & 0x0F);\r
+        msg.data[2] = pressure & 0x7F;\r
+        msg.data[3] = 0x00;         \r
+        return msg;\r
+    }\r
+    \r
+    /** Create a Pitch Wheel message \r
+     * @param pitch Pitch (-8192 - 8191, default = 0)\r
+     * @param channel Channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */    \r
+    static MIDIMessage PitchWheel(int pitch = 0, int channel = 0) {\r
+        MIDIMessage msg;\r
+        int p = pitch + 8192;    // 0 - 16383, 8192 is center\r
+        msg.data[0] = CABLE_NUM | 0x0E;\r
+        msg.data[1] = 0xE0 | (channel & 0x0F);\r
+        msg.data[2] = p & 0x7F;\r
+        msg.data[3] = (p >> 7) & 0x7F;                 \r
+        return msg;\r
+    }\r
+    \r
+    /** Create an All Notes Off message \r
+     * @param channel Channel (0-15, default 0)\r
+     * @returns A MIDIMessage\r
+     */    \r
+    static MIDIMessage AllNotesOff(int channel = 0) {\r
+        return ControlChange(123, 0, channel);\r
+    }\r
+    \r
+    // decode messages\r
+    \r
+    /** MIDI Message Types */\r
+    enum MIDIMessageType {\r
+        ErrorType,\r
+        NoteOffType,\r
+        NoteOnType,\r
+        PolyphonicAftertouchType,\r
+        ControlChangeType,\r
+        ProgramChangeType,\r
+        ChannelAftertouchType,\r
+        PitchWheelType,\r
+        AllNotesOffType\r
+    };\r
+    \r
+    /** Read the message type\r
+     * @returns MIDIMessageType\r
+     */    \r
+    MIDIMessageType type() {\r
+        switch((data[1] >> 4) & 0xF) {\r
+            case 0x8: return NoteOffType;\r
+            case 0x9: return NoteOnType;\r
+            case 0xA: return PolyphonicAftertouchType;\r
+            case 0xB: \r
+                if(controller() < 120) { // standard controllers\r
+                    return ControlChangeType;\r
+                } else if(controller() == 123) {\r
+                    return AllNotesOffType;\r
+                } else {\r
+                    return ErrorType; // unsupported atm\r
+                }\r
+            case 0xC: return ProgramChangeType;\r
+            case 0xD: return ChannelAftertouchType;\r
+            case 0xE: return PitchWheelType;\r
+            default: return ErrorType;\r
+        }\r
+    }\r
+\r
+    /** Read the channel number */    \r
+    int channel() {\r
+        return (data[1] & 0x0F);\r
+    }\r
+    \r
+    /** Read the key ID */    \r
+    int key() {\r
+        return (data[2] & 0x7F);        \r
+    }\r
+        \r
+    /** Read the velocity */    \r
+    int velocity() {\r
+        return (data[3] & 0x7F);        \r
+    }\r
+\r
+    /** Read the controller value */    \r
+    int value() {\r
+        return (data[3] & 0x7F);        \r
+    }\r
+    \r
+    /** Read the aftertouch pressure */        \r
+    int pressure() {\r
+        if(type() == PolyphonicAftertouchType) {\r
+            return (data[3] & 0x7F);        \r
+        } else {\r
+            return (data[2] & 0x7F);        \r
+        }\r
+    }\r
+\r
+    /** Read the controller number */    \r
+    int controller() {\r
+        return (data[2] & 0x7F);        \r
+    }\r
+\r
+    /** Read the program number */    \r
+    int program() {\r
+        return (data[2] & 0x7F);        \r
+    }\r
+    \r
+    /** Read the pitch value */        \r
+    int pitch() {\r
+        int p = ((data[3] & 0x7F) << 7) | (data[2] & 0x7F);\r
+        return p - 8192; // 0 - 16383, 8192 is center\r
+    }\r
+    \r
+    uint8_t data[4];\r
+};    \r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBMIDI/USBMIDI.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBMIDI/USBMIDI.cpp
new file mode 100644 (file)
index 0000000..09159e1
--- /dev/null
@@ -0,0 +1,122 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBMIDI.h"\r
+#include "USBBusInterface.h"\r
+\r
+\r
+USBMIDI::USBMIDI(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {\r
+    midi_evt = NULL;\r
+    USBDevice::connect();\r
+}\r
+\r
+void USBMIDI::write(MIDIMessage m) {\r
+    USBDevice::write(EPBULK_IN, m.data, 4, MAX_PACKET_SIZE_EPBULK);\r
+}\r
+\r
+\r
+void USBMIDI::attach(void (*fptr)(MIDIMessage)) {\r
+    midi_evt = fptr;\r
+}\r
+\r
+\r
+bool USBMIDI::EP2_OUT_callback() {\r
+    uint8_t buf[64];\r
+    uint16_t len;\r
+    readEP(EPBULK_OUT, buf, &len, 64);\r
+\r
+    if (midi_evt != NULL) {\r
+        for (int i=0; i<len; i+=4) {\r
+            midi_evt(MIDIMessage(buf+i));\r
+        }\r
+    }\r
+\r
+    // We reactivate the endpoint to receive next characters\r
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+    return true;\r
+}\r
+\r
+\r
+\r
+// Called in ISR context\r
+// Set configuration. Return false if the\r
+// configuration is not supported.\r
+bool USBMIDI::USBCallback_setConfiguration(uint8_t configuration) {\r
+    if (configuration != DEFAULT_CONFIGURATION) {\r
+        return false;\r
+    }\r
+\r
+    // Configure endpoints > 0\r
+    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);\r
+    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+\r
+    // We activate the endpoint to be able to receive data\r
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+    return true;\r
+}\r
+\r
+\r
+uint8_t * USBMIDI::stringIinterfaceDesc() {\r
+    static uint8_t stringIinterfaceDescriptor[] = {\r
+        0x0c,                           //bLength\r
+        STRING_DESCRIPTOR,              //bDescriptorType 0x03\r
+        'A',0,'u',0,'d',0,'i',0,'o',0   //bString iInterface - Audio\r
+    };\r
+    return stringIinterfaceDescriptor;\r
+}\r
+\r
+uint8_t * USBMIDI::stringIproductDesc() {\r
+    static uint8_t stringIproductDescriptor[] = {\r
+        0x16,                                                       //bLength\r
+        STRING_DESCRIPTOR,                                          //bDescriptorType 0x03\r
+        'M',0,'b',0,'e',0,'d',0,' ',0,'A',0,'u',0,'d',0,'i',0,'o',0 //bString iProduct - Mbed Audio\r
+    };\r
+    return stringIproductDescriptor;\r
+}\r
+\r
+\r
+uint8_t * USBMIDI::configurationDesc() {\r
+    static uint8_t configDescriptor[] = {\r
+        // configuration descriptor\r
+        0x09, 0x02, 0x65, 0x00, 0x02, 0x01, 0x00, 0xc0, 0x50,\r
+\r
+        // The Audio Interface Collection\r
+        0x09, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, // Standard AC Interface Descriptor\r
+        0x09, 0x24, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, // Class-specific AC Interface Descriptor\r
+        0x09, 0x04, 0x01, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, // MIDIStreaming Interface Descriptors\r
+        0x07, 0x24, 0x01, 0x00, 0x01, 0x41, 0x00,             // Class-Specific MS Interface Header Descriptor\r
+\r
+        // MIDI IN JACKS\r
+        0x06, 0x24, 0x02, 0x01, 0x01, 0x00,\r
+        0x06, 0x24, 0x02, 0x02, 0x02, 0x00,\r
+\r
+        // MIDI OUT JACKS\r
+        0x09, 0x24, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x00,\r
+        0x09, 0x24, 0x03, 0x02, 0x06, 0x01, 0x01, 0x01, 0x00,\r
+\r
+        // OUT endpoint descriptor\r
+        0x09, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,\r
+        0x05, 0x25, 0x01, 0x01, 0x01,\r
+\r
+        // IN endpoint descriptor\r
+        0x09, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00,\r
+        0x05, 0x25, 0x01, 0x01, 0x03,\r
+    };\r
+    return configDescriptor;\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBMIDI/USBMIDI.h b/gcc4mbed/samples/MSTest/USBDevice/USBMIDI/USBMIDI.h
new file mode 100644 (file)
index 0000000..2d86c9b
--- /dev/null
@@ -0,0 +1,110 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef USBMIDI_H
+#define USBMIDI_H
+
+/* These headers are included for child class. */
+#include "USBEndpoints.h"
+#include "USBDescriptor.h"
+#include "USBDevice_Types.h"
+
+#include "USBDevice.h"
+#include "MIDIMessage.h"
+
+#define DEFAULT_CONFIGURATION (1)
+
+/** 
+* USBMIDI example
+*
+* @code
+* #include "mbed.h"
+* #include "USBMIDI.h"
+*
+* USBMIDI midi;
+*
+* int main() {            
+*    while (1) {    
+*        for(int i=48; i<83; i++) {     // send some messages!
+*            midi.write(MIDIMessage::NoteOn(i));
+*            wait(0.25);
+*            midi.write(MIDIMessage::NoteOff(i));
+*            wait(0.5);
+*        }
+*    }
+* }
+* @endcode
+*/
+class USBMIDI: public USBDevice {
+public:
+
+    /**
+    * Constructor
+    *
+    * @param vendor_id Your vendor_id
+    * @param product_id Your product_id
+    * @param product_release Your preoduct_release
+    */
+    USBMIDI(uint16_t vendor_id = 0x0700, uint16_t product_id = 0x0101, uint16_t product_release = 0x0001);
+    
+    /**
+     * Send a MIDIMessage
+     *
+     * @param m The MIDIMessage to send
+     */    
+    void write(MIDIMessage m);
+
+    /**
+     * Attach a callback for when a MIDIEvent is received
+     *
+     * @param fptr function pointer
+     */
+    void attach(void (*fptr)(MIDIMessage));
+    
+    
+protected:
+    virtual bool EP2_OUT_callback();
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);
+    /*
+    * Get string product descriptor
+    *
+    * @returns pointer to the string product descriptor
+    */
+    virtual uint8_t * stringIproductDesc();
+    
+    /*
+    * Get string interface descriptor
+    *
+    * @returns pointer to the string interface descriptor
+    */
+    virtual uint8_t * stringIinterfaceDesc();
+    
+    /*
+    * Get configuration descriptor
+    *
+    * @returns pointer to the configuration descriptor
+    */
+    virtual uint8_t * configurationDesc();
+
+private:
+    void (*midi_evt)(MIDIMessage);
+
+};
+
+#endif
+
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBMSD/USBMSD.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBMSD/USBMSD.cpp
new file mode 100644 (file)
index 0000000..c40c5a1
--- /dev/null
@@ -0,0 +1,638 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBMSD.h"\r
+\r
+#define DISK_OK         0x00\r
+#define NO_INIT         0x01\r
+#define NO_DISK         0x02\r
+#define WRITE_PROTECT   0x04\r
+\r
+#define CBW_Signature   0x43425355\r
+#define CSW_Signature   0x53425355\r
+\r
+// SCSI Commands\r
+#define TEST_UNIT_READY            0x00\r
+#define REQUEST_SENSE              0x03\r
+#define FORMAT_UNIT                0x04\r
+#define INQUIRY                    0x12\r
+#define MODE_SELECT6               0x15\r
+#define MODE_SENSE6                0x1A\r
+#define START_STOP_UNIT            0x1B\r
+#define MEDIA_REMOVAL              0x1E\r
+#define READ_FORMAT_CAPACITIES     0x23\r
+#define READ_CAPACITY              0x25\r
+#define READ10                     0x28\r
+#define WRITE10                    0x2A\r
+#define VERIFY10                   0x2F\r
+#define READ12                     0xA8\r
+#define WRITE12                    0xAA\r
+#define MODE_SELECT10              0x55\r
+#define MODE_SENSE10               0x5A\r
+\r
+// MSC class specific requests\r
+#define MSC_REQUEST_RESET          0xFF\r
+#define MSC_REQUEST_GET_MAX_LUN    0xFE\r
+\r
+#define DEFAULT_CONFIGURATION (1)\r
+\r
+// max packet size\r
+#define MAX_PACKET  MAX_PACKET_SIZE_EPBULK\r
+\r
+// CSW Status\r
+enum Status {\r
+    CSW_PASSED,\r
+    CSW_FAILED,\r
+    CSW_ERROR,\r
+};\r
+\r
+\r
+USBMSD::USBMSD(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {\r
+}\r
+\r
+\r
+\r
+// Called in ISR context to process a class specific request\r
+bool USBMSD::USBCallback_request(void) {\r
+\r
+    bool success = false;\r
+    CONTROL_TRANSFER * transfer = getTransferPtr();\r
+    static uint8_t maxLUN[1] = {0};\r
+\r
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {\r
+        switch (transfer->setup.bRequest) {\r
+            case MSC_REQUEST_RESET:\r
+                reset();\r
+                success = true;\r
+                break;\r
+            case MSC_REQUEST_GET_MAX_LUN:\r
+                transfer->remaining = 1;\r
+                transfer->ptr = maxLUN;\r
+                transfer->direction = DEVICE_TO_HOST;\r
+                success = true;\r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+\r
+bool USBMSD::connect() {\r
+\r
+    //disk initialization\r
+    if (disk_status() & NO_INIT) {\r
+        if (disk_initialize()) {\r
+            return false;\r
+        }\r
+    }\r
+\r
+    // get number of blocks\r
+    BlockCount = disk_sectors();\r
+\r
+    // get memory size\r
+    MemorySize = disk_size();\r
+\r
+    if (BlockCount >= 0) {\r
+        BlockSize = MemorySize / BlockCount;\r
+        if (BlockSize != 0) {\r
+            page = (uint8_t *)malloc(BlockSize * sizeof(uint8_t));\r
+            if (page == NULL)\r
+                return false;\r
+        }\r
+    } else {\r
+        return false;\r
+    }\r
+\r
+    //connect the device\r
+    USBDevice::connect();\r
+    return true;\r
+}\r
+\r
+\r
+void USBMSD::reset() {\r
+    stage = READ_CBW;\r
+}\r
+\r
+\r
+// Called in ISR context called when a data is received\r
+bool USBMSD::EP2_OUT_callback() {\r
+    uint16_t size = 0;\r
+    uint8_t buf[MAX_PACKET_SIZE_EPBULK];\r
+    readEP(EPBULK_OUT, buf, &size, MAX_PACKET_SIZE_EPBULK);\r
+    switch (stage) {\r
+            // the device has to decode the CBW received\r
+        case READ_CBW:\r
+            CBWDecode(buf, size);\r
+            break;\r
+\r
+            // the device has to receive data from the host\r
+        case PROCESS_CBW:\r
+            switch (cbw.CB[0]) {\r
+                case WRITE10:\r
+                case WRITE12:\r
+                    memoryWrite(buf, size);\r
+                    break;\r
+                case VERIFY10:\r
+                    memoryVerify(buf, size);\r
+                    break;\r
+            }\r
+            break;\r
+\r
+            // an error has occured: stall endpoint and send CSW\r
+        default:\r
+            stallEndpoint(EPBULK_OUT);\r
+            csw.Status = CSW_ERROR;\r
+            sendCSW();\r
+            break;\r
+    }\r
+\r
+    //reactivate readings on the OUT bulk endpoint\r
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+    return true;\r
+}\r
+\r
+// Called in ISR context when a data has been transferred\r
+bool USBMSD::EP2_IN_callback() {\r
+    switch (stage) {\r
+\r
+            // the device has to send data to the host\r
+        case PROCESS_CBW:\r
+            switch (cbw.CB[0]) {\r
+                case READ10:\r
+                case READ12:\r
+                    memoryRead();\r
+                    break;\r
+            }\r
+            break;\r
+\r
+            //the device has to send a CSW\r
+        case SEND_CSW:\r
+            sendCSW();\r
+            break;\r
+\r
+            // an error has occured\r
+        case ERROR:\r
+            stallEndpoint(EPBULK_IN);\r
+            sendCSW();\r
+            break;\r
+\r
+            // the host has received the CSW -> we wait a CBW\r
+        case WAIT_CSW:\r
+            stage = READ_CBW;\r
+            break;\r
+    }\r
+    return true;\r
+}\r
+\r
+\r
+void USBMSD::memoryWrite (uint8_t * buf, uint16_t size) {\r
+\r
+    if ((addr + size) > MemorySize) {\r
+        size = MemorySize - addr;\r
+        stage = ERROR;\r
+        stallEndpoint(EPBULK_OUT);\r
+    }\r
+\r
+    // we fill an array in RAM of 1 block before writing it in memory\r
+    for (int i = 0; i < size; i++)\r
+        page[addr%BlockSize + i] = buf[i];\r
+\r
+    // if the array is filled, write it in memory\r
+    if (!((addr + size)%BlockSize)) {\r
+        if (!(disk_status() & WRITE_PROTECT)) {\r
+            disk_write((const char *)page, addr/BlockSize);\r
+        }\r
+    }\r
+\r
+    addr += size;\r
+    length -= size;\r
+    csw.DataResidue -= size;\r
+\r
+    if ((!length) || (stage != PROCESS_CBW)) {\r
+        csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;\r
+        sendCSW();\r
+    }\r
+}\r
+\r
+void USBMSD::memoryVerify (uint8_t * buf, uint16_t size) {\r
+    uint32_t n;\r
+\r
+    if ((addr + size) > MemorySize) {\r
+        size = MemorySize - addr;\r
+        stage = ERROR;\r
+        stallEndpoint(EPBULK_OUT);\r
+    }\r
+\r
+    // beginning of a new block -> load a whole block in RAM\r
+    if (!(addr%BlockSize))\r
+        disk_read((char *)page, addr/BlockSize);\r
+\r
+    // info are in RAM -> no need to re-read memory\r
+    for (n = 0; n < size; n++) {\r
+        if (page[addr%BlockSize + n] != buf[n]) {\r
+            memOK = false;\r
+            break;\r
+        }\r
+    }\r
+\r
+    addr += size;\r
+    length -= size;\r
+    csw.DataResidue -= size;\r
+\r
+    if ( !length || (stage != PROCESS_CBW)) {\r
+        csw.Status = (memOK && (stage == PROCESS_CBW)) ? CSW_PASSED : CSW_FAILED;\r
+        sendCSW();\r
+    }\r
+}\r
+\r
+\r
+bool USBMSD::inquiryRequest (void) {\r
+    uint8_t inquiry[] = { 0x00, 0x80, 0x00, 0x01,\r
+                          36 - 4, 0x80, 0x00, 0x00,\r
+                          'M', 'B', 'E', 'D', '.', 'O', 'R', 'G',\r
+                          'M', 'B', 'E', 'D', ' ', 'U', 'S', 'B', ' ', 'D', 'I', 'S', 'K', ' ', ' ', ' ',\r
+                          '1', '.', '0', ' ',\r
+                        };\r
+    if (!write(inquiry, sizeof(inquiry))) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+\r
+bool USBMSD::readFormatCapacity() {\r
+    uint8_t capacity[] = { 0x00, 0x00, 0x00, 0x08,\r
+                           (BlockCount >> 24) & 0xff,\r
+                           (BlockCount >> 16) & 0xff,\r
+                           (BlockCount >> 8) & 0xff,\r
+                           (BlockCount >> 0) & 0xff,\r
+\r
+                           0x02,\r
+                           (BlockSize >> 16) & 0xff,\r
+                           (BlockSize >> 8) & 0xff,\r
+                           (BlockSize >> 0) & 0xff,\r
+                         };\r
+    if (!write(capacity, sizeof(capacity))) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+\r
+bool USBMSD::readCapacity (void) {\r
+    uint8_t capacity[] = {\r
+        ((BlockCount - 1) >> 24) & 0xff,\r
+        ((BlockCount - 1) >> 16) & 0xff,\r
+        ((BlockCount - 1) >> 8) & 0xff,\r
+        ((BlockCount - 1) >> 0) & 0xff,\r
+\r
+        (BlockSize >> 24) & 0xff,\r
+        (BlockSize >> 16) & 0xff,\r
+        (BlockSize >> 8) & 0xff,\r
+        (BlockSize >> 0) & 0xff,\r
+    };\r
+    if (!write(capacity, sizeof(capacity))) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+bool USBMSD::write (uint8_t * buf, uint16_t size) {\r
+\r
+    if (size >= cbw.DataLength) {\r
+        size = cbw.DataLength;\r
+    }\r
+    stage = SEND_CSW;\r
+\r
+    if (!writeNB(EPBULK_IN, buf, size, MAX_PACKET_SIZE_EPBULK)) {\r
+        return false;\r
+    }\r
+\r
+    csw.DataResidue -= size;\r
+    csw.Status = CSW_PASSED;\r
+    return true;\r
+}\r
+\r
+\r
+bool USBMSD::modeSense6 (void) {\r
+    uint8_t sense6[] = { 0x03, 0x00, 0x00, 0x00 };\r
+    if (!write(sense6, sizeof(sense6))) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+void USBMSD::sendCSW() {\r
+    csw.Signature = CSW_Signature;\r
+    writeNB(EPBULK_IN, (uint8_t *)&csw, sizeof(CSW), MAX_PACKET_SIZE_EPBULK);\r
+    stage = WAIT_CSW;\r
+}\r
+\r
+bool USBMSD::requestSense (void) {\r
+    uint8_t request_sense[] = {\r
+        0x70,\r
+        0x00,\r
+        0x05,   // Sense Key: illegal request\r
+        0x00,\r
+        0x00,\r
+        0x00,\r
+        0x00,\r
+        0x0A,\r
+        0x00,\r
+        0x00,\r
+        0x00,\r
+        0x00,\r
+        0x30,\r
+        0x01,\r
+        0x00,\r
+        0x00,\r
+        0x00,\r
+        0x00,\r
+    };\r
+\r
+    if (!write(request_sense, sizeof(request_sense))) {\r
+        return false;\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+void USBMSD::fail() {\r
+    csw.Status = CSW_FAILED;\r
+    sendCSW();\r
+}\r
+\r
+\r
+void USBMSD::CBWDecode(uint8_t * buf, uint16_t size) {\r
+    if (size == sizeof(cbw)) {\r
+        memcpy((uint8_t *)&cbw, buf, size);\r
+        if (cbw.Signature == CBW_Signature) {\r
+            csw.Tag = cbw.Tag;\r
+            csw.DataResidue = cbw.DataLength;\r
+            if ((cbw.CBLength <  1) || (cbw.CBLength > 16) ) {\r
+                fail();\r
+            } else {\r
+                switch (cbw.CB[0]) {\r
+                    case TEST_UNIT_READY:\r
+                        testUnitReady();\r
+                        break;\r
+                    case REQUEST_SENSE:\r
+                        requestSense();\r
+                        break;\r
+                    case INQUIRY:\r
+                        inquiryRequest();\r
+                        break;\r
+                    case MODE_SENSE6:\r
+                        modeSense6();\r
+                        break;\r
+                    case READ_FORMAT_CAPACITIES:\r
+                        readFormatCapacity();\r
+                        break;\r
+                    case READ_CAPACITY:\r
+                        readCapacity();\r
+                        break;\r
+                    case READ10:\r
+                    case READ12:\r
+                        if (infoTransfer()) {\r
+                            if ((cbw.Flags & 0x80)) {\r
+                                stage = PROCESS_CBW;\r
+                                memoryRead();\r
+                            } else {\r
+                                stallEndpoint(EPBULK_OUT);\r
+                                csw.Status = CSW_ERROR;\r
+                                sendCSW();\r
+                            }\r
+                        }\r
+                        break;\r
+                    case WRITE10:\r
+                    case WRITE12:\r
+                        if (infoTransfer()) {\r
+                            if (!(cbw.Flags & 0x80)) {\r
+                                stage = PROCESS_CBW;\r
+                            } else {\r
+                                stallEndpoint(EPBULK_IN);\r
+                                csw.Status = CSW_ERROR;\r
+                                sendCSW();\r
+                            }\r
+                        }\r
+                        break;\r
+                    case VERIFY10:\r
+                        if (!(cbw.CB[1] & 0x02)) {\r
+                            csw.Status = CSW_PASSED;\r
+                            sendCSW();\r
+                            break;\r
+                        }\r
+                        if (infoTransfer()) {\r
+                            if (!(cbw.Flags & 0x80)) {\r
+                                stage = PROCESS_CBW;\r
+                                memOK = true;\r
+                            } else {\r
+                                stallEndpoint(EPBULK_IN);\r
+                                csw.Status = CSW_ERROR;\r
+                                sendCSW();\r
+                            }\r
+                        }\r
+                        break;\r
+                    default:\r
+                        fail();\r
+                        break;\r
+                }\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+void USBMSD::testUnitReady (void) {\r
+\r
+    if (cbw.DataLength != 0) {\r
+        if ((cbw.Flags & 0x80) != 0) {\r
+            stallEndpoint(EPBULK_IN);\r
+        } else {\r
+            stallEndpoint(EPBULK_OUT);\r
+        }\r
+    }\r
+\r
+    csw.Status = CSW_PASSED;\r
+    sendCSW();\r
+}\r
+\r
+\r
+void USBMSD::memoryRead (void) {\r
+    uint32_t n;\r
+\r
+    n = (length > MAX_PACKET) ? MAX_PACKET : length;\r
+\r
+    if ((addr + n) > MemorySize) {\r
+        n = MemorySize - addr;\r
+        stage = ERROR;\r
+    }\r
+\r
+    // we read an entire block\r
+    if (!(addr%BlockSize))\r
+        disk_read((char *)page, addr/BlockSize);\r
+\r
+    // write data which are in RAM\r
+    writeNB(EPBULK_IN, &page[addr%BlockSize], n, MAX_PACKET_SIZE_EPBULK);\r
+\r
+    addr += n;\r
+    length -= n;\r
+\r
+    csw.DataResidue -= n;\r
+\r
+    if ( !length || (stage != PROCESS_CBW)) {\r
+        csw.Status = (stage == PROCESS_CBW) ? CSW_PASSED : CSW_FAILED;\r
+        stage = (stage == PROCESS_CBW) ? SEND_CSW : stage;\r
+    }\r
+}\r
+\r
+\r
+bool USBMSD::infoTransfer (void) {\r
+    uint32_t n;\r
+\r
+    // Logical Block Address of First Block\r
+    n = (cbw.CB[2] << 24) | (cbw.CB[3] << 16) | (cbw.CB[4] <<  8) | (cbw.CB[5] <<  0);\r
+\r
+    addr = n * BlockSize;\r
+\r
+    // Number of Blocks to transfer\r
+    switch (cbw.CB[0]) {\r
+        case READ10:\r
+        case WRITE10:\r
+        case VERIFY10:\r
+            n = (cbw.CB[7] <<  8) | (cbw.CB[8] <<  0);\r
+            break;\r
+\r
+        case READ12:\r
+        case WRITE12:\r
+            n = (cbw.CB[6] << 24) | (cbw.CB[7] << 16) | (cbw.CB[8] <<  8) | (cbw.CB[9] <<  0);\r
+            break;\r
+    }\r
+\r
+    length = n * BlockSize;\r
+\r
+    if (!cbw.DataLength) {              // host requests no data\r
+        csw.Status = CSW_FAILED;\r
+        sendCSW();\r
+        return false;\r
+    }\r
+\r
+    if (cbw.DataLength != length) {\r
+        if ((cbw.Flags & 0x80) != 0) {\r
+            stallEndpoint(EPBULK_IN);\r
+        } else {\r
+            stallEndpoint(EPBULK_OUT);\r
+        }\r
+\r
+        csw.Status = CSW_FAILED;\r
+        sendCSW();\r
+        return false;\r
+    }\r
+\r
+    return true;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+// Called in ISR context\r
+// Set configuration. Return false if the\r
+// configuration is not supported.\r
+bool USBMSD::USBCallback_setConfiguration(uint8_t configuration) {\r
+    if (configuration != DEFAULT_CONFIGURATION) {\r
+        return false;\r
+    }\r
+\r
+    // Configure endpoints > 0\r
+    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);\r
+    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+\r
+    //activate readings\r
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+    return true;\r
+}\r
+\r
+\r
+uint8_t * USBMSD::stringIinterfaceDesc() {\r
+    static uint8_t stringIinterfaceDescriptor[] = {\r
+        0x08,                           //bLength\r
+        STRING_DESCRIPTOR,              //bDescriptorType 0x03\r
+        'M',0,'S',0,'D',0               //bString iInterface - MSD\r
+    };\r
+    return stringIinterfaceDescriptor;\r
+}\r
+\r
+uint8_t * USBMSD::stringIproductDesc() {\r
+    static uint8_t stringIproductDescriptor[] = {\r
+        0x12,                                           //bLength\r
+        STRING_DESCRIPTOR,                              //bDescriptorType 0x03\r
+        'M',0,'b',0,'e',0,'d',0,' ',0,'M',0,'S',0,'D',0 //bString iProduct - Mbed Audio\r
+    };\r
+    return stringIproductDescriptor;\r
+}\r
+\r
+\r
+uint8_t * USBMSD::configurationDesc() {\r
+    static uint8_t configDescriptor[] = {\r
+\r
+        // Configuration 1\r
+        9,      // bLength\r
+        2,      // bDescriptorType\r
+        LSB(9 + 9 + 7 + 7), // wTotalLength\r
+        MSB(9 + 9 + 7 + 7),\r
+        0x01,   // bNumInterfaces\r
+        0x01,   // bConfigurationValue: 0x01 is used to select this configuration\r
+        0x00,   // iConfiguration: no string to describe this configuration\r
+        0xC0,   // bmAttributes\r
+        100,    // bMaxPower, device power consumption is 100 mA\r
+\r
+        // Interface 0, Alternate Setting 0, MSC Class\r
+        9,      // bLength\r
+        4,      // bDescriptorType\r
+        0x00,   // bInterfaceNumber\r
+        0x00,   // bAlternateSetting\r
+        0x02,   // bNumEndpoints\r
+        0x08,   // bInterfaceClass\r
+        0x06,   // bInterfaceSubClass\r
+        0x50,   // bInterfaceProtocol\r
+        0x04,   // iInterface\r
+\r
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\r
+        7,                          // bLength\r
+        5,                          // bDescriptorType\r
+        PHY_TO_DESC(EPBULK_IN),     // bEndpointAddress\r
+        0x02,                       // bmAttributes (0x02=bulk)\r
+        LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)\r
+        0,                          // bInterval\r
+\r
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\r
+        7,                          // bLength\r
+        5,                          // bDescriptorType\r
+        PHY_TO_DESC(EPBULK_OUT),    // bEndpointAddress\r
+        0x02,                       // bmAttributes (0x02=bulk)\r
+        LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)\r
+        0                           // bInterval\r
+    };\r
+    return configDescriptor;\r
+}
\ No newline at end of file
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBMSD/USBMSD.h b/gcc4mbed/samples/MSTest/USBDevice/USBMSD/USBMSD.h
new file mode 100644 (file)
index 0000000..65f67a8
--- /dev/null
@@ -0,0 +1,251 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+\r
+#ifndef USBMSD_H\r
+#define USBMSD_H\r
+\r
+/* These headers are included for child class. */\r
+#include "USBEndpoints.h"\r
+#include "USBDescriptor.h"\r
+#include "USBDevice_Types.h"\r
+\r
+#include "USBDevice.h"\r
+\r
+#ifdef __GNUC__\r
+    /* Packing for structs in GCC. */\r
+    #define PACK_STRUCT_STRUCT __attribute__((packed))\r
+    #define PACK_STRUCT_BEGIN\r
+    #define PACK_STRUCT_END\r
+#else /* !__GNUC__ */\r
+    /* Packing for structs in ARM compiler. */\r
+    #define PACK_STRUCT_STRUCT\r
+    #define PACK_STRUCT_BEGIN __packed\r
+    #define PACK_STRUCT_END\r
+#endif /* __GNUC__ */\r
+\r
+/**\r
+ * USBMSD class: generic class in order to use all kinds of blocks storage chip\r
+ *\r
+ * Introduction\r
+ *\r
+ * The USBMSD implements the MSD protocol. It permits to access a memory chip (flash, sdcard,...)\r
+ * from a computer over USB. But this class doesn't work standalone, you need to subclass this class\r
+ * and define virtual functions which are called in USBMSD.\r
+ *\r
+ * How to use this class with your chip ?\r
+ *\r
+ * You have to inherit and define some pure virtual functions (mandatory step):\r
+ *   - virtual int disk_read(char * data, int block): function to read a block\r
+ *   - virtual int disk_write(const char * data, int block): function to write a block\r
+ *   - virtual int disk_initialize(): function to initialize the memory\r
+ *   - virtual int disk_sectors(): return the number of blocks\r
+ *   - virtual int disk_size(): return the memory size\r
+ *   - virtual int disk_status(): return the status of the storage chip (0: OK, 1: not initialized, 2: no medium in the drive, 4: write protection)\r
+ *\r
+ * All functions names are compatible with the fat filesystem library. So you can imagine using your own class with\r
+ * USBMSD and the fat filesystem library in the same program. Just be careful because there are two different parts which\r
+ * will access the sd card. You can do a master/slave system using the disk_status method.\r
+ *\r
+ * Once these functions defined, you can call connect() (at the end of the constructor of your class for instance)\r
+ * of USBMSD to connect your mass storage device. connect() will first call disk_status() to test the status of the disk.\r
+ * If disk_status() returns 1 (disk not initialized), then disk_initialize() is called. After this step, connect() will collect information\r
+ * such as the number of blocks and the memory size.\r
+ */\r
+class USBMSD: public USBDevice {\r
+public:\r
+\r
+    /**\r
+    * Constructor\r
+    *\r
+    * @param vendor_id Your vendor_id\r
+    * @param product_id Your product_id\r
+    * @param product_release Your preoduct_release\r
+    */\r
+    USBMSD(uint16_t vendor_id = 0x0703, uint16_t product_id = 0x0104, uint16_t product_release = 0x0001);\r
+\r
+    /**\r
+    * Connect the USB MSD device. Establish disk initialization before really connect the device.\r
+    *\r
+    * @returns true if successful\r
+    */\r
+    bool connect();\r
+\r
+\r
+protected:\r
+\r
+    /*\r
+    * read a block on a storage chip\r
+    *\r
+    * @param data pointer where will be stored read data\r
+    * @param block block number\r
+    * @returns 0 if successful\r
+    */\r
+    virtual int disk_read(char * data, int block) = 0;\r
+\r
+    /*\r
+    * write a block on a storage chip\r
+    *\r
+    * @param data data to write\r
+    * @param block block number\r
+    * @returns 0 if successful\r
+    */\r
+    virtual int disk_write(const char * data, int block) = 0;\r
+\r
+    /*\r
+    * Disk initilization\r
+    */\r
+    virtual int disk_initialize() = 0;\r
+\r
+    /*\r
+    * Return the number of blocks\r
+    *\r
+    * @returns number of blocks\r
+    */\r
+    virtual int disk_sectors() = 0;\r
+\r
+    /*\r
+    * Return memory size\r
+    *\r
+    * @returns memory size\r
+    */\r
+    virtual int disk_size() = 0;\r
+\r
+\r
+    /*\r
+    * To check the status of the storage chip\r
+    *\r
+    * @returns status: 0: OK, 1: disk not initialized, 2: no medium in the drive, 4: write protected\r
+    */\r
+    virtual int disk_status() = 0;\r
+\r
+    /*\r
+    * Get string product descriptor\r
+    *\r
+    * @returns pointer to the string product descriptor\r
+    */\r
+    virtual uint8_t * stringIproductDesc();\r
+\r
+    /*\r
+    * Get string interface descriptor\r
+    *\r
+    * @returns pointer to the string interface descriptor\r
+    */\r
+    virtual uint8_t * stringIinterfaceDesc();\r
+\r
+    /*\r
+    * Get configuration descriptor\r
+    *\r
+    * @returns pointer to the configuration descriptor\r
+    */\r
+    virtual uint8_t * configurationDesc();\r
+\r
+    /*\r
+    * Callback called when a packet is received\r
+    */\r
+    virtual bool EP2_OUT_callback();\r
+\r
+    /*\r
+    * Callback called when a packet has been sent\r
+    */\r
+    virtual bool EP2_IN_callback();\r
+\r
+    /*\r
+    * Set configuration of device. Add endpoints\r
+    */\r
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);\r
+\r
+    /*\r
+    * Callback called to process class specific requests\r
+    */\r
+    virtual bool USBCallback_request();\r
+\r
+\r
+private:\r
+\r
+    // MSC Bulk-only Stage\r
+    enum Stage {\r
+        READ_CBW,     // wait a CBW\r
+        ERROR,        // error\r
+        PROCESS_CBW,  // process a CBW request\r
+        SEND_CSW,     // send a CSW\r
+        WAIT_CSW,     // wait that a CSW has been effectively sent\r
+    };\r
+\r
+    // Bulk-only CBW\r
+    typedef PACK_STRUCT_BEGIN struct {\r
+        uint32_t Signature;\r
+        uint32_t Tag;\r
+        uint32_t DataLength;\r
+        uint8_t  Flags;\r
+        uint8_t  LUN;\r
+        uint8_t  CBLength;\r
+        uint8_t  CB[16];\r
+    } PACK_STRUCT_STRUCT CBW;\r
+\r
+    // Bulk-only CSW\r
+    typedef PACK_STRUCT_BEGIN struct {\r
+        uint32_t Signature;\r
+        uint32_t Tag;\r
+        uint32_t DataResidue;\r
+        uint8_t  Status;\r
+    } PACK_STRUCT_STRUCT CSW;\r
+\r
+    //state of the bulk-only state machine\r
+    Stage stage;\r
+\r
+    // current CBW\r
+    CBW cbw;\r
+\r
+    // CSW which will be sent\r
+    CSW csw;\r
+\r
+    // addr where will be read or written data\r
+    uint32_t addr;\r
+\r
+    // length of a reading or writing\r
+    uint32_t length;\r
+\r
+    // memory OK (after a memoryVerify)\r
+    bool memOK;\r
+\r
+    // cache in RAM before writing in memory. Useful also to read a block.\r
+    uint8_t * page;\r
+\r
+    int BlockSize;\r
+    int MemorySize;\r
+    int BlockCount;\r
+\r
+    void CBWDecode(uint8_t * buf, uint16_t size);\r
+    void sendCSW (void);\r
+    bool inquiryRequest (void);\r
+    bool write (uint8_t * buf, uint16_t size);\r
+    bool readFormatCapacity();\r
+    bool readCapacity (void);\r
+    bool infoTransfer (void);\r
+    void memoryRead (void);\r
+    bool modeSense6 (void);\r
+    void testUnitReady (void);\r
+    bool requestSense (void);\r
+    void memoryVerify (uint8_t * buf, uint16_t size);\r
+    void memoryWrite (uint8_t * buf, uint16_t size);\r
+    void reset();\r
+    void fail();\r
+};\r
+\r
+#endif
\ No newline at end of file
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/CircBuffer.h b/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/CircBuffer.h
new file mode 100644 (file)
index 0000000..595cadc
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef CIRCBUFFER_H
+#define CIRCBUFFER_H
+
+template <class T>
+class CircBuffer {
+public:
+    CircBuffer(int length) {
+        write = 0;
+        read = 0;
+        size = length + 1;
+        buf = (T *)malloc(size * sizeof(T));
+    };
+
+    bool isFull() {
+        return ((write + 1) % size == read);
+    };
+
+    bool isEmpty() {
+        return (read == write);
+    };
+
+    void queue(T k) {
+        if (isFull()) {
+            read++;
+            read %= size;
+        }
+        buf[write++] = k;
+        write %= size;
+    }
+
+    uint16_t available() {
+        return (write >= read) ? write - read : size - read + write;
+    };
+
+    bool dequeue(T * c) {
+        bool empty = isEmpty();
+        if (!empty) {
+            *c = buf[read++];
+            read %= size;
+        }
+        return(!empty);
+    };
+
+private:
+    volatile uint16_t write;
+    volatile uint16_t read;
+    uint16_t size;
+    T * buf;
+};
+
+#endif
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBCDC.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBCDC.cpp
new file mode 100644 (file)
index 0000000..93c0f9d
--- /dev/null
@@ -0,0 +1,240 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBCDC.h"\r
+#include "USBBusInterface.h"\r
+\r
+static uint8_t cdc_line_coding[7]= {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};\r
+\r
+#define DEFAULT_CONFIGURATION (1)\r
+\r
+#define CDC_SET_LINE_CODING        0x20\r
+#define CDC_GET_LINE_CODING        0x21\r
+#define CDC_SET_CONTROL_LINE_STATE 0x22\r
+\r
+#define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK\r
+\r
+USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release): USBDevice(vendor_id, product_id, product_release) {\r
+    USBDevice::connect();\r
+}\r
+\r
+bool USBCDC::USBCallback_request(void) {\r
+    /* Called in ISR context */\r
+\r
+    bool success = false;\r
+    CONTROL_TRANSFER * transfer = getTransferPtr();\r
+\r
+    /* Process class-specific requests */\r
+\r
+    if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {\r
+        switch (transfer->setup.bRequest) {\r
+            case CDC_GET_LINE_CODING:\r
+                transfer->remaining = 7;\r
+                transfer->ptr = cdc_line_coding;\r
+                transfer->direction = DEVICE_TO_HOST;\r
+                success = true;\r
+                break;\r
+            case CDC_SET_LINE_CODING:\r
+                transfer->remaining = 7;\r
+                success = true;\r
+                break;\r
+            case CDC_SET_CONTROL_LINE_STATE:\r
+                success = true;\r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+\r
+    return success;\r
+}\r
+\r
+\r
+// Called in ISR context\r
+// Set configuration. Return false if the\r
+// configuration is not supported.\r
+bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) {\r
+    if (configuration != DEFAULT_CONFIGURATION) {\r
+        return false;\r
+    }\r
+\r
+    // Configure endpoints > 0\r
+    addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);\r
+    addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);\r
+    addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+\r
+    // We activate the endpoint to be able to recceive data\r
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+    return true;\r
+}\r
+\r
+bool USBCDC::send(uint8_t * buffer, uint16_t size) {\r
+    return USBDevice::write(EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE);\r
+}\r
+\r
+bool USBCDC::readEP(uint8_t * buffer, uint16_t * size) {\r
+    if (!USBDevice::readEP(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))\r
+        return false;\r
+    if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))\r
+        return false;\r
+    return true;\r
+}\r
+\r
+bool USBCDC::readEP_NB(uint8_t * buffer, uint16_t * size) {\r
+    if (!USBDevice::readEP_NB(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))\r
+        return false;\r
+    if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))\r
+        return false;\r
+    return true;\r
+}\r
+\r
+\r
+uint8_t * USBCDC::deviceDesc() {\r
+    static uint8_t deviceDescriptor[] = {\r
+        18,                   // bLength\r
+        1,                    // bDescriptorType\r
+        0x10, 0x01,           // bcdUSB\r
+        2,                    // bDeviceClass\r
+        0,                    // bDeviceSubClass\r
+        0,                    // bDeviceProtocol\r
+        MAX_PACKET_SIZE_EP0,  // bMaxPacketSize0\r
+        LSB(VENDOR_ID), MSB(VENDOR_ID),  // idVendor\r
+        LSB(PRODUCT_ID), MSB(PRODUCT_ID),// idProduct\r
+        0x00, 0x01,           // bcdDevice\r
+        1,                    // iManufacturer\r
+        2,                    // iProduct\r
+        3,                    // iSerialNumber\r
+        1                     // bNumConfigurations\r
+    };\r
+    return deviceDescriptor;\r
+}\r
+\r
+uint8_t * USBCDC::stringIinterfaceDesc() {\r
+    static uint8_t stringIinterfaceDescriptor[] = {\r
+        0x08,\r
+        STRING_DESCRIPTOR,\r
+        'C',0,'D',0,'C',0,\r
+    };\r
+    return stringIinterfaceDescriptor;\r
+}\r
+\r
+uint8_t * USBCDC::stringIproductDesc() {\r
+    static uint8_t stringIproductDescriptor[] = {\r
+        0x16,\r
+        STRING_DESCRIPTOR,\r
+        'C',0,'D',0,'C',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0\r
+    };\r
+    return stringIproductDescriptor;\r
+}\r
+\r
+\r
+#define CONFIG1_DESC_SIZE (9+9+5+5+4+5+7+9+7+7)\r
+\r
+uint8_t * USBCDC::configurationDesc() {\r
+    static uint8_t configDescriptor[] = {\r
+        9,                      // bLength;\r
+        2,                      // bDescriptorType;\r
+        LSB(CONFIG1_DESC_SIZE), // wTotalLength\r
+        MSB(CONFIG1_DESC_SIZE),\r
+        2,                      // bNumInterfaces\r
+        1,                      // bConfigurationValue\r
+        0,                      // iConfiguration\r
+        0x80,                   // bmAttributes\r
+        50,                     // bMaxPower\r
+\r
+        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\r
+        9,                      // bLength\r
+        4,                      // bDescriptorType\r
+        0,                      // bInterfaceNumber\r
+        0,                      // bAlternateSetting\r
+        1,                      // bNumEndpoints\r
+        0x02,                   // bInterfaceClass\r
+        0x02,                   // bInterfaceSubClass\r
+        0x01,                   // bInterfaceProtocol\r
+        0,                      // iInterface\r
+\r
+        // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26\r
+        5,                      // bFunctionLength\r
+        0x24,                   // bDescriptorType\r
+        0x00,                   // bDescriptorSubtype\r
+        0x10, 0x01,             // bcdCDC\r
+\r
+        // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27\r
+        5,                      // bFunctionLength\r
+        0x24,                   // bDescriptorType\r
+        0x01,                   // bDescriptorSubtype\r
+        0x03,                   // bmCapabilities\r
+        1,                      // bDataInterface\r
+\r
+        // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28\r
+        4,                      // bFunctionLength\r
+        0x24,                   // bDescriptorType\r
+        0x02,                   // bDescriptorSubtype\r
+        0x06,                   // bmCapabilities\r
+\r
+        // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33\r
+        5,                      // bFunctionLength\r
+        0x24,                   // bDescriptorType\r
+        0x06,                   // bDescriptorSubtype\r
+        0,                      // bMasterInterface\r
+        1,                      // bSlaveInterface0\r
+\r
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\r
+        ENDPOINT_DESCRIPTOR_LENGTH,     // bLength\r
+        ENDPOINT_DESCRIPTOR,            // bDescriptorType\r
+        PHY_TO_DESC(EPINT_IN),          // bEndpointAddress\r
+        E_INTERRUPT,                    // bmAttributes (0x03=intr)\r
+        LSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPINT),     // wMaxPacketSize (MSB)\r
+        16,                             // bInterval\r
+\r
+\r
+\r
+\r
+        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\r
+        9,          // bLength\r
+        4,          // bDescriptorType\r
+        1,          // bInterfaceNumber\r
+        0,          // bAlternateSetting\r
+        2,          // bNumEndpoints\r
+        0x0A,       // bInterfaceClass\r
+        0x00,       // bInterfaceSubClass\r
+        0x00,       // bInterfaceProtocol\r
+        0,          // iInterface\r
+\r
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\r
+        7,                      // bLength\r
+        5,                      // bDescriptorType\r
+        PHY_TO_DESC(EPBULK_IN), // bEndpointAddress\r
+        0x02,                   // bmAttributes (0x02=bulk)\r
+        LSB(MAX_PACKET_SIZE_EPBULK),    // wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPBULK),    // wMaxPacketSize (MSB)\r
+        0,                      // bInterval\r
+\r
+        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\r
+        7,                      // bLength\r
+        5,                      // bDescriptorType\r
+        PHY_TO_DESC(EPBULK_OUT),// bEndpointAddress\r
+        0x02,                   // bmAttributes (0x02=bulk)\r
+        LSB(MAX_PACKET_SIZE_EPBULK),    // wMaxPacketSize (LSB)\r
+        MSB(MAX_PACKET_SIZE_EPBULK),     // wMaxPacketSize (MSB)\r
+        0                       // bInterval\r
+    };\r
+    return configDescriptor;\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBCDC.h b/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBCDC.h
new file mode 100644 (file)
index 0000000..56539c7
--- /dev/null
@@ -0,0 +1,110 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef USBCDC_H\r
+#define USBCDC_H\r
+\r
+/* These headers are included for child class. */\r
+#include "USBEndpoints.h"\r
+#include "USBDescriptor.h"\r
+#include "USBDevice_Types.h"\r
+\r
+#include "USBDevice.h"\r
+\r
+\r
+\r
+class USBCDC: public USBDevice {\r
+public:\r
+\r
+    /*\r
+    * Constructor\r
+    *\r
+    * @param vendor_id Your vendor_id\r
+    * @param product_id Your product_id\r
+    * @param product_release Your preoduct_release\r
+    */\r
+    USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release);\r
+\r
+protected:\r
+    \r
+    /*\r
+    * Get device descriptor. Warning: this method has to store the length of the report descriptor in reportLength.\r
+    *\r
+    * @returns pointer to the device descriptor\r
+    */\r
+    virtual uint8_t * deviceDesc();\r
+    \r
+    /*\r
+    * Get string product descriptor\r
+    *\r
+    * @returns pointer to the string product descriptor\r
+    */\r
+    virtual uint8_t * stringIproductDesc();\r
+    \r
+    /*\r
+    * Get string interface descriptor\r
+    *\r
+    * @returns pointer to the string interface descriptor\r
+    */\r
+    virtual uint8_t * stringIinterfaceDesc();\r
+    \r
+    /*\r
+    * Get configuration descriptor\r
+    *\r
+    * @returns pointer to the configuration descriptor\r
+    */\r
+    virtual uint8_t * configurationDesc();\r
+    \r
+    /*\r
+    * Send a buffer\r
+    *\r
+    * @param endpoint endpoint which will be sent the buffer\r
+    * @param buffer buffer to be sent\r
+    * @param size length of the buffer\r
+    * @returns true if successful\r
+    */\r
+    bool send(uint8_t * buffer, uint16_t size);\r
+    \r
+    /*\r
+    * Read a buffer from a certain endpoint. Warning: blocking\r
+    *\r
+    * @param endpoint endpoint to read\r
+    * @param buffer buffer where will be stored bytes\r
+    * @param size the number of bytes read will be stored in *size\r
+    * @param maxSize the maximum length that can be read\r
+    * @returns true if successful\r
+    */\r
+    bool readEP(uint8_t * buffer, uint16_t * size);\r
+    \r
+    /*\r
+    * Read a buffer from a certain endpoint. Warning: non blocking\r
+    *\r
+    * @param endpoint endpoint to read\r
+    * @param buffer buffer where will be stored bytes\r
+    * @param size the number of bytes read will be stored in *size\r
+    * @param maxSize the maximum length that can be read\r
+    * @returns true if successful\r
+    */\r
+    bool readEP_NB(uint8_t * buffer, uint16_t * size);\r
+\r
+    virtual bool USBCallback_request();\r
+    virtual bool USBCallback_setConfiguration(uint8_t configuration);\r
+\r
+};\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBSerial.cpp b/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBSerial.cpp
new file mode 100644 (file)
index 0000000..3d49cd7
--- /dev/null
@@ -0,0 +1,70 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#include "stdint.h"\r
+#include "USBSerial.h"\r
+#include "USBBusInterface.h"\r
+\r
+\r
+int USBSerial::_putc(int c) {\r
+    send((uint8_t *)&c, 1);\r
+    return 1;\r
+}\r
+\r
+int USBSerial::_getc() {\r
+    uint8_t c;\r
+    while (buf.isEmpty());\r
+    buf.dequeue(&c);\r
+    return c;\r
+}\r
+\r
+\r
+bool USBSerial::writeBlock(uint8_t * buf, uint16_t size) {\r
+    if(size > MAX_PACKET_SIZE_EPBULK) {\r
+        return false;\r
+    }\r
+    if(!send(buf, size)) {\r
+        return false;\r
+    }\r
+    return true;\r
+}\r
+\r
+\r
+\r
+bool USBSerial::EP2_OUT_callback() {\r
+    uint8_t c[65];\r
+    uint16_t size = 0;\r
+\r
+    //we read the packet received and put it on the circular buffer\r
+    readEP(c, &size);\r
+    for (int i = 0; i < size; i++) {\r
+        buf.queue(c[i]);\r
+    }\r
+\r
+    //call a potential handler\r
+    rx.call();\r
+\r
+    // We reactivate the endpoint to receive next characters\r
+    readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);\r
+    return true;\r
+}\r
+\r
+uint8_t USBSerial::available() {\r
+    return buf.available();\r
+}\r
+\r
diff --git a/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBSerial.h b/gcc4mbed/samples/MSTest/USBDevice/USBSERIAL/USBSerial.h
new file mode 100644 (file)
index 0000000..5fe6c1c
--- /dev/null
@@ -0,0 +1,128 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License\r
+*\r
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software\r
+* and associated documentation files (the "Software"), to deal in the Software without\r
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,\r
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\r
+* Software is furnished to do so, subject to the following conditions:\r
+*\r
+* The above copyright notice and this permission notice shall be included in all copies or\r
+* substantial portions of the Software.\r
+*\r
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\r
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\r
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+*/\r
+\r
+#ifndef USBSERIAL_H\r
+#define USBSERIAL_H\r
+\r
+#include "USBCDC.h"\r
+#include "Stream.h"\r
+#include "CircBuffer.h"\r
+\r
+\r
+/**\r
+* USBSerial example\r
+*\r
+* @code\r
+* #include "mbed.h"\r
+* #include "USBSerial.h"\r
+*\r
+* //Virtual serial port over USB\r
+* USBSerial serial;\r
+*\r
+* int main(void) {\r
+*\r
+*    while(1)\r
+*    {\r
+*        serial.printf("I am a virtual serial port\n");\r
+*        wait(1);\r
+*    }\r
+* }\r
+* @endcode\r
+*/\r
+class USBSerial: public USBCDC, public Stream {\r
+public:\r
+\r
+    /**\r
+    *   Constructor\r
+    *\r
+    * @param vendor_id Your vendor_id (default: 0x1f00)\r
+    * @param product_id Your product_id (default: 0x2012)\r
+    * @param product_release Your preoduct_release (default: 0x0001)\r
+    *\r
+    */\r
+    USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001): USBCDC(vendor_id, product_id, product_release), buf(128){ };\r
+\r
+\r
+    /**\r
+    * Send a character. You can use puts, printf.\r
+    *\r
+    * @param c character to be sent\r
+    * @returns true if there is no error, false otherwise\r
+    */\r
+    virtual int _putc(int c);\r
+    \r
+    /**\r
+    * Read a character: blocking\r
+    *\r
+    * @returns character read\r
+    */\r
+    virtual int _getc();\r
+    \r
+    /**\r
+    * Check the number of bytes available.\r
+    *\r
+    * @returns the number of bytes available\r
+    */\r
+    uint8_t available(); \r
+    \r
+    /**\r
+    * Write a block of data. \r
+    *\r
+    * For more efficiency, a block of size 64 (maximum size of a bulk endpoint) has to be written.\r
+    *\r
+    * @param buf pointer on data which will be written\r
+    * @param size size of the buffer. The maximum size of a block is limited by the size of the endpoint (64 bytes)\r
+    *\r
+    * @returns true if successfull\r
+    */\r
+    bool writeBlock(uint8_t * buf, uint16_t size);\r
+\r
+    /**\r
+     *  Attach a member function to call when a packet is received. \r
+     *\r
+     *  @param tptr pointer to the object to call the member function on\r
+     *  @param mptr pointer to the member function to be called\r
+     */\r
+    template<typename T>\r
+    void attach(T* tptr, void (T::*mptr)(void)) {\r
+        if((mptr != NULL) && (tptr != NULL)) {\r
+            rx.attach(tptr, mptr);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Attach a callback called when a packet is received\r
+     *\r
+     * @param fptr function pointer\r
+     */\r
+    void attach(void (*fn)(void)) {\r
+        if(fn != NULL) {\r
+            rx.attach(fn);\r
+        }\r
+    }\r
+\r
+\r
+protected:\r
+    virtual bool EP2_OUT_callback();\r
+\r
+private:\r
+    FunctionPointer rx;\r
+    CircBuffer<uint8_t> buf;\r
+};\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/USBMSD_SD/.meta b/gcc4mbed/samples/MSTest/USBMSD_SD/.meta
new file mode 100644 (file)
index 0000000..290d6a0
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<root>
+  <global/>
+  <data>
+    <created_ts>1326181726</created_ts>
+    <last_mod_ts>1326181726</last_mod_ts>
+    <is_archive>0</is_archive>
+    <is_published>1</is_published>
+    <is_svn>0</is_svn>
+    <is_module>1</is_module>
+    <is_lib>0</is_lib>
+    <url>http://mbed.org/users/samux/libraries/USBMSD_SD</url>
+    <url_full>http://mbed.org/users/samux/libraries/USBMSD_SD/m20kgz</url_full>
+    <rev>m20kgz</rev>
+  </data>
+</root>
diff --git a/gcc4mbed/samples/MSTest/USBMSD_SD/USBMSD_SD.cpp b/gcc4mbed/samples/MSTest/USBMSD_SD/USBMSD_SD.cpp
new file mode 100644 (file)
index 0000000..6801feb
--- /dev/null
@@ -0,0 +1,467 @@
+/* mbed USBMSD_SD Library, for providing file access to SD cards\r
+ * Copyright (c) 2008-2010, sford\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to deal\r
+ * in the Software without restriction, including without limitation the rights\r
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+ * copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+\r
+/* Introduction\r
+ * ------------\r
+ * SD and MMC cards support a number of interfaces, but common to them all\r
+ * is one based on SPI. This is the one I'm implmenting because it means\r
+ * it is much more portable even though not so performant, and we already \r
+ * have the mbed SPI Interface!\r
+ *\r
+ * The main reference I'm using is Chapter 7, "SPI Mode" of: \r
+ *  http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf\r
+ *\r
+ * SPI Startup\r
+ * -----------\r
+ * The SD card powers up in SD mode. The SPI interface mode is selected by\r
+ * asserting CS low and sending the reset command (CMD0). The card will \r
+ * respond with a (R1) response.\r
+ *\r
+ * CMD8 is optionally sent to determine the voltage range supported, and \r
+ * indirectly determine whether it is a version 1.x SD/non-SD card or \r
+ * version 2.x. I'll just ignore this for now.\r
+ *\r
+ * ACMD41 is repeatedly issued to initialise the card, until "in idle"\r
+ * (bit 0) of the R1 response goes to '0', indicating it is initialised.\r
+ *\r
+ * You should also indicate whether the host supports High Capicity cards,\r
+ * and check whether the card is high capacity - i'll also ignore this\r
+ *\r
+ * SPI Protocol\r
+ * ------------\r
+ * The SD SPI protocol is based on transactions made up of 8-bit words, with\r
+ * the host starting every bus transaction by asserting the CS signal low. The\r
+ * card always responds to commands, data blocks and errors.\r
+ * \r
+ * The protocol supports a CRC, but by default it is off (except for the \r
+ * first reset CMD0, where the CRC can just be pre-calculated, and CMD8)\r
+ * I'll leave the CRC off I think! \r
+ * \r
+ * Standard capacity cards have variable data block sizes, whereas High \r
+ * Capacity cards fix the size of data block to 512 bytes. I'll therefore\r
+ * just always use the Standard Capacity cards with a block size of 512 bytes.\r
+ * This is set with CMD16.\r
+ *\r
+ * You can read and write single blocks (CMD17, CMD25) or multiple blocks \r
+ * (CMD18, CMD25). For simplicity, I'll just use single block accesses. When\r
+ * the card gets a read command, it responds with a response token, and then \r
+ * a data token or an error.\r
+ * \r
+ * SPI Command Format\r
+ * ------------------\r
+ * Commands are 6-bytes long, containing the command, 32-bit argument, and CRC.\r
+ *\r
+ * +---------------+------------+------------+-----------+----------+--------------+\r
+ * | 01 | cmd[5:0] | arg[31:24] | arg[23:16] | arg[15:8] | arg[7:0] | crc[6:0] | 1 |\r
+ * +---------------+------------+------------+-----------+----------+--------------+\r
+ *\r
+ * As I'm not using CRC, I can fix that byte to what is needed for CMD0 (0x95)\r
+ *\r
+ * All Application Specific commands shall be preceded with APP_CMD (CMD55).\r
+ *\r
+ * SPI Response Format\r
+ * -------------------\r
+ * The main response format (R1) is a status byte (normally zero). Key flags:\r
+ *  idle - 1 if the card is in an idle state/initialising \r
+ *  cmd  - 1 if an illegal command code was detected\r
+ *\r
+ *    +-------------------------------------------------+\r
+ * R1 | 0 | arg | addr | seq | crc | cmd | erase | idle |\r
+ *    +-------------------------------------------------+\r
+ *\r
+ * R1b is the same, except it is followed by a busy signal (zeros) until\r
+ * the first non-zero byte when it is ready again.\r
+ *\r
+ * Data Response Token\r
+ * -------------------\r
+ * Every data block written to the card is acknowledged by a byte \r
+ * response token\r
+ *\r
+ * +----------------------+\r
+ * | xxx | 0 | status | 1 |\r
+ * +----------------------+\r
+ *              010 - OK!\r
+ *              101 - CRC Error\r
+ *              110 - Write Error\r
+ *\r
+ * Single Block Read and Write\r
+ * ---------------------------\r
+ *\r
+ * Block transfers have a byte header, followed by the data, followed\r
+ * by a 16-bit CRC. In our case, the data will always be 512 bytes.\r
+ *  \r
+ * +------+---------+---------+- -  - -+---------+-----------+----------+\r
+ * | 0xFE | data[0] | data[1] |        | data[n] | crc[15:8] | crc[7:0] | \r
+ * +------+---------+---------+- -  - -+---------+-----------+----------+\r
+ */\r
\r
+#include "USBMSD_SD.h"\r
+\r
+#define SD_COMMAND_TIMEOUT 5000\r
+\r
+USBMSD_SD::USBMSD_SD(PinName mosi, PinName miso, PinName sclk, PinName cs) :\r
+   _spi(mosi, miso, sclk), _cs(cs) {\r
+      _cs = 1;\r
+      //no init\r
+      _status = 0x01;\r
+      connect();\r
+}\r
+\r
+#define R1_IDLE_STATE           (1 << 0)\r
+#define R1_ERASE_RESET          (1 << 1)\r
+#define R1_ILLEGAL_COMMAND      (1 << 2)\r
+#define R1_COM_CRC_ERROR        (1 << 3)\r
+#define R1_ERASE_SEQUENCE_ERROR (1 << 4)\r
+#define R1_ADDRESS_ERROR        (1 << 5)\r
+#define R1_PARAMETER_ERROR      (1 << 6)\r
+\r
+// Types\r
+//  - v1.x Standard Capacity\r
+//  - v2.x Standard Capacity\r
+//  - v2.x High Capacity\r
+//  - Not recognised as an SD Card\r
+\r
+#define SDCARD_FAIL 0\r
+#define SDCARD_V1   1\r
+#define SDCARD_V2   2\r
+#define SDCARD_V2HC 3\r
+\r
+int USBMSD_SD::initialise_card() {\r
+    // Set to 100kHz for initialisation, and clock card with cs = 1\r
+    _spi.frequency(100000); \r
+    _cs = 1;\r
+    for(int i=0; i<16; i++) {\r
+        _spi.write(0xFF);\r
+    }\r
+\r
+    // send CMD0, should return with all zeros except IDLE STATE set (bit 0)\r
+    if(_cmd(0, 0) != R1_IDLE_STATE) { \r
+        fprintf(stderr, "No disk, or could not put SD card in to SPI idle state\n");\r
+        return SDCARD_FAIL;\r
+    }\r
+\r
+    // send CMD8 to determine whther it is ver 2.x\r
+    int r = _cmd8();\r
+    if(r == R1_IDLE_STATE) {\r
+        return initialise_card_v2();\r
+    } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {\r
+        return initialise_card_v1();\r
+    } else {\r
+        fprintf(stderr, "Not in idle state after sending CMD8 (not an SD card?)\n");\r
+        return SDCARD_FAIL;\r
+    }\r
+}\r
+\r
+int USBMSD_SD::initialise_card_v1() {\r
+    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {\r
+        _cmd(55, 0); \r
+        if(_cmd(41, 0) == 0) { \r
+            return SDCARD_V1;\r
+        }\r
+    }\r
+\r
+    fprintf(stderr, "Timeout waiting for v1.x card\n");\r
+    return SDCARD_FAIL;\r
+}\r
+\r
+int USBMSD_SD::initialise_card_v2() {\r
+    \r
+    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {\r
+        _cmd(55, 0); \r
+        if(_cmd(41, 0) == 0) { \r
+            _cmd58();\r
+            return SDCARD_V2;\r
+        }\r
+    }\r
+\r
+    fprintf(stderr, "Timeout waiting for v2.x card\n");\r
+    return SDCARD_FAIL;\r
+}\r
+\r
+int USBMSD_SD::disk_initialize() {\r
+\r
+    int i = initialise_card();\r
+//    printf("init card = %d\n", i);\r
+//    printf("OK\n");\r
+\r
+    _sectors = _sd_sectors();\r
+\r
+    // Set block length to 512 (CMD16)\r
+    if(_cmd(16, 512) != 0) {\r
+        fprintf(stderr, "Set 512-byte block timed out\n");\r
+        return 1;\r
+    }\r
+        \r
+    _spi.frequency(5000000); // Set to 5MHz for data transfer\r
+    // OK\r
+    _status = 0x00;\r
+    return 0;\r
+}\r
+\r
+int USBMSD_SD::disk_write(const char *buffer, int block_number) {\r
+    // set write address for single block (CMD24)\r
+    if(_cmd(24, block_number * 512) != 0) {\r
+        return 1;\r
+    }\r
+\r
+    // send the data block\r
+    _write(buffer, 512);    \r
+    return 0;    \r
+}\r
+\r
+int USBMSD_SD::disk_read(char *buffer, int block_number) {        \r
+    // set read address for single block (CMD17)\r
+    if(_cmd(17, block_number * 512) != 0) {\r
+        return 1;\r
+    }\r
+    \r
+    // receive the data\r
+    _read(buffer, 512);\r
+    return 0;\r
+}\r
+\r
+int USBMSD_SD::disk_status() { return _status; }\r
+int USBMSD_SD::disk_sync() { return 0; }\r
+int USBMSD_SD::disk_sectors() { return _sectors; }\r
+\r
+// PRIVATE FUNCTIONS\r
+\r
+int USBMSD_SD::_cmd(int cmd, int arg) {\r
+    _cs = 0; \r
+\r
+    // send a command\r
+    _spi.write(0x40 | cmd);\r
+    _spi.write(arg >> 24);\r
+    _spi.write(arg >> 16);\r
+    _spi.write(arg >> 8);\r
+    _spi.write(arg >> 0);\r
+    _spi.write(0x95);\r
+\r
+    // wait for the repsonse (response[7] == 0)\r
+    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {\r
+        int response = _spi.write(0xFF);\r
+        if(!(response & 0x80)) {\r
+            _cs = 1;\r
+            _spi.write(0xFF);\r
+            return response;\r
+        }\r
+    }\r
+    _cs = 1;\r
+    _spi.write(0xFF);\r
+    return -1; // timeout\r
+}\r
+int USBMSD_SD::_cmdx(int cmd, int arg) {\r
+    _cs = 0; \r
+\r
+    // send a command\r
+    _spi.write(0x40 | cmd);\r
+    _spi.write(arg >> 24);\r
+    _spi.write(arg >> 16);\r
+    _spi.write(arg >> 8);\r
+    _spi.write(arg >> 0);\r
+    _spi.write(0x95);\r
+\r
+    // wait for the repsonse (response[7] == 0)\r
+    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {\r
+        int response = _spi.write(0xFF);\r
+        if(!(response & 0x80)) {\r
+            return response;\r
+        }\r
+    }\r
+    _cs = 1;\r
+    _spi.write(0xFF);\r
+    return -1; // timeout\r
+}\r
+\r
+\r
+int USBMSD_SD::_cmd58() {\r
+    _cs = 0; \r
+    int arg = 0;\r
+    \r
+    // send a command\r
+    _spi.write(0x40 | 58);\r
+    _spi.write(arg >> 24);\r
+    _spi.write(arg >> 16);\r
+    _spi.write(arg >> 8);\r
+    _spi.write(arg >> 0);\r
+    _spi.write(0x95);\r
+\r
+    // wait for the repsonse (response[7] == 0)\r
+    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {\r
+        int response = _spi.write(0xFF);\r
+        if(!(response & 0x80)) {\r
+            int ocr = _spi.write(0xFF) << 24;\r
+            ocr |= _spi.write(0xFF) << 16;\r
+            ocr |= _spi.write(0xFF) << 8;\r
+            ocr |= _spi.write(0xFF) << 0;\r
+//            printf("OCR = 0x%08X\n", ocr);\r
+            _cs = 1;\r
+            _spi.write(0xFF);\r
+            return response;\r
+        }\r
+    }\r
+    _cs = 1;\r
+    _spi.write(0xFF);\r
+    return -1; // timeout\r
+}\r
+\r
+int USBMSD_SD::_cmd8() {\r
+    _cs = 0; \r
+    \r
+    // send a command\r
+    _spi.write(0x40 | 8); // CMD8\r
+    _spi.write(0x00);     // reserved\r
+    _spi.write(0x00);     // reserved\r
+    _spi.write(0x01);     // 3.3v\r
+    _spi.write(0xAA);     // check pattern\r
+    _spi.write(0x87);     // crc\r
+\r
+    // wait for the repsonse (response[7] == 0)\r
+    for(int i=0; i<SD_COMMAND_TIMEOUT * 1000; i++) {\r
+        char response[5];\r
+        response[0] = _spi.write(0xFF);\r
+        if(!(response[0] & 0x80)) {\r
+                for(int j=1; j<5; j++) {\r
+                    response[i] = _spi.write(0xFF);\r
+                }\r
+                _cs = 1;\r
+                _spi.write(0xFF);\r
+                return response[0];\r
+        }\r
+    }\r
+    _cs = 1;\r
+    _spi.write(0xFF);\r
+    return -1; // timeout\r
+}\r
+\r
+int USBMSD_SD::_read(char *buffer, int length) {\r
+    _cs = 0;\r
+\r
+    // read until start byte (0xFF)\r
+    while(_spi.write(0xFF) != 0xFE);\r
+\r
+    // read data\r
+    for(int i=0; i<length; i++) {\r
+        buffer[i] = _spi.write(0xFF);\r
+    }\r
+    _spi.write(0xFF); // checksum\r
+    _spi.write(0xFF);\r
+\r
+    _cs = 1;    \r
+    _spi.write(0xFF);\r
+    return 0;\r
+}\r
+\r
+int USBMSD_SD::_write(const char *buffer, int length) {\r
+    _cs = 0;\r
+    \r
+    // indicate start of block\r
+    _spi.write(0xFE);\r
+    \r
+    // write the data\r
+    for(int i=0; i<length; i++) {\r
+        _spi.write(buffer[i]);\r
+    }\r
+    \r
+    // write the checksum\r
+    _spi.write(0xFF); \r
+    _spi.write(0xFF);\r
+\r
+    // check the repsonse token\r
+    if((_spi.write(0xFF) & 0x1F) != 0x05) {\r
+        _cs = 1;\r
+        _spi.write(0xFF);        \r
+        return 1;\r
+    }\r
+\r
+    // wait for write to finish\r
+    while(_spi.write(0xFF) == 0);\r
+\r
+    _cs = 1; \r
+    _spi.write(0xFF);\r
+    return 0;\r
+}\r
+\r
+static int ext_bits(char *data, int msb, int lsb) {\r
+    int bits = 0;\r
+    int size = 1 + msb - lsb; \r
+    for(int i=0; i<size; i++) {\r
+        int position = lsb + i;\r
+        int byte = 15 - (position >> 3);\r
+        int bit = position & 0x7;\r
+        int value = (data[byte] >> bit) & 1;\r
+        bits |= value << i;\r
+    }\r
+    return bits;\r
+}\r
+\r
+int USBMSD_SD::_sd_sectors() {\r
+\r
+    // CMD9, Response R2 (R1 byte + 16-byte block read)\r
+    if(_cmdx(9, 0) != 0) {\r
+        fprintf(stderr, "Didn't get a response from the disk\n");\r
+        return 0;\r
+    }\r
+    \r
+    char csd[16];    \r
+    if(_read(csd, 16) != 0) {\r
+        fprintf(stderr, "Couldn't read csd response from disk\n");\r
+        return 0;\r
+    }\r
+\r
+    // csd_structure : csd[127:126]\r
+    // c_size        : csd[73:62]\r
+    // c_size_mult   : csd[49:47]\r
+    // read_bl_len   : csd[83:80] - the *maximum* read block length\r
+\r
+    int csd_structure = ext_bits(csd, 127, 126);\r
+    int c_size = ext_bits(csd, 73, 62);\r
+    int c_size_mult = ext_bits(csd, 49, 47);\r
+    int read_bl_len = ext_bits(csd, 83, 80);\r
+\r
+//    printf("CSD_STRUCT = %d\n", csd_structure);\r
+    \r
+    if(csd_structure != 0) {\r
+        fprintf(stderr, "This disk tastes funny! I only know about type 0 CSD structures\n");\r
+        return 0;\r
+    }\r
+\r
+    // memory capacity = BLOCKNR * BLOCK_LEN\r
+    // where\r
+    //  BLOCKNR = (C_SIZE+1) * MULT\r
+    //  MULT = 2^(C_SIZE_MULT+2) (C_SIZE_MULT < 8)\r
+    //  BLOCK_LEN = 2^READ_BL_LEN, (READ_BL_LEN < 12)         \r
+\r
+    int block_len = 1 << read_bl_len;\r
+    int mult = 1 << (c_size_mult + 2);\r
+    int blocknr = (c_size + 1) * mult;\r
+    capacity = blocknr * block_len;\r
+\r
+    int blocks = capacity / 512;\r
+        \r
+    return blocks;\r
+}\r
+\r
+\r
+int USBMSD_SD::disk_size() {\r
+    return capacity;\r
+}\r
diff --git a/gcc4mbed/samples/MSTest/USBMSD_SD/USBMSD_SD.h b/gcc4mbed/samples/MSTest/USBMSD_SD/USBMSD_SD.h
new file mode 100644 (file)
index 0000000..d99df24
--- /dev/null
@@ -0,0 +1,85 @@
+/* mbed USBMSD_SD Library, for providing file access to SD cards\r
+ * Copyright (c) 2008-2010, sford\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to deal\r
+ * in the Software without restriction, including without limitation the rights\r
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+ * copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ */\r
+\r
+#ifndef USBMSD_SD_H\r
+#define USBMSD_SD_H\r
+\r
+#include "mbed.h"\r
+#include "USBMSD.h"\r
+\r
+/** Use the SDcard as mass storage device using the USBMSD class\r
+ *\r
+ * @code\r
+ * #include "mbed.h"\r
+ * #include "USBMSD_SD.h"\r
+ *\r
+ * USBMSD_SD sd(p5, p6, p7, p8);\r
+ *\r
+ * int main() {\r
+ *   while(1);\r
+ * }\r
+ *\r
+ * @endcode\r
+ */\r
+class USBMSD_SD : public USBMSD {\r
+public:\r
+\r
+    /** Create the File System for accessing an SD Card using SPI\r
+     *\r
+     * @param mosi SPI mosi pin connected to SD Card\r
+     * @param miso SPI miso pin conencted to SD Card\r
+     * @param sclk SPI sclk pin connected to SD Card\r
+     * @param cs   DigitalOut pin used as SD Card chip select\r
+     * @param name The name used to access the virtual filesystem\r
+     */\r
+    USBMSD_SD(PinName mosi, PinName miso, PinName sclk, PinName cs);\r
+    virtual int disk_initialize();\r
+    virtual int disk_write(const char *buffer, int block_number);\r
+    virtual int disk_read(char *buffer, int block_number);    \r
+    virtual int disk_status();\r
+    virtual int disk_sync();\r
+    virtual int disk_sectors();\r
+    virtual int disk_size();\r
+\r
+protected:\r
+\r
+    int _cmd(int cmd, int arg);\r
+    int _cmdx(int cmd, int arg);\r
+    int _cmd8();\r
+    int _cmd58();\r
+    int initialise_card();\r
+    int initialise_card_v1();\r
+    int initialise_card_v2();\r
+    \r
+    int _read(char *buffer, int length);\r
+    int _write(const char *buffer, int length);\r
+    int _sd_sectors();\r
+    int _sectors;\r
+    \r
+    int capacity;\r
+    int _status;\r
+    \r
+    SPI _spi;\r
+    DigitalOut _cs;\r
+};\r
+\r
+#endif\r
diff --git a/gcc4mbed/samples/MSTest/main.cpp b/gcc4mbed/samples/MSTest/main.cpp
new file mode 100644 (file)
index 0000000..b17703b
--- /dev/null
@@ -0,0 +1,8 @@
+#include "mbed.h"\r
+#include "USBMSD_SD.h"\r
+\r
+USBMSD_SD sd(p5, p6, p7, p8);\r
+\r
+int main() {\r
+    while(1);\r
+}
\ No newline at end of file
diff --git a/gcc4mbed/samples/MSTest/makefile b/gcc4mbed/samples/MSTest/makefile
new file mode 100644 (file)
index 0000000..079f593
--- /dev/null
@@ -0,0 +1,20 @@
+# Copyright 2011 Adam Green (http://mbed.org/users/AdamGreen/)\r
+#\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#     http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+PROJECT=MSTest\r
+GCC4MBED_DIR=../..\r
+INCDIRS=\r
+LIBS_PREFIX=\r
+LIBS_SUFFIX=\r
+\r
+include ../../build/gcc4mbed.mk\r
index 67829f7..633a5ae 100644 (file)
@@ -10,7 +10,4 @@ class Hook : public FunctionPointer {
         double           counter;
 };
 
-
-
-
 #endif
index a5e3bee..c7cbeee 100644 (file)
@@ -22,9 +22,6 @@ using namespace std;
 #include "modules/robot/Player.h"
 
 
-
-
-
 // List of callback functions, ordered as their corresponding events
 const ModuleCallback kernel_callback_functions[NUMBER_OF_DEFINED_EVENTS] = { 
         &Module::on_main_loop, 
@@ -57,7 +54,7 @@ Kernel::Kernel(){
     this->slow_ticker->kernel = this; // DEBUG: To remove
     this->step_ticker = new StepTicker();
    
+    // LPC17xx-specific 
     NVIC_SetPriority(TIMER0_IRQn, 1); 
     NVIC_SetPriority(TIMER2_IRQn, 2); 
 
index 93fadc5..892c317 100644 (file)
@@ -1,3 +1,10 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
 using namespace std;
 #include <vector>
 #include "mbed.h"
@@ -21,7 +28,6 @@ SlowTicker::SlowTicker(){
 }
 
 void SlowTicker::set_frequency( int frequency ){
-    //this->kernel->serial->printf("setting:%d size:%d \r\n", frequency, this->hooks.size() ); 
     LPC_TIM2->MR0 = int(floor((SystemCoreClock/4)/frequency));  // SystemCoreClock/4 = Timer increments in a second
     LPC_TIM2->TCR = 3;  // Reset
     LPC_TIM2->TCR = 1;  // Reset
@@ -34,10 +40,8 @@ void SlowTicker::tick(){
     for (int i=0; i<this->hooks.size(); i++){ 
         Hook* hook = this->hooks.at(i);
         hook->counter += ( hook->frequency / this->max_frequency );
-        //this->kernel->serial->printf("%p cand size:%d, hook->freq:%f this->max:%f hook->counter:%f added:%f \r\n", hook, this->hooks.size(), hook->frequency, this->max_frequency, hook->counter, ( hook->frequency / this->max_frequency ) ); 
         if( hook->counter > 0 ){
             hook->counter-=1;
-            //this->kernel->serial->printf("%p exec size:%d, hook->freq:%f this->max:%f hook->counter:%f added:%f \r\n", hook, this->hooks.size(), hook->frequency, this->max_frequency, hook->counter, ( hook->frequency / this->max_frequency ) ); 
             hook->call();
         } 
     }
index 7beab2a..88a1d78 100644 (file)
@@ -1,3 +1,12 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
+
 #ifndef SLOWTICKER_H
 #define SLOWTICKER_H
 
index 2107cff..66696ac 100644 (file)
@@ -1,3 +1,12 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
+
 using namespace std;
 #include <vector>
 #include "mbed.h"
index 7fc120d..f7ce71a 100644 (file)
@@ -1,3 +1,12 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
+
 #ifndef STEPTICKER_H
 #define STEPTICKER_H
 
index 5e7fd8c..973100d 100644 (file)
@@ -1,3 +1,10 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
 #include "libs/utils.h"
 #include "mbed.h"
 #include <string>
index 49f4e43..5317035 100644 (file)
 #include "libs/utils.h"
 
 #include "libs/USBCDCMSC/USBCDCMSC.h"
-
-SDFileSystem sd(p5, p6, p7, p8, "sd");
-USBCDCMSC cdcmsc(&sd);
+SDFileSystem sd(p5, p6, p7, p8, "sd");  // LPC17xx specific : comment if you are not using a SD card ( for example with a mBed ).
+//LocalFileSystem local("local");       // LPC17xx specific : comment if you are not running a mBed
+USBCDCMSC cdcmsc(&sd);                  // LPC17xx specific : Composite serial + msc USB device
 
 int main() {
 
     Kernel* kernel = new Kernel();
 
-    kernel->serial->printf("Smoothie ( grbl port ) version 0.4d \r\nstart\r\n");
+    kernel->serial->printf("Smoothie ( grbl port ) version 0.6 \r\nstart\r\n");
 
     kernel->add_module( new Laser(p21) );
     kernel->add_module( new Extruder(p26,p27) );
index 87f63f4..eeb0458 100644 (file)
@@ -41,8 +41,7 @@ void SerialConsole::on_serial_char_received(){
 }
         
 // Call event when newline received, for other modules to read the line
-inline void SerialConsole::line_received(){
-}
+inline void SerialConsole::line_received(){}
 
 // Actual event calling must happen in the main loop because if it happens in the interrupt we will loose data
 void SerialConsole::on_main_loop(void * argument){
index a1e7030..cb87b55 100644 (file)
@@ -1,3 +1,11 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
 #include <string>
 using std::string;
 #include "Gcode.h"
@@ -16,17 +24,6 @@ bool Gcode::has_letter( char letter ){
     return false;
 }
 
-// Retrieve the value for a given letter
-//double Gcode::get_value_old( char letter ){
-//    size_t start = this->command.find(letter);
-//    size_t end =   this->command.find_first_not_of("1234567890.-", start+1);
-//    if( end == string::npos ){ end = this->command.length()+1; }
-//    string extracted = this->command.substr( start+1, end-start-1 );
-//    double value = atof(extracted.c_str());
-//    return value; 
-//}
-
-
 // Retrieve the value for a given letter
 // We don't use the high-level methods of std::string because they call malloc and it's very bad to do that inside of interrupts
 double Gcode::get_value( char letter ){
index b07c06a..8e6a6dd 100644 (file)
@@ -1,3 +1,11 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
 #ifndef GCODE_H
 #define GCODE_H
 #include <string>
index f7b436b..ee03642 100644 (file)
@@ -50,7 +50,6 @@ void Block::calculate_trapezoid( double entryfactor, double exitfactor ){
 
     this->initial_rate = ceil(this->nominal_rate * entryfactor);   // (step/min) 
     this->final_rate   = ceil(this->nominal_rate * exitfactor);    // (step/min)
-    //this->player->kernel->serial->printf("%p: r:%d \r\n", this, this->initial_rate); 
     double acceleration_per_minute = this->rate_delta * this->planner->kernel->stepper->acceleration_ticks_per_second * 60.0; 
     int accelerate_steps = ceil( this->estimate_acceleration_distance( this->initial_rate, this->nominal_rate, acceleration_per_minute ) );
     int decelerate_steps = ceil( this->estimate_acceleration_distance( this->nominal_rate, this->final_rate,  -acceleration_per_minute ) );
@@ -71,7 +70,7 @@ void Block::calculate_trapezoid( double entryfactor, double exitfactor ){
    this->accelerate_until = accelerate_steps;
    this->decelerate_after = accelerate_steps+plateau_steps; 
 
-   // DIRTY HACK so that we don't end too early for blocks with 0 as final_rate. Doing the math right would be better. Probably fixed in latest grbl
+   // TODO: FIX THIS: DIRTY HACK so that we don't end too early for blocks with 0 as final_rate. Doing the math right would be better. Probably fixed in latest grbl
    if( this->final_rate < 0.01 ){
         this->decelerate_after += floor( this->nominal_rate / 60 / this->planner->kernel->stepper->acceleration_ticks_per_second ) * 3;
     }
index 6e06464..78ed810 100644 (file)
@@ -196,12 +196,6 @@ void Planner::reverse_pass(){
         blocks[1]->reverse_pass(blocks[2], blocks[0]);
     }
     
-    
-    
-    
-    //for( int index = this->kernel->player->queue.size()-1; index > 0; index-- ){  // Skip buffer tail/first block to prevent over-writing the initial entry speed.
-    //    this->kernel->player->queue.get_ref(index)->reverse_pass((index==this->kernel->player->queue.size()-1?NULL:this->kernel->player->queue.get_ref(index+1)), (index==0? (this->has_deleted_block?&(this->last_deleted_block):NULL) :this->kernel->player->queue.get_ref(index-1))); 
-    //}
 }
 
 // Planner::recalculate() needs to go over the current plan twice. Once in reverse and once forward. This
@@ -221,9 +215,6 @@ void Planner::forward_pass() {
     } 
     blocks[2]->forward_pass(blocks[1],NULL);   
 
-    //for( int index = 0; index <= this->kernel->player->queue.size()-1; index++ ){
-    //    this->kernel->player->queue.get_ref(index)->forward_pass((index==0?NULL:this->kernel->player->queue.get_ref(index-1)),(index==this->kernel->player->queue.size()-1?NULL:this->kernel->player->queue.get_ref(index+1))); 
-    //}
 }
 
 // Recalculates the trapezoid speed profiles for flagged blocks in the plan according to the
@@ -236,8 +227,6 @@ void Planner::recalculate_trapezoids() {
     Block* current;
     Block* next = NULL;
 
-    //this->kernel->serial->printf("tail:%d head:%d size:%d\r\n", this->kernel->player->queue.tail, this->kernel->player->queue.head, this->kernel->player->queue.size());
-
     while(block_index != this->kernel->player->queue.tail){
         current = next;
         next = &this->kernel->player->queue.buffer[block_index];
index 1681837..b562501 100644 (file)
@@ -34,10 +34,6 @@ Block* Player::new_block(){
         for(short index=0; index<block->gcodes.size(); index++){
             block->gcodes.pop_back(); 
         }     
-        //for(short index=0; index<block->commands.size(); index++){
-        //    block->commands.pop_back();
-        //    block->travel_distances.pop_back();
-        //}
     }
     
     // Create a new virgin Block in the queue 
@@ -53,13 +49,6 @@ Block* Player::new_block(){
 
 // Used by blocks to signal when they are ready to be used by the system
 void Player::new_block_added(){
-    //this->kernel->serial->printf("new block: %p\r\n", this->current_block);
-
-    //if( this->current_block == 0x00 || this->queue.size() == 0 ){
-        //this->kernel->serial->printf("f %p %d\r\n", this->current_block, this->queue.size() ); 
-    //}
-
-
     if( this->current_block == NULL ){
         this->pop_and_process_new_block(33);
     }
@@ -88,8 +77,6 @@ void Player::pop_and_process_new_block(int debug){
     
     // In case the module was not taken
     if( this->current_block->times_taken < 1 ){
-        //this->kernel->serial->printf("e %p %d %d %d\r\n", this->current_block, this->queue.size(), this->current_block == 0x00, debug ); 
-        //wait(0.1);
         this->looking_for_new_block = false;
         this->current_block->release();
     }
index 4f29a22..0e0c91c 100644 (file)
@@ -134,8 +134,7 @@ void Robot::append_milestone( double target[], double rate ){
 
     
     double millimeters_of_travel = sqrt( pow( deltas[X_AXIS], 2 ) +  pow( deltas[Y_AXIS], 2 ) +  pow( deltas[Z_AXIS], 2 ) );      
-    //if( millimeters_of_travel < 0.001 ){ return; } 
-    //double duration = millimeters_of_travel / rate;
+    
     double duration = 0;
     if( rate > 0 ){ duration = millimeters_of_travel / rate; }
 
@@ -147,7 +146,6 @@ void Robot::append_milestone( double target[], double rate ){
             }
         }
     }
-    //this->kernel->serial->printf("dur: %f mm: %f rate: %f target_z: %f steps_z: %d deltas_z: %f \r\n", duration, millimeters_of_travel, rate, target[2], steps[2], deltas[2] );
 
     this->kernel->planner->append_block( steps, rate*60, millimeters_of_travel, deltas ); 
 
index 6969710..5d250dd 100644 (file)
@@ -217,4 +217,5 @@ void Stepper::reset_step_pins(){
     this->alpha_step_pin->set(0);
     this->beta_step_pin->set(0); 
     this->gamma_step_pin->set(0);
+
 }
index 1d3a8c4..80277e8 100644 (file)
@@ -1,3 +1,11 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
 #include "mbed.h"
 #include "libs/Module.h"
 #include "libs/Kernel.h"
@@ -209,9 +217,7 @@ void Extruder::acceleration_tick(){
 // Convenience function to set stepping speed
 void Extruder::set_speed( int steps_per_second ){
   
-    if( steps_per_second < 10 ){
-        steps_per_second = 10;
-    }
+    if( steps_per_second < 10 ){ steps_per_second = 10; }
     
     // TODO : Proper limit config value 
     if( steps_per_second > (this->feed_rate*double(this->steps_per_millimeter))/60 ){ 
index 945508d..671783f 100644 (file)
@@ -1,3 +1,12 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
+
 #ifndef EXTURDER_MODULE_H
 #define EXTRUDER_MODULE_H
 
index ee74a08..e9c49f0 100644 (file)
@@ -1,3 +1,12 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+// TODO : THIS FILE IS LAME, MUST BE MADE MUCH BETTER
+
 #include "mbed.h"
 #include "libs/Module.h"
 #include "libs/Kernel.h"
index 902293f..9b4e061 100644 (file)
@@ -1,3 +1,10 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
 #ifndef TEMPERATURECONTROL_H
 #define TEMPERATURECONTROL_H
 
index 78cbafa..22cb018 100644 (file)
@@ -1,3 +1,11 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
 #include "mbed.h"
 #include "libs/Kernel.h"
 #include "SimpleShell.h"
index 615e6c1..370573f 100644 (file)
@@ -1,3 +1,11 @@
+/*  
+      This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
+      Smoothie 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 3 of the License, or (at your option) any later version.
+      Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+*/
+
+
 #ifndef simpleshell_h
 #define simpleshell_h