diff --git a/libraries/Nano33_System/examples/Nano33_updateBLandSoftDevice/MBR.h b/libraries/Nano33_System/examples/Nano33_updateBLandSoftDevice/MBR.h new file mode 100644 index 000000000..129383972 --- /dev/null +++ b/libraries/Nano33_System/examples/Nano33_updateBLandSoftDevice/MBR.h @@ -0,0 +1,345 @@ +const unsigned char MBR_bin[] = { + 0x00, 0x04, 0x00, 0x20, 0x81, 0x0a, 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, + 0x61, 0x0a, 0x00, 0x00, 0x1f, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, + 0x33, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x0a, 0x00, 0x00, + 0x3d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, + 0x51, 0x07, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, + 0x6f, 0x07, 0x00, 0x00, 0x79, 0x07, 0x00, 0x00, 0x83, 0x07, 0x00, 0x00, + 0x8d, 0x07, 0x00, 0x00, 0x97, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, + 0xab, 0x07, 0x00, 0x00, 0xb5, 0x07, 0x00, 0x00, 0xbf, 0x07, 0x00, 0x00, + 0xc9, 0x07, 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, + 0xe7, 0x07, 0x00, 0x00, 0xf1, 0x07, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, + 0x05, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x19, 0x08, 0x00, 0x00, + 0x23, 0x08, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x37, 0x08, 0x00, 0x00, + 0x41, 0x08, 0x00, 0x00, 0x4b, 0x08, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, + 0x5f, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, + 0x7d, 0x08, 0x00, 0x00, 0x87, 0x08, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, + 0x9b, 0x08, 0x00, 0x00, 0xa5, 0x08, 0x00, 0x00, 0xaf, 0x08, 0x00, 0x00, + 0xb9, 0x08, 0x00, 0x00, 0xc3, 0x08, 0x00, 0x00, 0xcd, 0x08, 0x00, 0x00, + 0xd7, 0x08, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xeb, 0x08, 0x00, 0x00, + 0xf5, 0x08, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, + 0x13, 0x09, 0x00, 0x00, 0x1d, 0x09, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, + 0x31, 0x09, 0x00, 0x00, 0x3b, 0x09, 0x00, 0x00, 0x1f, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0x8d, 0xe8, 0x0f, 0x00, 0x1f, 0xbd, 0x00, 0xf0, 0xac, 0xbc, + 0x40, 0xf6, 0xfc, 0x71, 0x08, 0x68, 0x4f, 0xf0, 0x10, 0x22, 0x40, 0x1c, + 0x08, 0xd0, 0x08, 0x68, 0x40, 0x1c, 0x09, 0xd0, 0x08, 0x68, 0x40, 0x1c, + 0x04, 0xd0, 0x08, 0x68, 0x00, 0xf0, 0x37, 0xba, 0x90, 0x69, 0xf5, 0xe7, + 0x90, 0x69, 0xf9, 0xe7, 0x70, 0x47, 0x70, 0xb5, 0x0b, 0x46, 0x01, 0x0b, + 0x18, 0x44, 0x00, 0xf6, 0xff, 0x70, 0x04, 0x0b, 0x4f, 0xf0, 0x80, 0x50, + 0x00, 0x22, 0x09, 0x03, 0x03, 0x69, 0x24, 0x03, 0x40, 0x69, 0x43, 0x43, + 0x1d, 0x1b, 0x10, 0x46, 0x00, 0xf0, 0x48, 0xfa, 0x29, 0x46, 0x20, 0x46, + 0xbd, 0xe8, 0x70, 0x40, 0x00, 0xf0, 0x42, 0xba, 0xf0, 0xb5, 0x4f, 0xf6, + 0xff, 0x73, 0x4f, 0xf4, 0xb4, 0x75, 0x1a, 0x46, 0x6e, 0x1e, 0x11, 0xe0, + 0xa9, 0x42, 0x01, 0xd3, 0x34, 0x46, 0x00, 0xe0, 0x0c, 0x46, 0x09, 0x1b, + 0x30, 0xf8, 0x02, 0x7b, 0x64, 0x1e, 0x3b, 0x44, 0x1a, 0x44, 0xf9, 0xd1, + 0x9c, 0xb2, 0x04, 0xeb, 0x13, 0x43, 0x94, 0xb2, 0x04, 0xeb, 0x12, 0x42, + 0x00, 0x29, 0xeb, 0xd1, 0x98, 0xb2, 0x00, 0xeb, 0x13, 0x40, 0x02, 0xeb, + 0x12, 0x41, 0x40, 0xea, 0x01, 0x40, 0xf0, 0xbd, 0xf3, 0x49, 0x92, 0xb0, + 0x04, 0x46, 0xd1, 0xe9, 0x00, 0x01, 0xcd, 0xe9, 0x10, 0x01, 0xff, 0x22, + 0x40, 0x21, 0x68, 0x46, 0x00, 0xf0, 0xf4, 0xfb, 0x94, 0xe8, 0x0f, 0x00, + 0x8d, 0xe8, 0x0f, 0x00, 0x68, 0x46, 0x10, 0xa9, 0x02, 0xe0, 0x04, 0xc8, + 0x41, 0xf8, 0x04, 0x2d, 0x88, 0x42, 0xfa, 0xd1, 0x10, 0x21, 0x68, 0x46, + 0xff, 0xf7, 0xc0, 0xff, 0x10, 0x90, 0xaa, 0x20, 0x8d, 0xf8, 0x44, 0x00, + 0x00, 0xf0, 0x99, 0xf9, 0xff, 0xf7, 0x8a, 0xff, 0x40, 0xf6, 0xfc, 0x74, + 0x20, 0x68, 0x4f, 0xf0, 0x10, 0x25, 0x40, 0x1c, 0x0f, 0xd0, 0x20, 0x68, + 0x10, 0x22, 0x69, 0x46, 0x80, 0x30, 0x00, 0xf0, 0x78, 0xf9, 0x20, 0x68, + 0x40, 0x1c, 0x08, 0xd0, 0x20, 0x68, 0x08, 0x22, 0x10, 0xa9, 0x00, 0xf0, + 0x70, 0xf9, 0x00, 0xf0, 0x61, 0xf9, 0xa8, 0x69, 0xee, 0xe7, 0xa8, 0x69, + 0xf5, 0xe7, 0x4f, 0xf0, 0x80, 0x50, 0x03, 0x69, 0x40, 0x69, 0x40, 0xf6, + 0xfc, 0x71, 0x43, 0x43, 0x08, 0x68, 0x4f, 0xf0, 0x10, 0x22, 0x40, 0x1c, + 0x06, 0xd0, 0x08, 0x68, 0x00, 0xf5, 0x80, 0x50, 0x83, 0x42, 0x03, 0xd2, + 0x09, 0x20, 0x70, 0x47, 0x90, 0x69, 0xf7, 0xe7, 0x08, 0x68, 0x40, 0x1c, + 0x04, 0xd0, 0x08, 0x68, 0x40, 0x1c, 0x03, 0xd0, 0x00, 0x20, 0x70, 0x47, + 0x90, 0x69, 0xf9, 0xe7, 0x04, 0x20, 0x70, 0x47, 0x70, 0xb5, 0x04, 0x46, + 0x00, 0x68, 0xc3, 0x4d, 0x07, 0x28, 0x76, 0xd2, 0xdf, 0xe8, 0x00, 0xf0, + 0x33, 0x04, 0x19, 0x29, 0x63, 0x1e, 0x25, 0x00, 0xd4, 0xe9, 0x02, 0x65, + 0x64, 0x68, 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x62, 0xf9, 0x2a, 0x46, + 0x21, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x31, 0xf9, 0xaa, 0x00, 0x21, 0x46, + 0x30, 0x46, 0x00, 0xf0, 0x57, 0xfb, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x20, + 0x70, 0xbd, 0x00, 0xf0, 0x09, 0xfc, 0x4f, 0xf4, 0x80, 0x50, 0x07, 0xe0, + 0x20, 0x1d, 0x00, 0xf0, 0x40, 0xf9, 0x00, 0x28, 0xf4, 0xd1, 0x00, 0xf0, + 0xff, 0xfb, 0x60, 0x68, 0x28, 0x60, 0x00, 0x20, 0x70, 0xbd, 0x24, 0x1d, + 0x94, 0xe8, 0x07, 0x00, 0x92, 0x00, 0x00, 0xf0, 0x3d, 0xfb, 0x00, 0x28, + 0xf6, 0xd0, 0x0e, 0x20, 0x70, 0xbd, 0xff, 0xf7, 0xa2, 0xff, 0x00, 0x28, + 0xfa, 0xd1, 0xd4, 0xe9, 0x01, 0x03, 0x4f, 0xf0, 0x80, 0x51, 0x00, 0xeb, + 0x83, 0x02, 0x08, 0x69, 0x4d, 0x69, 0x68, 0x43, 0x82, 0x42, 0x0e, 0xd8, + 0x40, 0xf6, 0xf8, 0x70, 0x05, 0x68, 0x4f, 0xf0, 0x10, 0x22, 0x6d, 0x1c, + 0x09, 0xd0, 0x05, 0x68, 0x05, 0xeb, 0x83, 0x05, 0x0b, 0x69, 0x49, 0x69, + 0x4b, 0x43, 0x9d, 0x42, 0x03, 0xd9, 0x09, 0x20, 0x70, 0xbd, 0x55, 0x69, + 0xf4, 0xe7, 0x01, 0x68, 0x49, 0x1c, 0x03, 0xd0, 0x00, 0x68, 0x40, 0x1c, + 0x02, 0xd0, 0x03, 0xe0, 0x50, 0x69, 0xfa, 0xe7, 0x0f, 0x20, 0x70, 0xbd, + 0x20, 0x46, 0xff, 0xf7, 0x35, 0xff, 0xff, 0xf7, 0x72, 0xff, 0x00, 0x28, + 0xf7, 0xd1, 0x20, 0x1d, 0x00, 0xf0, 0xf7, 0xf8, 0x00, 0x28, 0xf2, 0xd1, + 0x60, 0x68, 0x00, 0x28, 0xf0, 0xd1, 0x00, 0xf0, 0xe2, 0xf8, 0xff, 0xf7, + 0xd3, 0xfe, 0x00, 0xf0, 0xbf, 0xf8, 0x07, 0x20, 0x70, 0xbd, 0x10, 0xb5, + 0x0c, 0x46, 0x18, 0x28, 0x02, 0xd0, 0x01, 0x20, 0x08, 0x60, 0x10, 0xbd, + 0x20, 0x68, 0xff, 0xf7, 0x77, 0xff, 0x20, 0x60, 0x10, 0xbd, 0x41, 0x68, + 0x05, 0x46, 0x09, 0xb1, 0x01, 0x27, 0x00, 0xe0, 0x00, 0x27, 0x40, 0xf6, + 0xf8, 0x74, 0x20, 0x68, 0x4f, 0xf0, 0x10, 0x26, 0x40, 0x1c, 0x2b, 0xd0, + 0x20, 0x68, 0xaa, 0x68, 0x92, 0x00, 0x00, 0xf0, 0xd7, 0xfa, 0x38, 0xb3, + 0xa8, 0x68, 0x81, 0x00, 0x20, 0x68, 0x40, 0x1c, 0x27, 0xd0, 0x20, 0x68, + 0xff, 0xf7, 0xbd, 0xfe, 0xd7, 0xb1, 0x20, 0x68, 0x40, 0x1c, 0x22, 0xd0, + 0x26, 0x68, 0x4f, 0xf0, 0x80, 0x50, 0xac, 0x68, 0x6d, 0x68, 0x01, 0x69, + 0x42, 0x69, 0x51, 0x43, 0xa9, 0x42, 0x0d, 0xd9, 0x01, 0x69, 0x40, 0x69, + 0x41, 0x43, 0xa1, 0x42, 0x08, 0xd9, 0x21, 0x46, 0x30, 0x46, 0x00, 0xf0, + 0xb8, 0xf8, 0x22, 0x46, 0x29, 0x46, 0x30, 0x46, 0x00, 0xf0, 0x87, 0xf8, + 0x00, 0xf0, 0x78, 0xf8, 0x70, 0x69, 0xd2, 0xe7, 0x00, 0xf0, 0x93, 0xf8, + 0xff, 0xf7, 0x84, 0xfe, 0xf6, 0xe7, 0x70, 0x69, 0xd6, 0xe7, 0x76, 0x69, + 0xdb, 0xe7, 0x40, 0xf6, 0xfc, 0x74, 0x20, 0x68, 0x4f, 0xf0, 0x10, 0x26, + 0x40, 0x1c, 0x23, 0xd0, 0x20, 0x68, 0x40, 0x1c, 0x0c, 0xd0, 0x20, 0x68, + 0x40, 0x1c, 0x1f, 0xd0, 0x25, 0x68, 0x20, 0x68, 0x05, 0xf1, 0x80, 0x05, + 0x40, 0x1c, 0x1b, 0xd0, 0x27, 0x68, 0x38, 0x79, 0xaa, 0x28, 0x19, 0xd0, + 0x40, 0xf6, 0xf8, 0x70, 0x01, 0x68, 0x49, 0x1c, 0x42, 0xd0, 0x01, 0x68, + 0x49, 0x1c, 0x45, 0xd0, 0x01, 0x68, 0x49, 0x1c, 0x3e, 0xd0, 0x01, 0x68, + 0x09, 0x68, 0x49, 0x1c, 0x3e, 0xd0, 0x01, 0x68, 0x49, 0x1c, 0x39, 0xd0, + 0x00, 0x68, 0x3e, 0xe0, 0xb0, 0x69, 0xda, 0xe7, 0xb5, 0x69, 0xde, 0xe7, + 0xb7, 0x69, 0xe2, 0xe7, 0x10, 0x21, 0x28, 0x46, 0xff, 0xf7, 0x78, 0xfe, + 0x39, 0x68, 0x81, 0x42, 0x22, 0xd1, 0x20, 0x68, 0x40, 0x1c, 0x05, 0xd0, + 0xd4, 0xf8, 0x00, 0x10, 0x01, 0xf1, 0x80, 0x02, 0xc0, 0x31, 0x07, 0xe0, + 0xb1, 0x69, 0xf9, 0xe7, 0x30, 0xb1, 0x08, 0xca, 0x51, 0xf8, 0x04, 0x0d, + 0x98, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x8a, 0x42, + 0xf4, 0xd1, 0x58, 0xb1, 0x28, 0x68, 0x10, 0xb1, 0x04, 0x28, 0x03, 0xd0, + 0xfe, 0xe7, 0x28, 0x46, 0xff, 0xf7, 0x65, 0xff, 0x31, 0x49, 0x68, 0x68, + 0x08, 0x60, 0x0e, 0xe0, 0xff, 0xf7, 0x22, 0xfe, 0x00, 0xf0, 0x0e, 0xf8, + 0x71, 0x69, 0xbb, 0xe7, 0x71, 0x69, 0xbf, 0xe7, 0x70, 0x69, 0x04, 0xe0, + 0x4f, 0xf4, 0x80, 0x50, 0x01, 0x68, 0x49, 0x1c, 0x01, 0xd0, 0x00, 0xf0, + 0xcb, 0xfa, 0xfe, 0xe7, 0xbf, 0xf3, 0x4f, 0x8f, 0x26, 0x48, 0x01, 0x68, + 0x26, 0x4a, 0x01, 0xf4, 0xe0, 0x61, 0x11, 0x43, 0x01, 0x60, 0xbf, 0xf3, + 0x4f, 0x8f, 0x00, 0xbf, 0xfd, 0xe7, 0x2d, 0xe9, 0xf0, 0x41, 0x17, 0x46, + 0x0d, 0x46, 0x06, 0x46, 0x00, 0x24, 0x06, 0xe0, 0x30, 0x46, 0x29, 0x68, + 0x00, 0xf0, 0x54, 0xf8, 0x64, 0x1c, 0x2d, 0x1d, 0x36, 0x1d, 0xbc, 0x42, + 0xf6, 0xd3, 0xbd, 0xe8, 0xf0, 0x81, 0x40, 0xf6, 0xfc, 0x70, 0x01, 0x68, + 0x49, 0x1c, 0x04, 0xd0, 0xd0, 0xf8, 0x00, 0x00, 0x4f, 0xf4, 0x80, 0x51, + 0xfd, 0xe5, 0x4f, 0xf0, 0x10, 0x20, 0x80, 0x69, 0xf8, 0xe7, 0x4f, 0xf0, + 0x80, 0x51, 0x0a, 0x69, 0x49, 0x69, 0x00, 0x68, 0x4a, 0x43, 0x82, 0x42, + 0x01, 0xd8, 0x10, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x70, 0xb5, + 0x0c, 0x46, 0x05, 0x46, 0x4f, 0xf4, 0x80, 0x66, 0x08, 0xe0, 0x28, 0x46, + 0x00, 0xf0, 0x17, 0xf8, 0xb4, 0x42, 0x05, 0xd3, 0xa4, 0xf5, 0x80, 0x64, + 0x05, 0xf5, 0x80, 0x55, 0x00, 0x2c, 0xf4, 0xd1, 0x70, 0xbd, 0x00, 0x00, + 0xf4, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0c, 0xed, 0x00, 0xe0, + 0x04, 0x00, 0xfa, 0x05, 0x14, 0x48, 0x01, 0x68, 0x00, 0x29, 0xfc, 0xd0, + 0x70, 0x47, 0x13, 0x4a, 0x02, 0x21, 0x11, 0x60, 0x10, 0x49, 0x0b, 0x68, + 0x00, 0x2b, 0xfc, 0xd0, 0x0f, 0x4b, 0x1b, 0x1d, 0x18, 0x60, 0x08, 0x68, + 0x00, 0x28, 0xfc, 0xd0, 0x00, 0x20, 0x10, 0x60, 0x08, 0x68, 0x00, 0x28, + 0xfc, 0xd0, 0x70, 0x47, 0x09, 0x4b, 0x10, 0xb5, 0x01, 0x22, 0x1a, 0x60, + 0x06, 0x4a, 0x14, 0x68, 0x00, 0x2c, 0xfc, 0xd0, 0x01, 0x60, 0x10, 0x68, + 0x00, 0x28, 0xfc, 0xd0, 0x00, 0x20, 0x18, 0x60, 0x10, 0x68, 0x00, 0x28, + 0xfc, 0xd0, 0x10, 0xbd, 0x00, 0xe4, 0x01, 0x40, 0x04, 0xe5, 0x01, 0x40, + 0x70, 0xb5, 0x0c, 0x46, 0x05, 0x46, 0x00, 0xf0, 0x73, 0xf8, 0x10, 0xb9, + 0x00, 0xf0, 0x7e, 0xf8, 0x28, 0xb1, 0x21, 0x46, 0x28, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0x07, 0xb8, 0x21, 0x46, 0x28, 0x46, 0xbd, 0xe8, + 0x70, 0x40, 0x00, 0xf0, 0x37, 0xb8, 0x00, 0x00, 0x7f, 0xb5, 0x00, 0x22, + 0x00, 0x92, 0x01, 0x92, 0x02, 0x92, 0x03, 0x92, 0x0a, 0x0b, 0x00, 0x0b, + 0x69, 0x46, 0x01, 0x23, 0x02, 0x44, 0x0a, 0xe0, 0x44, 0x09, 0x00, 0xf0, + 0x1f, 0x06, 0x51, 0xf8, 0x24, 0x50, 0x03, 0xfa, 0x06, 0xf6, 0x35, 0x43, + 0x41, 0xf8, 0x24, 0x50, 0x40, 0x1c, 0x82, 0x42, 0xf2, 0xd8, 0x0d, 0x49, + 0x08, 0x68, 0x00, 0x9a, 0x10, 0x43, 0x08, 0x60, 0x08, 0x1d, 0x01, 0x68, + 0x01, 0x9a, 0x11, 0x43, 0x01, 0x60, 0x00, 0xf0, 0x3d, 0xf8, 0x00, 0x28, + 0x0a, 0xd0, 0x06, 0x49, 0x10, 0x31, 0x08, 0x68, 0x02, 0x9a, 0x10, 0x43, + 0x08, 0x60, 0x09, 0x1d, 0x08, 0x68, 0x03, 0x9a, 0x10, 0x43, 0x08, 0x60, + 0x7f, 0xbd, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x30, 0xb5, 0x0f, 0x4c, + 0x00, 0x22, 0x00, 0xbf, 0x04, 0xeb, 0x02, 0x13, 0xd3, 0xf8, 0x00, 0x58, + 0x2d, 0xb9, 0xd3, 0xf8, 0x04, 0x58, 0x15, 0xb9, 0xd3, 0xf8, 0x08, 0x58, + 0x1d, 0xb1, 0x52, 0x1c, 0x08, 0x2a, 0xf1, 0xd3, 0x30, 0xbd, 0x08, 0x2a, + 0xfc, 0xd2, 0x04, 0xeb, 0x02, 0x12, 0xc2, 0xf8, 0x00, 0x08, 0xc3, 0xf8, + 0x04, 0x18, 0x02, 0x20, 0xc3, 0xf8, 0x08, 0x08, 0x30, 0xbd, 0x00, 0x00, + 0x00, 0xe0, 0x01, 0x40, 0x4f, 0xf0, 0x80, 0x50, 0xd0, 0xf8, 0x30, 0x01, + 0x08, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x4f, 0xf0, 0x80, 0x50, 0xd0, 0xf8, 0x30, 0x11, 0x06, 0x29, 0x05, 0xd0, + 0xd0, 0xf8, 0x30, 0x01, 0x40, 0x1c, 0x01, 0xd0, 0x00, 0x20, 0x70, 0x47, + 0x01, 0x20, 0x70, 0x47, 0x4f, 0xf0, 0x80, 0x50, 0xd0, 0xf8, 0x30, 0x01, + 0x0a, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x08, 0x20, 0x8f, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x10, 0x20, + 0x8c, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x14, 0x20, 0x8a, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x18, 0x20, 0x87, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0x30, 0x20, 0x85, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0x38, 0x20, 0x82, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0x3c, 0x20, 0x80, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x40, 0x20, + 0x7d, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x44, 0x20, 0x7b, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x48, 0x20, 0x78, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0x4c, 0x20, 0x76, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0x50, 0x20, 0x73, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0x54, 0x20, 0x71, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x58, 0x20, + 0x6e, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x5c, 0x20, 0x6c, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x60, 0x20, 0x69, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0x64, 0x20, 0x67, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0x68, 0x20, 0x64, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0x6c, 0x20, 0x62, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x70, 0x20, + 0x5f, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x74, 0x20, 0x5d, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x78, 0x20, 0x5a, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0x7c, 0x20, 0x58, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0x80, 0x20, 0x55, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0x84, 0x20, 0x53, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x88, 0x20, + 0x50, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x8c, 0x20, 0x4e, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x90, 0x20, 0x4b, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0x94, 0x20, 0x49, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0x98, 0x20, 0x46, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0x9c, 0x20, 0x44, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xa0, 0x20, + 0x41, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xa4, 0x20, 0x3f, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xa8, 0x20, 0x3c, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0xac, 0x20, 0x3a, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0xb0, 0x20, 0x37, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0xb4, 0x20, 0x35, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xb8, 0x20, + 0x32, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xbc, 0x20, 0x30, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xc0, 0x20, 0x2d, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0xc4, 0x20, 0x2b, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0xc8, 0x20, 0x28, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0xcc, 0x20, 0x26, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xd0, 0x20, + 0x23, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xd4, 0x20, 0x21, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xd8, 0x20, 0x1e, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0xdc, 0x20, 0x1c, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0xe0, 0x20, 0x19, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0xe4, 0x20, 0x17, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xe8, 0x20, + 0x14, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xec, 0x20, 0x12, 0x49, + 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0xf0, 0x20, 0x0f, 0x49, 0x09, 0x68, + 0x09, 0x58, 0x08, 0x47, 0xf4, 0x20, 0x0d, 0x49, 0x09, 0x68, 0x09, 0x58, + 0x08, 0x47, 0xf8, 0x20, 0x0a, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, + 0xfc, 0x20, 0x08, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x5f, 0xf4, + 0x80, 0x70, 0x05, 0x49, 0x09, 0x68, 0x09, 0x58, 0x08, 0x47, 0x00, 0x00, + 0x03, 0x48, 0x04, 0x49, 0x02, 0x4a, 0x03, 0x4b, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x40, 0xea, 0x01, 0x03, 0x10, 0xb5, 0x9b, 0x07, 0x0f, 0xd1, 0x04, 0x2a, + 0x0d, 0xd3, 0x10, 0xc8, 0x08, 0xc9, 0x12, 0x1f, 0x9c, 0x42, 0xf8, 0xd0, + 0x20, 0xba, 0x19, 0xba, 0x88, 0x42, 0x01, 0xd9, 0x01, 0x20, 0x10, 0xbd, + 0x4f, 0xf0, 0xff, 0x30, 0x10, 0xbd, 0x1a, 0xb1, 0xd3, 0x07, 0x03, 0xd0, + 0x52, 0x1c, 0x07, 0xe0, 0x00, 0x20, 0x10, 0xbd, 0x10, 0xf8, 0x01, 0x3b, + 0x11, 0xf8, 0x01, 0x4b, 0x1b, 0x1b, 0x07, 0xd1, 0x10, 0xf8, 0x01, 0x3b, + 0x11, 0xf8, 0x01, 0x4b, 0x1b, 0x1b, 0x01, 0xd1, 0x92, 0x1e, 0xf1, 0xd1, + 0x18, 0x46, 0x10, 0xbd, 0x02, 0xf0, 0xff, 0x03, 0x43, 0xea, 0x03, 0x22, + 0x42, 0xea, 0x02, 0x42, 0x00, 0xf0, 0x05, 0xb8, 0x70, 0x47, 0x70, 0x47, + 0x70, 0x47, 0x4f, 0xf0, 0x00, 0x02, 0x04, 0x29, 0xc0, 0xf0, 0x12, 0x80, + 0x10, 0xf0, 0x03, 0x0c, 0x00, 0xf0, 0x1b, 0x80, 0xcc, 0xf1, 0x04, 0x0c, + 0xbc, 0xf1, 0x02, 0x0f, 0x18, 0xbf, 0x00, 0xf8, 0x01, 0x2b, 0xa8, 0xbf, + 0x20, 0xf8, 0x02, 0x2b, 0xa1, 0xeb, 0x0c, 0x01, 0x00, 0xf0, 0x0d, 0xb8, + 0x5f, 0xea, 0xc1, 0x7c, 0x24, 0xbf, 0x00, 0xf8, 0x01, 0x2b, 0x00, 0xf8, + 0x01, 0x2b, 0x48, 0xbf, 0x00, 0xf8, 0x01, 0x2b, 0x70, 0x47, 0x4f, 0xf0, + 0x00, 0x02, 0x00, 0xb5, 0x13, 0x46, 0x94, 0x46, 0x96, 0x46, 0x20, 0x39, + 0x22, 0xbf, 0xa0, 0xe8, 0x0c, 0x50, 0xa0, 0xe8, 0x0c, 0x50, 0xb1, 0xf1, + 0x20, 0x01, 0xbf, 0xf4, 0xf7, 0xaf, 0x09, 0x07, 0x28, 0xbf, 0xa0, 0xe8, + 0x0c, 0x50, 0x48, 0xbf, 0x0c, 0xc0, 0x5d, 0xf8, 0x04, 0xeb, 0x89, 0x00, + 0x28, 0xbf, 0x40, 0xf8, 0x04, 0x2b, 0x08, 0xbf, 0x70, 0x47, 0x48, 0xbf, + 0x20, 0xf8, 0x02, 0x2b, 0x11, 0xf0, 0x80, 0x4f, 0x18, 0xbf, 0x00, 0xf8, + 0x01, 0x2b, 0x70, 0x47, 0x01, 0x4b, 0x1b, 0x68, 0xdb, 0x68, 0x18, 0x47, + 0x00, 0x00, 0x00, 0x20, 0x09, 0x48, 0x0a, 0x49, 0x70, 0x47, 0xff, 0xf7, + 0xfb, 0xff, 0xff, 0xf7, 0x45, 0xfb, 0x00, 0xbd, 0x20, 0xbf, 0xfd, 0xe7, + 0x06, 0x4b, 0x18, 0x47, 0x06, 0x4a, 0x10, 0x60, 0x01, 0x68, 0x81, 0xf3, + 0x08, 0x88, 0x40, 0x68, 0x00, 0x47, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0x00, 0x0b, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x1e, 0xf0, 0x04, 0x0f, 0x0c, 0xbf, 0xef, 0xf3, 0x08, 0x81, 0xef, 0xf3, + 0x09, 0x81, 0x88, 0x69, 0x02, 0x38, 0x00, 0x78, 0x18, 0x28, 0x03, 0xd1, + 0x00, 0xe0, 0x00, 0x00, 0x07, 0x4a, 0x10, 0x47, 0x07, 0x4a, 0x12, 0x68, + 0x2c, 0x32, 0x12, 0x68, 0x10, 0x47, 0x00, 0x00, 0x00, 0xb5, 0x05, 0x4b, + 0x1b, 0x68, 0x05, 0x4a, 0x9b, 0x58, 0x98, 0x47, 0x00, 0xbd, 0x00, 0x00, + 0x77, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xf0, 0x0a, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x90, 0xd0, 0x03, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; +const unsigned int MBR_bin_len = 4096; diff --git a/libraries/Nano33_System/examples/Nano33_updateBLandSoftDevice/Nano33_updateBLandSoftDevice.ino b/libraries/Nano33_System/examples/Nano33_updateBLandSoftDevice/Nano33_updateBLandSoftDevice.ino new file mode 100644 index 000000000..5f9661159 --- /dev/null +++ b/libraries/Nano33_System/examples/Nano33_updateBLandSoftDevice/Nano33_updateBLandSoftDevice.ino @@ -0,0 +1,240 @@ +/* + * This sketch allows to support Soft Devices on the Arduino Nano 33 BLE (Sense). + * + * To be able to support Soft Devices, the bootloader first needs to be updated. + * The new bootloader is fully backwards compatible with standard sketches. + * ----------------------------------------------------------------------- + * + * INSTRUCTIONS + * + * 1) Upload this sketch on the Nano 33 BLE to download the new bootloader into the flash. + * You can choose whether to update only the bootloader or the bootloader plus SoftDevice. + * Make a choice through the Serial monitor. + * + * 2) After flashing the bootloader the sketch asks if you want to upload the SoftDevice. + * This is required for the OpenMV firmware to work. + * After completion, the board will reboot and enter the bootloader mode. + * + * 3) Now you can upload a sketch that uses the SoftDevice at 0x26000, using the following bossac command + * + * /path/to/bossac -d --port=yourPort --offset=0x16000 -U -i -e -w /path/to/sketch.bin -R + * + * Or you can still upload a standard sketch from the IDE at 0x10000. This will of course overwrite the SoftDevice. + * So if you want to run a SoftDevice-related sketch, always remember to upload this sketch before and re-flash the SoftDevice. + * + * To create a custom SoftDevice follow this procedure: + * + * 1) Convert your SoftDevice binary to a SoftDevice.h . + * The nRF5-SDK website provides a SoftDevice.hex, so run the following commands: + * + * objcopy --input-target=ihex --output-target=binary --gap-fill 0xff SoftDevice.hex SoftDevice.bin + * xxd -i SoftDevice.bin > SoftDevice.h + * + * 2) Copy the content of the generated header file to SoftDevice.h + * + * 3) Run this sketch again and flash the SoftDevice. + */ + +#include "FlashIAP.h" +#include "MBR.h" +#include "bootloader.h" +#include "nrf_nvmc.h" +#include "SoftDevice.h" + +#define SOFTDEVICE_ADDR (0xA0000) +#define SOFTDEVICE_INFO_ADDR (0xFF000) +#define MBR_ADDR (0x0) +#define BOOTLOADER_ADDR (0xE0000) +#define UICR_BOOT_ADDR (0x10001014) + +#define BOOTLOADER_CRC 0x5E797B91 +#define BOOTLOADER_SIZE nano33_bootloader_hex_len +const unsigned int magic = 0x5f27a93d; + +mbed::FlashIAP flash; + +bool hasLatestBootloader(){ + //Compute bootloader CRC32 + uint32_t crc32 = getCurrentBootloaderCrc(); + return crc32 == BOOTLOADER_CRC; +} + +bool getUserConfirmation(){ + while (true){ + if (Serial.available()){ + char choice = Serial.read(); + switch (choice){ + case 'y': + case 'Y': + return true; + case 'n': + case 'N': + return false; + default: + continue; + } + } + } +} + +void applyUpdate(uint32_t address, const unsigned char payload[], long len, uint32_t bin_pointer = 0) { + uint32_t flash_pointer = 0; + const uint32_t page_size = flash.get_page_size(); + char *page_buffer = new char[page_size]; + uint32_t addr = address; + + uint32_t sector_size = flash.get_sector_size(addr); + uint32_t next_sector = addr + sector_size; + bool sector_erased = false; + size_t pages_flashed = 0; + uint32_t percent_done = 0; + + while (true) { + + if (flash_pointer >= len) { + break; + } + + flash.erase(addr + flash_pointer, sector_size); + + if ((len - flash_pointer) < sector_size) { + sector_size = len - flash_pointer; + } + + // Program page + flash.program(&payload[bin_pointer], addr + flash_pointer, sector_size); + Serial.print("Flash Address = "); + Serial.println(addr + flash_pointer, HEX); + + bin_pointer = bin_pointer + sector_size; + flash_pointer = flash_pointer + sector_size; + + uint32_t percent_done = flash_pointer * 100 / len; + Serial.println("Flashed " + String(percent_done) + "%"); + } + Serial.println(); + + delete[] page_buffer; +} + +void updateBootloader(){ + Serial.println("This sketch modifies the Nano33 bootloader to support Soft Devices."); + Serial.println(); + + flash.init(); + + Serial.println("Flashing MBR..."); + applyUpdate(MBR_ADDR, MBR_bin, MBR_bin_len); + + Serial.println("Flashing bootloader..."); + applyUpdate(BOOTLOADER_ADDR, nano33_bootloader_hex, nano33_bootloader_hex_len); + + Serial.print("Bootloader 32bit CRC is: "); + uint32_t crc32 = getTargetBootloaderCrc(); + Serial.println(crc32, HEX); + + Serial.println("Writing in UICR memory the address of the new bootloader..."); + nrf_nvmc_write_word(UICR_BOOT_ADDR, BOOTLOADER_ADDR); + + flash.deinit(); + + Serial.println(); + Serial.println("Bootloader update successfully completed!\n"); +} + +void updateSoftDevice(){ + flash.init(); + + Serial.println("Storing SoftDevice length info at 0xFF000..."); + writeSoftDeviceLen(SOFTDEVICE_INFO_ADDR); + + Serial.println("Flashing SoftDevice..."); + applyUpdate(SOFTDEVICE_ADDR, Softdevice_bin, Softdevice_bin_len - 4096, 4096); + + flash.deinit(); + + Serial.println(); + Serial.println("SoftDevice update complete! The board is restarting..."); + NVIC_SystemReset(); +} + +void setup() { + Serial.begin(115200); + while (!Serial) {} + + if(!hasLatestBootloader()){ + Serial.println("Your bootloader version is outdated (update required for Soft Device support)."); + Serial.println("Would you like to update it? Y/N"); + + if(getUserConfirmation()){ + updateBootloader(); + } + } + + if(hasLatestBootloader()){ + Serial.println("Would you like to install the Soft Device (required for OpenMV)? Y/N"); + if(getUserConfirmation()){ + updateSoftDevice(); + } + } + + Serial.println("Done. You may now disconnect the board."); +} + +uint32_t getTargetBootloaderCrc() { + uint32_t mask = 0; + uint32_t crc = 0xFFFFFFFF; + uint32_t b = 0; + uint8_t bootByte = 0; + + int iterations = BOOTLOADER_SIZE; + + for (int i=0; i