diff --git a/PCB/Gerber_USBvalve_PCB_2023-03-04.zip b/PCB/Gerber_USBvalve_PCB_2023-03-04.zip new file mode 100644 index 0000000..418d329 Binary files /dev/null and b/PCB/Gerber_USBvalve_PCB_2023-03-04.zip differ diff --git a/firmware/USBvalve-0.6.2-32.uf2 b/firmware/USBvalve-0.6.2-32.uf2 new file mode 100644 index 0000000..4be1c83 Binary files /dev/null and b/firmware/USBvalve-0.6.2-32.uf2 differ diff --git a/firmware/USBvalve-0.6.2-64.uf2 b/firmware/USBvalve-0.6.2-64.uf2 new file mode 100644 index 0000000..d575159 Binary files /dev/null and b/firmware/USBvalve-0.6.2-64.uf2 differ diff --git a/firmware/reset/Blink_nano.ino.elf.uf2 b/firmware/reset/Blink_nano.ino.elf.uf2 new file mode 100644 index 0000000..0538e78 Binary files /dev/null and b/firmware/reset/Blink_nano.ino.elf.uf2 differ diff --git a/firmware/reset/Blink_pico.ino.elf.uf2 b/firmware/reset/Blink_pico.ino.elf.uf2 new file mode 100644 index 0000000..cafea64 Binary files /dev/null and b/firmware/reset/Blink_pico.ino.elf.uf2 differ diff --git a/src/USBvalve.ino b/src/USBvalve.ino new file mode 100644 index 0000000..2ea1547 --- /dev/null +++ b/src/USBvalve.ino @@ -0,0 +1,289 @@ +/* + USBvalve + + written by Cesare Pizzi + This project extensively reuse code doen by Adafruit. Please support them! +*/ + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#include "Adafruit_TinyUSB.h" +#include "SSD1306AsciiWire.h" + +// Define vars for OLED screen +#define I2C_ADDRESS 0x3C // 0X3C+SA0 - 0x3C or 0x3D +#define RST_PIN -1 // Define proper RST_PIN if required. +#define OLED_HEIGHT 64 // 64 or 32 depending on the OLED +#define OLED_LINES (OLED_HEIGHT / 8) +SSD1306AsciiWire oled; + +// Define the dimension of RAM DISK. We have a "real" one (for which +// a real array is created) and a "fake" one, presented to the OS +#define DISK_BLOCK_NUM 0x150 +#define FAKE_DISK_BLOCK_NUM 0x800 +#define DISK_BLOCK_SIZE 0x200 +#include "ramdisk.h" +#include "quark.h" + +Adafruit_USBD_MSC usb_msc; + +// Eject button to demonstrate medium is not ready e.g SDCard is not present +// whenever this button is pressed and hold, it will report to host as not ready +#if defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS) || defined(ARDUINO_NRF52840_CIRCUITPLAY) +#define BTN_EJECT 4 // Left Button +bool activeState = true; + +#elif defined(ARDUINO_FUNHOUSE_ESP32S2) +#define BTN_EJECT BUTTON_DOWN +bool activeState = true; + +#elif defined PIN_BUTTON1 +#define BTN_EJECT PIN_BUTTON1 +bool activeState = false; +#endif + +// +// USBvalve globals +// +#define VERSION "USBvalve - 0.6.2" +boolean readme = false; +boolean autorun = false; +boolean written = false; +boolean written_reported = false; +int x = 2; + +#define BLOCK_AUTORUN 102 // Block where Autorun.inf file is saved +#define BLOCK_README 100 // Block where README.txt file is saved +#define MAX_DUMP_BYTES 16 // Used by the dump of the debug facility: do not increase this too much +#define BYTES_TO_HASH 512 * 10 // Number of bytes of the RAM disk used to check consistency (first 10 blocks) + +// Burned hash to check consistency +u8 valid_hash[WIDTH] = { + 0x44, 0x3B, 0xB1, 0x03, 0x2F, 0x67, 0x47, 0x83, + 0x81, 0xFA, 0x3D, 0x04, 0x4B, 0x9D, 0x24, 0xCD, + 0x82, 0x48, 0x7D, 0x21, 0x6E, 0x16, 0x45, 0x43, + 0x45, 0x05, 0xF6, 0xDF, 0x02, 0x9A, 0x62, 0x1A, + 0x26, 0x81, 0xF2, 0xB5, 0xED, 0xEC, 0x38, 0x07, + 0x2A, 0x1F, 0xAF, 0x5A, 0x95, 0x0D, 0x14, 0xE4 +}; + +u8 computed_hash[WIDTH] = { 0x00 }; + +void setup() { + // Screen Init + Wire.begin(); + Wire.setClock(400000L); +#if OLED_HEIGHT == 64 +#if RST_PIN >= 0 + oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN); +#else + oled.begin(&Adafruit128x64, I2C_ADDRESS); +#endif +#else +#if RST_PIN >= 0 + oled.begin(&Adafruit128x32, I2C_ADDRESS, RST_PIN); +#else + oled.begin(&Adafruit128x32, I2C_ADDRESS); +#endif +#endif + + oled.setFont(Adafruit5x7); + cls(); // Clear display + + // Check consistency of RAM FS + quark(computed_hash, msc_disk[0], BYTES_TO_HASH); + if (memcmp(computed_hash, valid_hash, WIDTH) == 0) { + oled.println("[+] Selftest: OK"); + x++; + } else { + oled.println("[!] Selftest: KO"); + oled.println("[!] Stopping..."); + while (1) { + delay(1000); // Loop forever + } + } + +#if defined(ARDUINO_ARCH_MBED) && defined(ARDUINO_ARCH_RP2040) + // Manual begin() is required on core without built-in support for TinyUSB such as + // - mbed rp2040 + TinyUSB_Device_Init(0); +#endif + + // Set disk vendor id, product id and revision with string up to 8, 16, 4 characters respectively + usb_msc.setID("Watchdog", "USBvalve", "0.1"); + + // Set disk size (using the "fake" size) + usb_msc.setCapacity(FAKE_DISK_BLOCK_NUM, DISK_BLOCK_SIZE); + + // Set the callback functions + usb_msc.setReadWriteCallback(msc_read_callback, msc_write_callback, msc_flush_callback); + + // Set Lun ready (RAM disk is always ready) + usb_msc.setUnitReady(true); + +#ifdef BTN_EJECT + pinMode(BTN_EJECT, activeState ? INPUT_PULLDOWN : INPUT_PULLUP); + usb_msc.setReadyCallback(msc_ready_callback); +#endif + + usb_msc.begin(); +} + +// Main loop, managing display +void loop() { + + if (readme == true) { + if (x == OLED_LINES) cls(); + oled.println("[!] README (R)"); + x++; + readme = false; + } + + if (autorun == true) { + if (x == OLED_LINES) cls(); + oled.println("[+] AUTORUN (R)"); + x++; + autorun = false; + } + + if (written == true && written_reported == false) { + if (x == OLED_LINES) cls(); + oled.println("[!] WRITING"); + x++; + written = false; + written_reported = true; + } +} + +// Callback invoked when received READ10 command. +// Copy disk's data to buffer (up to bufsize) and +// return number of copied bytes (must be multiple of block size). +// This happens only for the "real" size of disk +int32_t msc_read_callback(uint32_t lba, void* buffer, uint32_t bufsize) { + + // Check for README.TXT + if (lba == BLOCK_README) { + readme = true; + } + + // Check for AUTORUN.INF + if (lba == BLOCK_AUTORUN) { + autorun = true; + } + + // We are declaring a bigger size than what is actually allocated, so + // this is protecting our memory integrity + if (lba < DISK_BLOCK_NUM - 1) { + uint8_t const* addr = msc_disk[lba]; + memcpy(buffer, addr, bufsize); + } + + SerialTinyUSB.print("Read LBA: "); + SerialTinyUSB.print(lba); + SerialTinyUSB.print(" Size: "); + SerialTinyUSB.println(bufsize); + if (lba < DISK_BLOCK_NUM - 1) { + hexDump(msc_disk[lba], MAX_DUMP_BYTES); + } + SerialTinyUSB.flush(); + + return bufsize; +} + +// Callback invoked when received WRITE10 command. +// Process data in buffer to disk's storage and +// return number of written bytes (must be multiple of block size). +// This happens only for the "real" size of disk +int32_t msc_write_callback(uint32_t lba, uint8_t* buffer, uint32_t bufsize) { + + // This check for writing of space. The LBA > 10 is set to avoid some + // false positives + if (lba > 10) { + written = true; + } + // We are declaring a bigger size than what is actually allocated, so + // this is protecting our memory integrity + if (lba < DISK_BLOCK_NUM - 1) { + uint8_t* addr = msc_disk[lba]; + memcpy(addr, buffer, bufsize); + } + + SerialTinyUSB.print("Write LBA: "); + SerialTinyUSB.print(lba); + SerialTinyUSB.print(" Size: "); + SerialTinyUSB.println(bufsize); + if (lba < DISK_BLOCK_NUM - 1) { + hexDump(msc_disk[lba], MAX_DUMP_BYTES); + } + SerialTinyUSB.flush(); + + return bufsize; +} + +// Callback invoked when WRITE10 command is completed (status received and accepted by host). +// used to flush any pending cache. +void msc_flush_callback(void) { + // Nothing to do +} + +#ifdef BTN_EJECT +// Invoked when received Test Unit Ready command. +// return true allowing host to read/write this LUN e.g SD card inserted +bool msc_ready_callback(void) { + // button not active --> medium ready + return digitalRead(BTN_EJECT) != activeState; +} +#endif + +// Clear display +void cls(void) { + oled.clear(); + oled.println(VERSION); + oled.println("----------------"); + x = 2; +} + +// HexDump +void hexDump(unsigned char* data, size_t size) { + char asciitab[17]; + size_t i, j; + asciitab[16] = '\0'; + + for (i = 0; i < size; ++i) { + + SerialTinyUSB.print(data[i] >> 4, HEX); + SerialTinyUSB.print(data[i] & 0x0F, HEX); + + if ((data)[i] >= ' ' && (data)[i] <= '~') { + asciitab[i % 16] = (data)[i]; + } else { + asciitab[i % 16] = '.'; + } + if ((i + 1) % 8 == 0 || i + 1 == size) { + SerialTinyUSB.print(" "); + if ((i + 1) % 16 == 0) { + SerialTinyUSB.println(asciitab); + } else if (i + 1 == size) { + asciitab[(i + 1) % 16] = '\0'; + if ((i + 1) % 16 <= 8) { + SerialTinyUSB.print(" "); + } + for (j = (i + 1) % 16; j < 16; ++j) { + SerialTinyUSB.print(" "); + } + SerialTinyUSB.print("| "); + SerialTinyUSB.println(asciitab); + } + } + } + SerialTinyUSB.println(); +} \ No newline at end of file diff --git a/src/quark.c b/src/quark.c new file mode 100644 index 0000000..196234e --- /dev/null +++ b/src/quark.c @@ -0,0 +1,484 @@ +/* + USBvalve +*/ + +/* + Quark reference C implementation + + Copyright (c) 2010-2014 Jean-Philippe Aumasson + + To the extent possible under law, the author(s) have dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + You should have received a copy of the CC0 Public Domain Dedication along with + this software. If not, see . + */ +#include +#include +#include +#include "quark.h" + +#define DIGEST WIDTH + +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint8_t u8; + +typedef struct +{ + int pos; /* number of bytes read into x from current block */ + u32 x[WIDTH * 8]; /* one bit stored in each word */ +} hashState; + + +#if defined(UQUARK) +/* 17 bytes */ +u8 iv[] = { 0xd8, 0xda, 0xca, 0x44, 0x41, 0x4a, 0x09, 0x97, + 0x19, 0xc8, 0x0a, 0xa3, 0xaf, 0x06, 0x56, 0x44, 0xdb }; +#elif defined(DQUARK) +/* 22 bytes */ +u8 iv[] = { 0xcc, 0x6c, 0x4a, 0xb7, 0xd1, 0x1f, 0xa9, 0xbd, + 0xf6, 0xee, 0xde, 0x03, 0xd8, 0x7b, 0x68, 0xf9, + 0x1b, 0xaa, 0x70, 0x6c, 0x20, 0xe9 }; +#elif defined(SQUARK) +/* 32 bytes */ +u8 iv[] = { 0x39, 0x72, 0x51, 0xce, 0xe1, 0xde, 0x8a, 0xa7, + 0x3e, 0xa2, 0x62, 0x50, 0xc6, 0xd7, 0xbe, 0x12, + 0x8c, 0xd3, 0xe7, 0x9d, 0xd7, 0x18, 0xc2, 0x4b, + 0x8a, 0x19, 0xd0, 0x9c, 0x24, 0x92, 0xda, 0x5d }; +#elif defined(CQUARK) +/* 48 bytes */ +u8 iv[] = { 0x3b, 0x45, 0x03, 0xec, 0x76, 0x62, 0xc3, 0xcb, + 0x30, 0xe0, 0x08, 0x37, 0xec, 0x8d, 0x38, 0xbb, + 0xe5, 0xff, 0x5a, 0xcd, 0x69, 0x01, 0xa2, 0x49, + 0x57, 0x50, 0xf9, 0x19, 0x8e, 0x2e, 0x3b, 0x58, + 0x52, 0xdc, 0xaa, 0x16, 0x62, 0xb7, 0xda, 0xd6, + 0x5f, 0xcb, 0x5a, 0x8a, 0x1f, 0x0d, 0x5f, 0xcc }; +#endif + +void showstate(u32 *x) { + + int i; + u8 buf = 0; + + for (i = 0; i < 8 * WIDTH; ++i) { + buf ^= (1 & x[i]) << (7 - (i % 8)); + + if (((i % 8) == 7) && (i)) { + printf("%02x", buf); + buf = 0; + } + } + + printf("\n"); +} + + +int permute_u(u32 *x) { + /* state of 136=2x68 bits */ +#define ROUNDS_U 4 * 136 +#define N_LEN_U 68 +#define L_LEN_U 10 + + u32 *X, *Y, *L; + u32 h; + int i; + + X = (u32 *)malloc((N_LEN_U + ROUNDS_U) * sizeof(u32)); + Y = (u32 *)malloc((N_LEN_U + ROUNDS_U) * sizeof(u32)); + L = (u32 *)malloc((L_LEN_U + ROUNDS_U) * sizeof(u32)); + + /* local copy of the state in the registers*/ + for (i = 0; i < N_LEN_U; ++i) { + X[i] = x[i]; + Y[i] = x[i + N_LEN_U]; + } + + /* initialize the LFSR to 11..11 */ + for (i = 0; i < L_LEN_U; ++i) + L[i] = 0xFFFFFFFF; + + /* iterate rounds */ + for (i = 0; i < ROUNDS_U; ++i) { + + /* indices up to i+59, for 8x parallelizibility*/ + + /* need X[i] as linear term only, for invertibility */ + X[N_LEN_U + i] = X[i] ^ Y[i]; + X[N_LEN_U + i] ^= X[i + 9] ^ X[i + 14] ^ X[i + 21] ^ X[i + 28] ^ X[i + 33] ^ X[i + 37] ^ X[i + 45] ^ X[i + 52] ^ X[i + 55] ^ X[i + 50] ^ (X[i + 59] & X[i + 55]) ^ (X[i + 37] & X[i + 33]) ^ (X[i + 15] & X[i + 9]) ^ (X[i + 55] & X[i + 52] & X[i + 45]) ^ (X[i + 33] & X[i + 28] & X[i + 21]) ^ (X[i + 59] & X[i + 45] & X[i + 28] & X[i + 9]) ^ (X[i + 55] & X[i + 52] & X[i + 37] & X[i + 33]) ^ (X[i + 59] & X[i + 55] & X[i + 21] & X[i + 15]) ^ (X[i + 59] & X[i + 55] & X[i + 52] & X[i + 45] & X[i + 37]) ^ (X[i + 33] & X[i + 28] & X[i + 21] & X[i + 15] & X[i + 9]) ^ (X[i + 52] & X[i + 45] & X[i + 37] & X[i + 33] & X[i + 28] & X[i + 21]); + + /* need Y[i] as linear term only, for invertibility */ + Y[N_LEN_U + i] = Y[i]; + Y[N_LEN_U + i] ^= Y[i + 7] ^ Y[i + 16] ^ Y[i + 20] ^ Y[i + 30] ^ Y[i + 35] ^ Y[i + 37] ^ Y[i + 42] ^ Y[i + 51] ^ Y[i + 54] ^ Y[i + 49] ^ (Y[i + 58] & Y[i + 54]) ^ (Y[i + 37] & Y[i + 35]) ^ (Y[i + 15] & Y[i + 7]) ^ (Y[i + 54] & Y[i + 51] & Y[i + 42]) ^ (Y[i + 35] & Y[i + 30] & Y[i + 20]) ^ (Y[i + 58] & Y[i + 42] & Y[i + 30] & Y[i + 7]) ^ (Y[i + 54] & Y[i + 51] & Y[i + 37] & Y[i + 35]) ^ (Y[i + 58] & Y[i + 54] & Y[i + 20] & Y[i + 15]) ^ (Y[i + 58] & Y[i + 54] & Y[i + 51] & Y[i + 42] & Y[i + 37]) ^ (Y[i + 35] & Y[i + 30] & Y[i + 20] & Y[i + 15] & Y[i + 7]) ^ (Y[i + 51] & Y[i + 42] & Y[i + 37] & Y[i + 35] & Y[i + 30] & Y[i + 20]); + + /* need L[i] as linear term only, for invertibility */ + L[L_LEN_U + i] = L[i]; + L[L_LEN_U + i] ^= L[i + 3]; + + /* compute output of the h function */ + h = X[i + 25] ^ Y[i + 59] ^ (Y[i + 3] & X[i + 55]) ^ (X[i + 46] & X[i + 55]) ^ (X[i + 55] & Y[i + 59]) ^ (Y[i + 3] & X[i + 25] & X[i + 46]) ^ (Y[i + 3] & X[i + 46] & X[i + 55]) ^ (Y[i + 3] & X[i + 46] & Y[i + 59]) ^ (X[i + 25] & X[i + 46] & Y[i + 59] & L[i]) ^ (X[i + 25] & L[i]); + h ^= X[i + 1] ^ Y[i + 2] ^ X[i + 4] ^ Y[i + 10] ^ X[i + 31] ^ Y[i + 43] ^ X[i + 56] ^ L[i]; + + /* feedback of h into the registers */ + X[N_LEN_U + i] ^= h; + Y[N_LEN_U + i] ^= h; + } + + /* copy final state into hashState */ + for (i = 0; i < N_LEN_U; ++i) { + x[i] = X[ROUNDS_U + i]; + x[i + N_LEN_U] = Y[ROUNDS_U + i]; + } + + free(X); + free(Y); + free(L); + + return 0; +} + + +int permute_d(u32 *x) { + /* state of 176=2x88 bits */ +#define ROUNDS_D 4 * 176 +#define N_LEN_D 88 +#define L_LEN_D 10 + + u32 *X, *Y, *L; + u32 h; + int i; + + X = (u32 *)malloc((N_LEN_D + ROUNDS_D) * sizeof(u32)); + Y = (u32 *)malloc((N_LEN_D + ROUNDS_D) * sizeof(u32)); + L = (u32 *)malloc((L_LEN_D + ROUNDS_D) * sizeof(u32)); + + /* local copy of the state in the registers*/ + for (i = 0; i < N_LEN_D; ++i) { + X[i] = x[i]; + Y[i] = x[i + N_LEN_D]; + } + + /* initialize the LFSR to 11..11 */ + for (i = 0; i < L_LEN_D; ++i) + L[i] = 0xFFFFFFFF; + + /* iterate rounds */ + for (i = 0; i < ROUNDS_D; ++i) { + + /* need X[i] as linear term only, for invertibility */ + X[N_LEN_D + i] = X[i] ^ Y[i]; + X[N_LEN_D + i] ^= X[i + 11] ^ X[i + 18] ^ X[i + 27] ^ X[i + 36] ^ X[i + 42] ^ X[i + 47] ^ X[i + 58] ^ X[i + 67] ^ X[i + 71] ^ X[i + 64] ^ (X[i + 79] & X[i + 71]) ^ (X[i + 47] & X[i + 42]) ^ (X[i + 19] & X[i + 11]) ^ (X[i + 71] & X[i + 67] & X[i + 58]) ^ (X[i + 42] & X[i + 36] & X[i + 27]) ^ (X[i + 79] & X[i + 58] & X[i + 36] & X[i + 11]) ^ (X[i + 71] & X[i + 67] & X[i + 47] & X[i + 42]) ^ (X[i + 79] & X[i + 71] & X[i + 27] & X[i + 19]) ^ (X[i + 79] & X[i + 71] & X[i + 67] & X[i + 58] & X[i + 47]) ^ (X[i + 42] & X[i + 36] & X[i + 27] & X[i + 19] & X[i + 11]) ^ (X[i + 67] & X[i + 58] & X[i + 47] & X[i + 42] & X[i + 36] & X[i + 27]); + + + /* need Y[i] as linear term only, for invertibility */ + Y[N_LEN_D + i] = Y[i]; + Y[N_LEN_D + i] ^= Y[i + 9] ^ Y[i + 20] ^ Y[i + 25] ^ Y[i + 38] ^ Y[i + 44] ^ Y[i + 47] ^ Y[i + 54] ^ Y[i + 67] ^ Y[i + 69] ^ Y[i + 63] ^ (Y[i + 78] & Y[i + 69]) ^ (Y[i + 47] & Y[i + 44]) ^ (Y[i + 19] & Y[i + 9]) ^ (Y[i + 69] & Y[i + 67] & Y[i + 54]) ^ (Y[i + 44] & Y[i + 38] & Y[i + 25]) ^ (Y[i + 78] & Y[i + 54] & Y[i + 38] & Y[i + 9]) ^ (Y[i + 69] & Y[i + 67] & Y[i + 47] & Y[i + 44]) ^ (Y[i + 78] & Y[i + 69] & Y[i + 25] & Y[i + 19]) ^ (Y[i + 78] & Y[i + 69] & Y[i + 67] & Y[i + 54] & Y[i + 47]) ^ (Y[i + 44] & Y[i + 38] & Y[i + 25] & Y[i + 19] & Y[i + 9]) ^ (Y[i + 67] & Y[i + 54] & Y[i + 47] & Y[i + 44] & Y[i + 38] & Y[i + 25]); + + /* need L[i] as linear term only, for invertibility */ + L[L_LEN_D + i] = L[i]; + L[L_LEN_D + i] ^= L[i + 3]; // linear feedback here + + /* compute output of the h function */ + h = X[i + 35] ^ Y[i + 79] ^ (Y[i + 4] & X[i + 68]) ^ (X[i + 57] & X[i + 68]) ^ (X[i + 68] & Y[i + 79]) ^ (Y[i + 4] & X[i + 35] & X[i + 57]) ^ (Y[i + 4] & X[i + 57] & X[i + 68]) ^ (Y[i + 4] & X[i + 57] & Y[i + 79]) ^ (X[i + 35] & X[i + 57] & Y[i + 79] & L[i]) ^ (X[i + 35] & L[i]); + h ^= X[i + 1] ^ Y[i + 2] ^ X[i + 5] ^ Y[i + 12] ^ X[i + 40] ^ Y[i + 55] ^ X[i + 72] ^ L[i]; + h ^= Y[i + 24] ^ X[i + 48] ^ Y[i + 61]; + + /* feedback of h into the registers */ + X[N_LEN_D + i] ^= h; + Y[N_LEN_D + i] ^= h; + } + + /* copy final state into hashState */ + for (i = 0; i < N_LEN_D; ++i) { + x[i] = X[ROUNDS_D + i]; + x[i + N_LEN_D] = Y[ROUNDS_D + i]; + } + + free(X); + free(Y); + free(L); + + return 0; +} + + +int permute_s(u32 *x) { + /* state of 256=2x128 bits */ +#define ROUNDS_S 4 * 256 +#define N_LEN_S 128 +#define L_LEN_S 10 + + u32 *X, *Y, *L; + u32 h; + int i; + + X = (u32 *)malloc((N_LEN_S + ROUNDS_S) * sizeof(u32)); + Y = (u32 *)malloc((N_LEN_S + ROUNDS_S) * sizeof(u32)); + L = (u32 *)malloc((L_LEN_S + ROUNDS_S) * sizeof(u32)); + + /* local copy of the state in the registers*/ + for (i = 0; i < N_LEN_S; ++i) { + X[i] = x[i]; + Y[i] = x[i + N_LEN_S]; + } + + /* initialize the LFSR to 11..11 */ + for (i = 0; i < L_LEN_S; ++i) + L[i] = 0xFFFFFFFF; + + /* iterate rounds */ + for (i = 0; i < ROUNDS_S; ++i) { + + /* need X[i] as linear term only, for invertibility */ + X[N_LEN_S + i] = X[i] ^ Y[i]; + X[N_LEN_S + i] ^= X[i + 16] ^ X[i + 26] ^ X[i + 39] ^ X[i + 52] ^ X[i + 61] ^ X[i + 69] ^ X[i + 84] ^ X[i + 97] ^ X[i + 103] ^ X[i + 94] ^ (X[i + 111] & X[i + 103]) ^ (X[i + 69] & X[i + 61]) ^ (X[i + 28] & X[i + 16]) ^ (X[i + 103] & X[i + 97] & X[i + 84]) ^ (X[i + 61] & X[i + 52] & X[i + 39]) ^ (X[i + 111] & X[i + 84] & X[i + 52] & X[i + 16]) ^ (X[i + 103] & X[i + 97] & X[i + 69] & X[i + 61]) ^ (X[i + 111] & X[i + 103] & X[i + 39] & X[i + 28]) ^ (X[i + 111] & X[i + 103] & X[i + 97] & X[i + 84] & X[i + 69]) ^ (X[i + 61] & X[i + 52] & X[i + 39] & X[i + 28] & X[i + 16]) ^ (X[i + 97] & X[i + 84] & X[i + 69] & X[i + 61] & X[i + 52] & X[i + 39]); + + /* need Y[i] as linear term only, for invertibility */ + Y[N_LEN_S + i] = Y[i]; + Y[N_LEN_S + i] ^= Y[i + 13] ^ Y[i + 30] ^ Y[i + 37] ^ Y[i + 56] ^ Y[i + 65] ^ Y[i + 69] ^ Y[i + 79] ^ Y[i + 96] ^ Y[i + 101] ^ Y[i + 92] ^ (Y[i + 109] & Y[i + 101]) ^ (Y[i + 69] & Y[i + 65]) ^ (Y[i + 28] & Y[i + 13]) ^ (Y[i + 101] & Y[i + 96] & Y[i + 79]) ^ (Y[i + 65] & Y[i + 56] & Y[i + 37]) ^ (Y[i + 109] & Y[i + 79] & Y[i + 56] & Y[i + 13]) ^ (Y[i + 101] & Y[i + 96] & Y[i + 69] & Y[i + 65]) ^ (Y[i + 109] & Y[i + 101] & Y[i + 37] & Y[i + 28]) ^ (Y[i + 109] & Y[i + 101] & Y[i + 96] & Y[i + 79] & Y[i + 69]) ^ (Y[i + 65] & Y[i + 56] & Y[i + 37] & Y[i + 28] & Y[i + 13]) ^ (Y[i + 96] & Y[i + 79] & Y[i + 69] & Y[i + 65] & Y[i + 56] & Y[i + 37]); + + /* need L[i] as linear term only, for invertibility */ + L[L_LEN_S + i] = L[i]; + L[L_LEN_S + i] ^= L[i + 3]; // linear feedback here + + /* compute output of the h function */ + h = X[i + 47] ^ Y[i + 111] ^ (Y[i + 8] & X[i + 100]) ^ (X[i + 72] & X[i + 100]) ^ (X[i + 100] & Y[i + 111]) ^ (Y[i + 8] & X[i + 47] & X[i + 72]) ^ (Y[i + 8] & X[i + 72] & X[i + 100]) ^ (Y[i + 8] & X[i + 72] & Y[i + 111]) ^ (X[i + 47] & X[i + 72] & Y[i + 111] & L[i]) ^ (X[i + 47] & L[i]); + h ^= X[i + 1] ^ Y[i + 3] ^ X[i + 7] ^ Y[i + 18] ^ X[i + 58] ^ Y[i + 80] ^ X[i + 105] ^ L[i]; + h ^= Y[i + 34] ^ Y[i + 71] ^ X[i + 90] ^ Y[i + 91]; + + /* feedback of h into the registers */ + X[N_LEN_S + i] ^= h; + Y[N_LEN_S + i] ^= h; + } + + /* copy final state into hashState */ + for (i = 0; i < N_LEN_S; ++i) { + x[i] = X[ROUNDS_S + i]; + x[i + N_LEN_S] = Y[ROUNDS_S + i]; + } + + free(X); + free(Y); + free(L); + + return 0; +} + + +int permute_c(u32 *x) { + /* state of 384=2x192 bits */ +#define ROUNDS_C 2 * 384 +#define N_LEN_C 192 +#define L_LEN_C 16 + + u32 *X, *Y, *L; + u32 h; + int i; + + X = (u32 *)malloc((N_LEN_C + ROUNDS_C) * sizeof(u32)); + Y = (u32 *)malloc((N_LEN_C + ROUNDS_C) * sizeof(u32)); + L = (u32 *)malloc((L_LEN_C + ROUNDS_C) * sizeof(u32)); + + /* local copy of the state in the registers*/ + for (i = 0; i < N_LEN_C; ++i) { + X[i] = x[i]; + Y[i] = x[i + N_LEN_C]; + } + + /* initialize the LFSR to 11..11 */ + for (i = 0; i < L_LEN_C; ++i) + L[i] = 0xFFFFFFFF; + + /* iterate rounds */ + for (i = 0; i < ROUNDS_C; ++i) { + + X[N_LEN_C + i] = X[i] ^ Y[i]; + X[N_LEN_C + i] ^= X[i + 13] ^ X[i + 34] ^ X[i + 65] ^ X[i + 77] ^ X[i + 94] ^ X[i + 109] ^ X[i + 127] ^ X[i + 145] ^ X[i + 157] ^ X[i + 140] ^ (X[i + 159] & X[i + 157]) ^ (X[i + 109] & X[i + 94]) ^ (X[i + 47] & X[i + 13]) ^ (X[i + 157] & X[i + 145] & X[i + 127]) ^ (X[i + 94] & X[i + 77] & X[i + 65]) ^ (X[i + 159] & X[i + 127] & X[i + 77] & X[i + 13]) ^ (X[i + 157] & X[i + 145] & X[i + 109] & X[i + 94]) ^ (X[i + 159] & X[i + 157] & X[i + 65] & X[i + 47]) ^ (X[i + 159] & X[i + 157] & X[i + 145] & X[i + 127] & X[i + 109]) ^ (X[i + 94] & X[i + 77] & X[i + 65] & X[i + 47] & X[i + 13]) ^ (X[i + 145] & X[i + 127] & X[i + 109] & X[i + 94] & X[i + 77] & X[i + 65]); + + Y[N_LEN_C + i] = Y[i]; + Y[N_LEN_C + i] ^= Y[i + 21] ^ Y[i + 57] ^ Y[i + 60] ^ Y[i + 94] ^ Y[i + 112] ^ Y[i + 125] ^ Y[i + 133] ^ Y[i + 152] ^ Y[i + 157] ^ Y[i + 146] ^ (Y[i + 159] & Y[i + 157]) ^ (Y[i + 125] & Y[i + 112]) ^ (Y[i + 36] & Y[i + 21]) ^ (Y[i + 157] & Y[i + 152] & Y[i + 133]) ^ (Y[i + 112] & Y[i + 94] & Y[i + 60]) ^ (Y[i + 159] & Y[i + 133] & Y[i + 94] & Y[i + 21]) ^ (Y[i + 157] & Y[i + 152] & Y[i + 125] & Y[i + 112]) ^ (Y[i + 159] & Y[i + 157] & Y[i + 60] & Y[i + 36]) ^ (Y[i + 159] & Y[i + 157] & Y[i + 152] & Y[i + 133] & Y[i + 125]) ^ (Y[i + 112] & Y[i + 94] & Y[i + 60] & Y[i + 36] & Y[i + 21]) ^ (Y[i + 152] & Y[i + 133] & Y[i + 125] & Y[i + 112] & Y[i + 94] & Y[i + 60]); + + L[L_LEN_C + i] = L[i] ^ L[i + 2] ^ L[i + 3] ^ L[i + 5]; + + + h = X[i + 25] ^ Y[i + 59] ^ (Y[i + 3] & X[i + 55]) ^ (X[i + 46] & X[i + 55]) ^ (X[i + 55] & Y[i + 59]) ^ (Y[i + 3] & X[i + 25] & X[i + 46]) ^ (Y[i + 3] & X[i + 46] & X[i + 55]) ^ (Y[i + 3] & X[i + 46] & Y[i + 59]) ^ (X[i + 25] & X[i + 46] & Y[i + 59] & L[i]) ^ (X[i + 25] & L[i]); + h ^= L[i]; + h ^= X[i + 4] ^ X[i + 28] ^ X[i + 40] ^ X[i + 85] ^ X[i + 112] ^ X[i + 141] ^ X[i + 146] ^ X[i + 152]; + h ^= Y[i + 2] ^ Y[i + 33] ^ Y[i + 60] ^ Y[i + 62] ^ Y[i + 87] ^ Y[i + 99] ^ Y[i + 138] ^ Y[i + 148]; + + X[N_LEN_C + i] ^= h; + Y[N_LEN_C + i] ^= h; + } + + /* copy final state into hashState */ + for (i = 0; i < N_LEN_C; ++i) { + x[i] = X[ROUNDS_C + i]; + x[i + N_LEN_C] = Y[ROUNDS_C + i]; + } + + free(X); + free(Y); + free(L); + + return 0; +} + + + + +/* permutation of the state */ +static void permute(u32 *x) { + +#ifdef DEBUG + printf("enter permute\n"); + showstate(x); +#endif + +#if defined(UQUARK) + permute_u(x); +#elif defined(DQUARK) + permute_d(x); +#elif defined(SQUARK) + permute_s(x); +#elif defined(CQUARK) + permute_c(x); +#endif + +#ifdef DEBUG + printf("permute done\n"); + showstate(x); +#endif +} + + +/* initialization of the IV */ +int init_iv(hashState *state) { + int i; + +#ifdef DEBUG + printf("enter init\n"); +#endif + + /* initialize state */ + for (i = 0; i < 8 * WIDTH; ++i) + state->x[i] = (iv[i / 8] >> (7 - (i % 8))) & 1; + + state->pos = 0; + +#ifdef DEBUG + printf("init done\n"); + showstate(state->x); +#endif + + return 0; +} + + +int update(hashState *state, const u8 *data, int databytelen) { + /* caller promises us that previous data had integral number of bytes */ + /* so state->pos is a multiple of 8 */ + + int i; + +#ifdef DEBUG + printf("enter update\n"); +#endif + + while (databytelen > 0) { + + /* get next byte */ + u8 u = *data; + +#ifdef DEBUG + printf("get byte %02x at pos %d\n", u, state->pos); +#endif + + /* xor state with each bit */ + for (i = 8 * state->pos; i < 8 * state->pos + 8; ++i) { + state->x[(8 * (WIDTH - RATE)) + i] ^= (u >> (i % 8)) & 1; + } + + + data += 1; + databytelen -= 1; + state->pos += 1; + + if (state->pos == RATE) { + permute(state->x); + state->pos = 0; + } + } + +#ifdef DEBUG + printf("update done\n"); +#endif + + return 0; +} + + +/* finalize (padding) and return digest */ +int final(hashState *state, u8 *out) { + int i; + int outbytes = 0; + u8 u; + +#ifdef DEBUG + printf("enter final\n"); +#endif + + /* append '1' bit */ + state->x[8 * (WIDTH - RATE) + state->pos * 8] ^= 1; + + /* permute to obtain first final state*/ + permute(state->x); + + /* zeroize output buffer */ + for (i = 0; i < DIGEST; ++i) + out[i] = 0; + + /* while output requested, extract RATE bytes and permute */ + while (outbytes < DIGEST) { + + /* extract one byte */ + for (i = 0; i < 8; ++i) { + u = state->x[8 * (WIDTH - RATE) + i + 8 * (outbytes % RATE)] & 1; + out[outbytes] ^= (u << (7 - i)); + } + +#ifdef DEBUG + printf("extracted byte %02x (%d)\n", out[outbytes], outbytes); +#endif + + outbytes += 1; + + if (outbytes == DIGEST) + break; + + /* if RATE bytes extracted, permute again */ + if (!(outbytes % RATE)) { + permute(state->x); + } + } + +#ifdef DEBUG + printf("final done\n"); +#endif + + + return 0; +} + + +int quark(u8 *out, u8 *in, u64 inlen) { + /* inlen in bytes */ + + hashState state; + + init_iv(&state); + update(&state, in, inlen); + final(&state, out); + + return 0; +} \ No newline at end of file diff --git a/src/quark.h b/src/quark.h new file mode 100644 index 0000000..1f464db --- /dev/null +++ b/src/quark.h @@ -0,0 +1,37 @@ +/* + USBvalve +*/ + +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint8_t u8; + +#define CQUARK + +#if defined(UQUARK) +#define CAPACITY 16 +#define RATE 1 +#define WIDTH 17 +#elif defined(DQUARK) +#define CAPACITY 20 +#define RATE 2 +#define WIDTH 22 +#elif defined(SQUARK) +#define CAPACITY 28 +#define RATE 4 +#define WIDTH 32 +#elif defined(CQUARK) +#define CAPACITY 40 +#define RATE 8 +#define WIDTH 48 +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +int quark(u8 *out, u8 *in, u64 inlen); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/src/ramdisk.h b/src/ramdisk.h new file mode 100644 index 0000000..b27bd7f --- /dev/null +++ b/src/ramdisk.h @@ -0,0 +1,739 @@ +/* + USBvalve +*/ + +/* + The MIT License (MIT) + + Copyright (c) 2019 Ha Thach for Adafruit Industries + + 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 RAMDISK_H_ +#define RAMDISK_H_ + +// +// The filesystem contains 3 files at specific blocks (see also USBvalve.ino) +// AUTORUN.INF +// README.TXT +// System Volume Information +// +#define README_CONTENTS \ + "...nuke the entire site from orbit. It's the only way to be sure." + +#define AUTORUN_CONTENTS \ + "[autorun]\r\nopen=calc.exe\r\nicon=icon.ico\r\n" + +uint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] = { +{ +//------------- Block 0: -------------// +0xeb, 0x3c, 0x90, 0x6d, 0x6b, 0x66, 0x73, 0x2e, 0x66, 0x61, 0x74, 0x00, 0x02, 0x01, 0x01, 0x00, +0x01, 0x10, 0x00, 0x00, 0x08, 0xf8, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x66, 0x36, 0xba, 0xf7, 0x55, 0x53, 0x42, 0x56, 0x41, +0x4c, 0x56, 0x45, 0x20, 0x20, 0x20, 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x0e, 0x1f, +0xbe, 0x5b, 0x7c, 0xac, 0x22, 0xc0, 0x74, 0x0b, 0x56, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10, +0x5e, 0xeb, 0xf0, 0x32, 0xe4, 0xcd, 0x16, 0xcd, 0x19, 0xeb, 0xfe, 0x54, 0x68, 0x69, 0x73, 0x20, +0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x2e, 0x20, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, +0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x66, 0x6c, 0x6f, 0x70, 0x70, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x70, 0x72, +0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, +0x72, 0x79, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x0d, 0x0a, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa +}, +{ +//------------- Block 1: -------------// +0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, +0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 2: -------------// +0x00 +}, +{ +//------------- Block 3: -------------// +0x00 +}, +{ +//------------- Block 4: -------------// +0x00 +}, +{ +//------------- Block 5: -------------// +0x00 +}, +{ +//------------- Block 6: -------------// +0x00 +}, +{ +//------------- Block 7: -------------// +0x55, 0x53, 0x42, 0x56, 0x41, 0x4c, 0x56, 0x45, 0x20, 0x20, 0x20, 0x08, 0x00, 0x00, 0xaf, 0x60, +0x6d, 0x55, 0x6d, 0x55, 0x00, 0x00, 0xaf, 0x60, 0x6d, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x41, 0x55, 0x54, 0x4f, 0x52, 0x55, 0x4e, 0x20, 0x49, 0x4e, 0x46, 0x20, 0x00, 0x9d, 0xef, 0x58, +0x6d, 0x55, 0x6b, 0x55, 0x00, 0x00, 0xef, 0x58, 0x6d, 0x55, 0x60, 0x00, 0x2a, 0x00, 0x00, 0x00, +0x52, 0x45, 0x41, 0x44, 0x4d, 0x45, 0x20, 0x20, 0x54, 0x58, 0x54, 0x20, 0x00, 0x33, 0xf3, 0x58, +0x6d, 0x55, 0x6d, 0x55, 0x00, 0x00, 0xf3, 0x58, 0x6d, 0x55, 0x5e, 0x00, 0x42, 0x00, 0x00, 0x00, +0x42, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x0f, 0x00, 0x72, 0x72, 0x00, +0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, +0x01, 0x53, 0x00, 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x0f, 0x00, 0x72, 0x6d, 0x00, +0x20, 0x00, 0x56, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x65, 0x00, +0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x7e, 0x31, 0x20, 0x20, 0x20, 0x16, 0x00, 0xc0, 0xb9, 0xbe, +0x6b, 0x55, 0x6b, 0x55, 0x00, 0x00, 0xba, 0xbe, 0x6b, 0x55, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 8: -------------// +0x2e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x00, 0xc0, 0xb9, 0xbe, +0x6b, 0x55, 0x6b, 0x55, 0x00, 0x00, 0xba, 0xbe, 0x6b, 0x55, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2e, 0x2e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x00, 0xc0, 0xb9, 0xbe, +0x6b, 0x55, 0x6b, 0x55, 0x00, 0x00, 0xba, 0xbe, 0x6b, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x42, 0x74, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xce, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, +0x01, 0x57, 0x00, 0x50, 0x00, 0x53, 0x00, 0x65, 0x00, 0x74, 0x00, 0x0f, 0x00, 0xce, 0x74, 0x00, +0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x61, 0x00, +0x57, 0x50, 0x53, 0x45, 0x54, 0x54, 0x7e, 0x31, 0x44, 0x41, 0x54, 0x20, 0x00, 0x3d, 0xba, 0xbe, +0x6b, 0x55, 0x6b, 0x55, 0x00, 0x00, 0xbb, 0xbe, 0x6b, 0x55, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, +0x42, 0x47, 0x00, 0x75, 0x00, 0x69, 0x00, 0x64, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, +0x01, 0x49, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x0f, 0x00, 0xff, 0x65, 0x00, +0x72, 0x00, 0x56, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x65, 0x00, +0x49, 0x4e, 0x44, 0x45, 0x58, 0x45, 0x7e, 0x31, 0x20, 0x20, 0x20, 0x20, 0x00, 0x48, 0xba, 0xbe, +0x6b, 0x55, 0x6b, 0x55, 0x00, 0x00, 0xbb, 0xbe, 0x6b, 0x55, 0x05, 0x00, 0x4c, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 9: -------------// +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 10: -------------// +0x00 +}, +{ +//------------- Block 11: -------------// +0x7b, 0x00, 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, 0x34, 0x00, 0x37, 0x00, 0x36, 0x00, 0x36, 0x00, +0x41, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x32, 0x00, 0x41, 0x00, 0x30, 0x00, 0x2d, 0x00, 0x34, 0x00, +0x34, 0x00, 0x44, 0x00, 0x45, 0x00, 0x2d, 0x00, 0x41, 0x00, 0x35, 0x00, 0x43, 0x00, 0x39, 0x00, +0x2d, 0x00, 0x43, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x35, 0x00, 0x42, 0x00, 0x36, 0x00, +0x42, 0x00, 0x32, 0x00, 0x44, 0x00, 0x39, 0x00, 0x35, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 12: -------------// +0x0c, 0x00, 0x00, 0x00, 0xd8, 0xad, 0x48, 0x08, 0xdb, 0x13, 0xcd, 0xad, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 13: -------------// +0x00 +}, +{ +//------------- Block 14: -------------// +0x00 +}, +{ +//------------- Block 15: -------------// +0x00 +}, +{ +//------------- Block 16: -------------// +0x00 +}, +{ +//------------- Block 17: -------------// +0x00 +}, +{ +//------------- Block 18: -------------// +0x00 +}, +{ +//------------- Block 19: -------------// +0x00 +}, +{ +//------------- Block 20: -------------// +0x00 +}, +{ +//------------- Block 21: -------------// +0x00 +}, +{ +//------------- Block 22: -------------// +0x00 +}, +{ +//------------- Block 23: -------------// +0x00 +}, +{ +//------------- Block 24: -------------// +0x00 +}, +{ +//------------- Block 25: -------------// +0x00 +}, +{ +//------------- Block 26: -------------// +0x00 +}, +{ +//------------- Block 27: -------------// +0x00 +}, +{ +//------------- Block 28: -------------// +0x00 +}, +{ +//------------- Block 29: -------------// +0x00 +}, +{ +//------------- Block 30: -------------// +0x00 +}, +{ +//------------- Block 31: -------------// +0x00 +}, +{ +//------------- Block 32: -------------// +0x00 +}, +{ +//------------- Block 33: -------------// +0x00 +}, +{ +//------------- Block 34: -------------// +0x00 +}, +{ +//------------- Block 35: -------------// +0x00 +}, +{ +//------------- Block 36: -------------// +0x00 +}, +{ +//------------- Block 37: -------------// +0x00 +}, +{ +//------------- Block 38: -------------// +0x00 +}, +{ +//------------- Block 39: -------------// +0x00 +}, +{ +//------------- Block 40: -------------// +0x00 +}, +{ +//------------- Block 41: -------------// +0x00 +}, +{ +//------------- Block 42: -------------// +0x00 +}, +{ +//------------- Block 43: -------------// +0x00 +}, +{ +//------------- Block 44: -------------// +0x00 +}, +{ +//------------- Block 45: -------------// +0x00 +}, +{ +//------------- Block 46: -------------// +0x00 +}, +{ +//------------- Block 47: -------------// +0x00 +}, +{ +//------------- Block 48: -------------// +0x00 +}, +{ +//------------- Block 49: -------------// +0x00 +}, +{ +//------------- Block 50: -------------// +0x00 +}, +{ +//------------- Block 51: -------------// +0x00 +}, +{ +//------------- Block 52: -------------// +0x00 +}, +{ +//------------- Block 53: -------------// +0x00 +}, +{ +//------------- Block 54: -------------// +0x00 +}, +{ +//------------- Block 55: -------------// +0x00 +}, +{ +//------------- Block 56: -------------// +0x00 +}, +{ +//------------- Block 57: -------------// +0x00 +}, +{ +//------------- Block 58: -------------// +0x00 +}, +{ +//------------- Block 59: -------------// +0x00 +}, +{ +//------------- Block 60: -------------// +0x00 +}, +{ +//------------- Block 61: -------------// +0x00 +}, +{ +//------------- Block 62: -------------// +0x00 +}, +{ +//------------- Block 63: -------------// +0x00 +}, +{ +//------------- Block 64: -------------// +0x00 +}, +{ +//------------- Block 65: -------------// +0x00 +}, +{ +//------------- Block 66: -------------// +0x00 +}, +{ +//------------- Block 67: -------------// +0x00 +}, +{ +//------------- Block 68: -------------// +0x00 +}, +{ +//------------- Block 69: -------------// +0x00 +}, +{ +//------------- Block 70: -------------// +0x00 +}, +{ +//------------- Block 71: -------------// +0x00 +}, +{ +//------------- Block 72: -------------// +0x00 +}, +{ +//------------- Block 73: -------------// +0x00 +}, +{ +//------------- Block 74: -------------// +0x00 +}, +{ +//------------- Block 75: -------------// +0x00 +}, +{ +//------------- Block 76: -------------// +0x00 +}, +{ +//------------- Block 77: -------------// +0x00 +}, +{ +//------------- Block 78: -------------// +0x00 +}, +{ +//------------- Block 79: -------------// +0x00 +}, +{ +//------------- Block 80: -------------// +0x00 +}, +{ +//------------- Block 81: -------------// +0x00 +}, +{ +//------------- Block 82: -------------// +0x00 +}, +{ +//------------- Block 83: -------------// +0x00 +}, +{ +//------------- Block 84: -------------// +0x00 +}, +{ +//------------- Block 85: -------------// +0x00 +}, +{ +//------------- Block 86: -------------// +0x00 +}, +{ +//------------- Block 87: -------------// +0x00 +}, +{ +//------------- Block 88: -------------// +0x00 +}, +{ +//------------- Block 89: -------------// +0x00 +}, +{ +//------------- Block 90: -------------// +0x00 +}, +{ +//------------- Block 91: -------------// +0x00 +}, +{ +//------------- Block 92: -------------// +0x00 +}, +{ +//------------- Block 93: -------------// +0x00 +}, +{ +//------------- Block 94: -------------// +0x00 +}, +{ +//------------- Block 95: -------------// +0x00 +}, +{ +//------------- Block 96: -------------// +0x00 +}, +{ +//------------- Block 97: -------------// +0x00 +}, +{ +//------------- Block 98: -------------// +0x00 +}, +{ +//------------- Block 99: -------------// +0x00 +}, +{ +//------------- Block 100: -------------// +0x2e, 0x2e, 0x2e, 0x6e, 0x75, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, +0x72, 0x65, 0x20, 0x73, 0x69, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x62, +0x69, 0x74, 0x2e, 0x20, 0x49, 0x74, 0x27, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x6c, +0x79, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, +0x2e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +{ +//------------- Block 101: -------------// +0x00 +}, +{ +//------------- Block 102: -------------// +0x5b, 0x61, 0x75, 0x74, 0x6f, 0x72, 0x75, 0x6e, 0x5d, 0x0d, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x3d, +0x63, 0x61, 0x6c, 0x63, 0x2e, 0x65, 0x78, 0x65, 0x0d, 0x0a, 0x69, 0x63, 0x6f, 0x6e, 0x3d, 0x69, +0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x0d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}, +}; + +#endif /* RAMDISK_H_ */ + diff --git a/utils/create_ramdisk.py b/utils/create_ramdisk.py new file mode 100644 index 0000000..5e78650 --- /dev/null +++ b/utils/create_ramdisk.py @@ -0,0 +1,55 @@ +# +# Create an empty file +# dd if=/dev/zero of=fat.fs bs=1024 count=1024 +# Format fs file +# sudo mkfs.fat fat.fs -g 1/1 -f 1 -s 1 -r 16 -n "USBVALVE" +# +# Mount the fs +# sudo mount fat.fs /mnt +# +# Now you can create a minimal set of files (AUTORUN.INF and README.TXT). +# Place them (by manually fixing the ROOT_DIR and FATTABLE) out of the caching +# sectors (> 100 ?) +# + +import sys +import re + +def all_zero(buff): + ret = True + for x in buff: + if x != 0: + ret = False + break + return ret + +if len(sys.argv) < 2: + print('Please specify input file') + sys.exit(1) + +f = open(sys.argv[1], "rb") + +print('uint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] = {') + +block = 0 + +while True: + data = f.read(512) + if not data: + break + print('{ ') + print('//------------- Block %d: -------------//' % (block)) + block += 1 + if all_zero(data): + print('0x00') + else: + dump = ' '.join("0x{:02x},".format(c) for c in data) + dump = re.sub("(.{96})", "\\1\n", dump, 0, re.DOTALL) + dump = dump[:-1] # Remove last comma + print(dump) + print('},') + +print('};') + +f.close() +sys.exit(0) \ No newline at end of file diff --git a/utils/fat.fs b/utils/fat.fs new file mode 100644 index 0000000..2f06f3a Binary files /dev/null and b/utils/fat.fs differ