improve LaunchAPPL

This commit is contained in:
Wolfgang Thaller 2017-10-01 23:36:50 +02:00
parent 360a9858e3
commit 270cafaab4
6 changed files with 266 additions and 18 deletions

11
AutomatedTests/Log.c Normal file
View File

@ -0,0 +1,11 @@
#include "Test.h"
int main()
{
TEST_LOG_SIZED("One",3);
TEST_LOG_SIZED("Two",3);
for(;;)
;
TEST_LOG_SIZED("Three",5);
return 0;
}

View File

@ -3,12 +3,15 @@
#include <Files.h>
#include <Devices.h>
#include <string.h>
#define TEST_LOG_SIZED(str, size) \
do { \
HParamBlockRec _hpb; \
memset(&_hpb,0,sizeof(_hpb)); \
\
unsigned char _fileName[4]; \
short _ref;\
_fileName[0] = 3; \
_fileName[1] = 'o'; \
_fileName[2] = 'u'; \
@ -20,19 +23,27 @@
_hpb.fileParam.ioDirID = 0; \
_hpb.ioParam.ioPermssn = fsRdWrPerm; \
PBHOpenSync(&_hpb); \
\
_ref = _hpb.ioParam.ioRefNum; \
\
memset(&_hpb,0,sizeof(_hpb)); \
_hpb.ioParam.ioBuffer = str; \
_hpb.ioParam.ioReqCount = size; \
_hpb.ioParam.ioPosMode = fsFromLEOF; \
_hpb.ioParam.ioPosOffset = 0; \
_hpb.ioParam.ioRefNum = _ref; \
PBWriteSync((void*)&_hpb); \
memset(&_hpb,0,sizeof(_hpb)); \
char _newline = '\n'; \
_hpb.ioParam.ioBuffer = &_newline; \
_hpb.ioParam.ioReqCount = 1; \
_hpb.ioParam.ioPosMode = fsFromLEOF; \
_hpb.ioParam.ioPosOffset = 0; \
_hpb.ioParam.ioRefNum = _ref; \
PBWriteSync((void*)&_hpb); \
memset(&_hpb,0,sizeof(_hpb)); \
_hpb.ioParam.ioRefNum = _ref; \
PBCloseSync((void*)&_hpb); \
FlushVol(NULL,0); \
} while(0);
void TestLog(const char *str);

15
Dockerfile Normal file
View File

@ -0,0 +1,15 @@
# vim:ft=dockerfile
FROM ubuntu:16.04
RUN apt-get update && apt-get -y install \
g++ \
cmake libgmp-dev libmpfr-dev libmpc-dev libboost-all-dev bison \
zlib1g-dev \
perl texinfo
RUN mkdir /root/Retro68
COPY . /root/Retro68/
RUN mkdir /root/Retro68-build
RUN sh -c "cd /root/Retro68-build && sh ../Retro68/build-toolchain.sh --clean-after-build"

View File

@ -1,6 +1,6 @@
find_package(Boost COMPONENTS filesystem program_options)
add_executable(LaunchAPPL LaunchAPPL.cc)
add_executable(LaunchAPPL LaunchAPPL.cc bootblock.c)
target_include_directories(LaunchAPPL PRIVATE ${CMAKE_INSTALL_PREFIX}/include ${Boost_INCLUDE_DIR})
target_link_libraries(LaunchAPPL ResourceFiles ${Boost_LIBRARIES})

View File

@ -13,6 +13,11 @@
#include "ResourceFork.h"
#include "ResourceFile.h"
extern "C" {
#include "hfs.h"
}
namespace po = boost::program_options;
namespace fs = boost::filesystem;
@ -119,12 +124,18 @@ int ChildProcess(string program, vector<string> args)
int main(int argc, char *argv[])
{
desc.add_options()
("help,h", "show this help message")
("executor-path", po::value<std::string>()->default_value("executor"),"path to executor")
("help,h", "show this help message")
("executor,e", "run using executor")
("minivmac,m", "run using executor")
("executor-path", po::value<std::string>()->default_value("executor"),"path to executor")
("minivmac-path", po::value<std::string>()->default_value("minivmac"),"path to minivmac")
("minivmac-dir", po::value<std::string>()->default_value("."),"directory containing vMac.ROM")
("system-image", po::value<std::string>(),"path to disk image with system")
("timeout,t", po::value<int>(),"abort after timeout")
("timeout-ok","timeout counts as success")
("logfile", po::value<std::string>(), "read log file")
("result,r", "TEST 128")
;
po::options_description hidden, alldesc;
hidden.add_options()
@ -169,7 +180,6 @@ int main(int argc, char *argv[])
if(options.count("executor"))
{
fs::path tempDir = fs::unique_path();
std::cerr << "Unique path: " << tempDir.string() << std::endl;
fs::create_directories(tempDir);
fs::path appPath = tempDir / "Application";
@ -194,22 +204,156 @@ int main(int argc, char *argv[])
std::cout << in.rdbuf();
}
if(result == 0 && options.count("result"))
{
app.read();
auto& resmap = app.resources.resources;
auto p = resmap.find(ResRef("TEST", 128));
if(p == resmap.end())
return 1;
std::cout << p->second.getData();
}
fs::remove_all(tempDir);
return result;
}
if(options.count("minivmac"))
{
assert(options.count("system-image"));
fs::path tempDir = fs::unique_path();
fs::path path = tempDir / "image.dsk";
fs::create_directories(tempDir);
hfsvol *sysvol = hfs_mount(options["system-image"].as<std::string>().c_str(),
0, HFS_MODE_RDONLY);
int size = 5000*1024;
fs::ofstream(path, std::ios::binary | std::ios::trunc).seekp(size-1).put(0);
hfs_format(path.string().c_str(), 0, 0, "SysAndApp", 0, NULL);
hfsvol *vol = hfs_mount(path.string().c_str(), 0, HFS_MODE_RDWR);
hfsvolent ent;
hfs_vstat(sysvol, &ent);
hfs_setcwd(sysvol, ent.blessed);
{
const char *fn = "System";
hfsdirent fileent;
hfs_stat(sysvol, fn, &fileent);
hfsfile *in = hfs_open(sysvol, fn);
hfsfile *out = hfs_create(vol, fn, fileent.u.file.type,fileent.u.file.creator);
std::vector<uint8_t> buffer(std::max(fileent.u.file.dsize, fileent.u.file.rsize));
hfs_setfork(in, 0);
hfs_setfork(out, 0);
hfs_read(in, buffer.data(), fileent.u.file.dsize);
hfs_write(out, buffer.data(), fileent.u.file.dsize);
hfs_setfork(in, 1);
hfs_setfork(out, 1);
hfs_read(in, buffer.data(), fileent.u.file.rsize);
hfs_write(out, buffer.data(), fileent.u.file.rsize);
hfs_close(in);
hfs_close(out);
}
{
const char *fn = "Finder";
hfsdirent fileent;
hfs_stat(sysvol, fn, &fileent);
hfsfile *in = hfs_open(sysvol, fn);
hfsfile *out = hfs_create(vol, fn, fileent.u.file.type,fileent.u.file.creator);
std::vector<uint8_t> buffer(std::max(fileent.u.file.dsize, fileent.u.file.rsize));
hfs_setfork(in, 0);
hfs_setfork(out, 0);
hfs_read(in, buffer.data(), fileent.u.file.dsize);
hfs_write(out, buffer.data(), fileent.u.file.dsize);
hfs_setfork(in, 1);
hfs_setfork(out, 1);
hfs_read(in, buffer.data(), fileent.u.file.rsize);
hfs_write(out, buffer.data(), fileent.u.file.rsize);
hfs_close(in);
hfs_close(out);
}
{
const char *fn = "MacsBug";
hfsdirent fileent;
hfs_stat(sysvol, fn, &fileent);
hfsfile *in = hfs_open(sysvol, fn);
hfsfile *out = hfs_create(vol, fn, fileent.u.file.type,fileent.u.file.creator);
std::vector<uint8_t> buffer(std::max(fileent.u.file.dsize, fileent.u.file.rsize));
hfs_setfork(in, 0);
hfs_setfork(out, 0);
hfs_read(in, buffer.data(), fileent.u.file.dsize);
hfs_write(out, buffer.data(), fileent.u.file.dsize);
hfs_setfork(in, 1);
hfs_setfork(out, 1);
hfs_read(in, buffer.data(), fileent.u.file.rsize);
hfs_write(out, buffer.data(), fileent.u.file.rsize);
hfs_close(in);
hfs_close(out);
}
{
std::ostringstream rsrcOut;
app.resources.writeFork(rsrcOut);
std::string rsrc = rsrcOut.str();
std::string& data = app.data;
hfsfile *file = hfs_create(vol, "App","APPL","????");
hfs_setfork(file, 0);
hfs_write(file, data.data(), data.size());
hfs_setfork(file, 1);
hfs_write(file, rsrc.data(), rsrc.size());
hfs_close(file);
}
{
hfsfile *out = hfs_create(vol, "out", "TEXT", "????");
hfs_close(out);
}
hfs_vstat(vol, &ent);
ent.blessed = hfs_getcwd(vol);
std::cout << "blessed: " << ent.blessed << std::endl;
hfs_vsetattr(vol, &ent);
hfs_umount(vol);
hfs_umount(sysvol);
extern unsigned char bootblock[1024];
std::vector<unsigned char> bootblock1(bootblock, bootblock+1024);
std::fstream out(path.string(), std::ios::in | std::ios::out | std::ios::binary);
bootblock1[0x5A] = 3;
bootblock1[0x5B] = 'A';
bootblock1[0x5C] = 'p';
bootblock1[0x5D] = 'p';
out.write((const char*) bootblock1.data(), 1024);
path = fs::absolute(path);
fs::path minivmacdir = fs::absolute( options["minivmac-dir"].as<std::string>() );
fs::path minivmacpath = fs::absolute( minivmacdir / options["minivmac-path"].as<std::string>() );
fs::current_path(minivmacdir);
int result = ChildProcess(minivmacpath.string(), { path.string() });
std::cerr << "volume at: " << path.string() << std::endl;
vol = hfs_mount(path.string().c_str(), 0, HFS_MODE_RDONLY);
{
hfsfile *out = hfs_open(vol, "out");
if(!out)
return 1;
hfsdirent fileent;
int statres = hfs_stat(vol, "out", &fileent);
std::cerr << "stat: " << statres << "\n";
std::cerr << "out: " << fileent.u.file.dsize << " bytes\n";
std::vector<char> buffer(fileent.u.file.dsize);
hfs_setfork(out, 0);
hfs_read(out, buffer.data(), fileent.u.file.dsize);
hfs_close(out);
std::cout << string(buffer.begin(), buffer.end());
}
hfs_umount(vol);
}
return 0;
}

67
LaunchAPPL/bootblock.c Normal file
View File

@ -0,0 +1,67 @@
unsigned char bootblock[] = {
/* 00000000 */ 0x4c, 0x4b, 0x60, 0x00, 0x00, 0x86, 0x00, 0x17, 0x00, 0x00, 0x06, 0x53, 0x79, 0x73, 0x74, 0x65, /* |LK`........Syste| */
/* 00000010 */ 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x06, 0x46, 0x69, 0x6e, 0x64, 0x65, /* |m .Finde| */
/* 00000020 */ 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x07, 0x4d, 0x61, 0x63, 0x73, 0x62, /* |r .Macsb| */
/* 00000030 */ 0x75, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0c, 0x44, 0x69, 0x73, 0x61, 0x73, /* |ug .Disas| */
/* 00000040 */ 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x72, 0x20, 0x20, 0x20, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, /* |sembler .Start| */
/* 00000050 */ 0x55, 0x70, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x20, 0x06, 0x46, 0x69, 0x6e, 0x64, 0x65, /* |UpScreen .Finde| */
/* 00000060 */ 0x72, 0x00, 0x81, 0x00, 0x00, 0x72, 0x00, 0x00, 0x64, 0x0c, 0x0e, 0x43, 0x6c, 0x69, 0x70, 0x62, /* |r....r..d..Clipb| */
/* 00000070 */ 0x6f, 0x61, 0x72, 0x64, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x00, /* |oard File ......| */
/* 00000080 */ 0x43, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x38, 0x01, 0x08, 0x48, 0x41, /* |C........."8..HA| */
/* 00000090 */ 0x0c, 0x41, 0x00, 0x04, 0x6e, 0x2c, 0x72, 0x00, 0x50, 0xf9, 0x00, 0x01, 0xff, 0xf0, 0x42, 0xb9, /* |.A..n,r.P.....B.| */
/* 000000a0 */ 0x00, 0x03, 0xff, 0xf0, 0x4a, 0xb9, 0x00, 0x01, 0xff, 0xf0, 0x67, 0x16, 0x70, 0x02, 0x48, 0x40, /* |....J.....g.p.H@| */
/* 000000b0 */ 0xd1, 0xb8, 0x01, 0x08, 0xd1, 0xb8, 0x08, 0x24, 0xd1, 0xb8, 0x02, 0x66, 0xd1, 0xb8, 0x01, 0x0c, /* |.......$...f....| */
/* 000000c0 */ 0x72, 0x04, 0x20, 0x78, 0x02, 0xa6, 0x0c, 0x41, 0x00, 0x08, 0x6f, 0x02, 0x72, 0x08, 0xd1, 0xfb, /* |r. x...A..o.r...| */
/* 000000d0 */ 0x10, 0xae, 0x2f, 0x08, 0x70, 0x07, 0x41, 0xf8, 0x0a, 0xb8, 0x42, 0x98, 0x51, 0xc8, 0xff, 0xfc, /* |../.p.A...B.Q...| */
/* 000000e0 */ 0x34, 0x3a, 0xff, 0x9a, 0x70, 0x16, 0xc0, 0xc2, 0x22, 0x00, 0xa7, 0x1e, 0x43, 0xf8, 0x01, 0x54, /* |4:..p..."...C..T| */
/* 000000f0 */ 0x53, 0x42, 0x32, 0x82, 0x42, 0xa1, 0x42, 0xa1, 0x42, 0x61, 0x23, 0x08, 0x46, 0x58, 0x55, 0x41, /* |SB2.B.B.Ba#.FXUA| */
/* 00000100 */ 0x66, 0xfa, 0x33, 0x3c, 0xff, 0xef, 0x42, 0x78, 0x01, 0x84, 0x72, 0xfc, 0x70, 0x0f, 0x14, 0x38, /* |f.3<..Bx..r.p..8| */
/* 00000110 */ 0x02, 0x06, 0xc0, 0x02, 0xd0, 0x40, 0x48, 0x40, 0x10, 0x02, 0xe4, 0x48, 0xc0, 0x41, 0x48, 0x40, /* |.....@H@...H.AH@| */
/* 00000120 */ 0x21, 0xc0, 0x01, 0x8e, 0x70, 0x0f, 0x14, 0x38, 0x02, 0x09, 0xc0, 0x02, 0xe5, 0x48, 0x21, 0xc0, /* |!...p..8.....H!.| */
/* 00000130 */ 0x02, 0xf4, 0x10, 0x02, 0xe4, 0x48, 0xc0, 0x41, 0x21, 0xc0, 0x02, 0xf0, 0x41, 0xf8, 0x03, 0x40, /* |.....H.A!...A..@| */
/* 00000140 */ 0x72, 0x50, 0x42, 0x58, 0x51, 0xc9, 0xff, 0xfc, 0x70, 0x1e, 0xc0, 0xfa, 0xff, 0x2e, 0x32, 0x38, /* |rPBXQ...p.....28| */
/* 00000150 */ 0x01, 0x08, 0xe2, 0x49, 0xc0, 0xc1, 0x54, 0x40, 0x32, 0x00, 0xa7, 0x1e, 0x21, 0xc8, 0x03, 0x4e, /* |...I..T@2...!..N| */
/* 00000160 */ 0x30, 0xc1, 0x31, 0xfc, 0x00, 0x02, 0x03, 0x4c, 0x9e, 0xfc, 0x00, 0x32, 0x20, 0x4f, 0x31, 0x78, /* |0.1....L...2 O1x| */
/* 00000170 */ 0x02, 0x10, 0x00, 0x16, 0xa0, 0x0f, 0x66, 0x00, 0x01, 0xb2, 0xde, 0xfc, 0x00, 0x32, 0x43, 0xf8, /* |......f......2C.| */
/* 00000180 */ 0x0a, 0xd8, 0x41, 0xfa, 0xfe, 0x86, 0x70, 0x10, 0xa0, 0x2e, 0x55, 0x4f, 0x2f, 0x0f, 0x48, 0x78, /* |..A...p...UO/.Hx| */
/* 00000190 */ 0x09, 0xfa, 0x20, 0x78, 0x08, 0x10, 0x4e, 0x90, 0x30, 0x1f, 0xe6, 0x48, 0x31, 0xc0, 0x01, 0x06, /* |.. x..N.0..H1...| */
/* 000001a0 */ 0x08, 0x38, 0x00, 0x06, 0x02, 0x0b, 0x56, 0xf8, 0x08, 0xd3, 0xa8, 0x52, 0x43, 0xfa, 0xfe, 0x9c, /* |.8....V....RC...| */
/* 000001b0 */ 0x76, 0x01, 0x61, 0x00, 0x01, 0x98, 0x0c, 0x44, 0x40, 0x00, 0x6e, 0x02, 0x70, 0xff, 0x3f, 0x00, /* |v.a....D@.n.p.?.| */
/* 000001c0 */ 0x66, 0x04, 0x61, 0x00, 0x01, 0xf0, 0xa8, 0x53, 0x55, 0x4f, 0x42, 0xb8, 0x0a, 0xf2, 0xa9, 0x95, /* |f.a....SUOB.....| */
/* 000001d0 */ 0x4a, 0x5f, 0x6b, 0x00, 0x01, 0x56, 0x3e, 0x1f, 0x20, 0x5f, 0xa0, 0x57, 0x21, 0xf8, 0x02, 0xa6, /* |J_k..V>. _.W!...| */
/* 000001e0 */ 0x01, 0x18, 0x59, 0x4f, 0x2f, 0x3c, 0x44, 0x53, 0x41, 0x54, 0x42, 0x67, 0xa9, 0xa0, 0x2a, 0x1f, /* |..YO/<DSATBg..*.| */
/* 000001f0 */ 0x67, 0x00, 0x01, 0x1e, 0x20, 0x45, 0x21, 0xd0, 0x02, 0xba, 0xa8, 0xfe, 0x70, 0x28, 0x61, 0x00, /* |g... E!.....p(a.| */
/* 00000200 */ 0x01, 0x16, 0x20, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x32, 0x3a, 0xfd, 0xfe, 0x67, 0x0a, 0x6a, 0x04, /* |.. <....2:..g.j.| */
/* 00000210 */ 0x70, 0x01, 0xe2, 0x58, 0x91, 0xb8, 0x01, 0x0c, 0x04, 0xb8, 0x00, 0x00, 0x04, 0x00, 0x01, 0x0c, /* |p..X............| */
/* 00000220 */ 0x43, 0xfa, 0xfe, 0x08, 0x61, 0x00, 0x01, 0x24, 0x66, 0x00, 0x00, 0xf4, 0x4e, 0x91, 0x70, 0xf6, /* |C...a..$f...N.p.| */
/* 00000230 */ 0x61, 0x00, 0x00, 0xe4, 0x43, 0xfa, 0xfe, 0x04, 0x61, 0x00, 0x01, 0x10, 0x66, 0x08, 0x4e, 0x91, /* |a...C...a...f.N.| */
/* 00000240 */ 0x70, 0xf5, 0x61, 0x00, 0x00, 0xd2, 0x43, 0xf8, 0x0a, 0xd8, 0x76, 0xff, 0x61, 0x00, 0x00, 0xfe, /* |p.a...C...v.a...| */
/* 00000250 */ 0x66, 0x00, 0x00, 0x04, 0x4e, 0x91, 0x21, 0xf8, 0x02, 0xa6, 0x02, 0xb2, 0x70, 0x0c, 0xa7, 0x22, /* |f...N.!.....p.."| */
/* 00000260 */ 0x21, 0xc8, 0x0a, 0xec, 0xa0, 0x2c, 0xa0, 0x4f, 0x2f, 0x05, 0xa9, 0xa3, 0x7c, 0x00, 0x59, 0x4f, /* |!....,.O/...|.YO| */
/* 00000270 */ 0x2f, 0x3c, 0x49, 0x4e, 0x49, 0x54, 0x3f, 0x06, 0xa9, 0xa0, 0x2e, 0x17, 0x67, 0x00, 0x00, 0x64, /* |/<INIT?.....g..d| */
/* 00000280 */ 0xa9, 0x92, 0x20, 0x47, 0x20, 0x50, 0x4e, 0x90, 0x20, 0x47, 0x20, 0x50, 0x30, 0x3c, 0x4e, 0x71, /* |.. G PN. G P0<Nq| */
/* 00000290 */ 0x30, 0xc0, 0x30, 0xc0, 0x52, 0x46, 0x0c, 0x46, 0x00, 0x20, 0x6d, 0xd2, 0x70, 0x02, 0x48, 0x40, /* |0.0.RF.F. m.p.H@| */
/* 000002a0 */ 0xa4, 0x4c, 0x43, 0xf8, 0x09, 0x70, 0x21, 0xc9, 0x09, 0x6c, 0x41, 0xfa, 0xfd, 0xbe, 0x70, 0x10, /* |.LC..p!..lA...p.| */
/* 000002b0 */ 0xa0, 0x2e, 0x41, 0xfa, 0xfd, 0x66, 0x43, 0xf8, 0x02, 0xe0, 0x70, 0x10, 0xa0, 0x2e, 0x42, 0x78, /* |..A..fC...p...Bx| */
/* 000002c0 */ 0x09, 0x00, 0x47, 0xfa, 0xfd, 0x96, 0x61, 0x6a, 0x67, 0x08, 0x47, 0xfa, 0xfd, 0x4e, 0x61, 0x62, /* |..G...ajg.G..Nab| */
/* 000002d0 */ 0x66, 0x0a, 0x42, 0x67, 0x42, 0xa7, 0x2f, 0x0b, 0x20, 0x4f, 0xa9, 0xf2, 0x70, 0x29, 0xa9, 0xc9, /* |f.BgB./. O..p)..| */
/* 000002e0 */ 0xa9, 0xff, 0x58, 0x4f, 0x60, 0xae, 0x61, 0x08, 0x20, 0x79, 0x00, 0x40, 0x00, 0x04, 0x4e, 0xd0, /* |..XO`.a. y.@..N.| */
/* 000002f0 */ 0x9e, 0xfc, 0x00, 0x32, 0x20, 0x4f, 0x31, 0x7c, 0xff, 0xfb, 0x00, 0x18, 0x31, 0x7c, 0x00, 0x07, /* |...2 O1|....1|..| */
/* 00000300 */ 0x00, 0x1a, 0x31, 0x78, 0x02, 0x10, 0x00, 0x16, 0xa0, 0x04, 0xde, 0xfc, 0x00, 0x32, 0x4e, 0x75, /* |..1x.........2Nu| */
/* 00000310 */ 0x7e, 0x00, 0x60, 0x00, 0xfe, 0xe6, 0x4a, 0x47, 0x67, 0x02, 0xa9, 0xc9, 0x4e, 0x75, 0x06, 0xb8, /* |~.`...JGg...Nu..| */
/* 00000320 */ 0x00, 0x00, 0x04, 0x00, 0x01, 0x0c, 0x60, 0x00, 0xff, 0x1e, 0x61, 0xc4, 0x70, 0x64, 0xa9, 0xc9, /* |......`...a.pd..| */
/* 00000330 */ 0x60, 0xb4, 0x70, 0x13, 0x42, 0xa7, 0x51, 0xc8, 0xff, 0xfc, 0x2f, 0x4b, 0x00, 0x12, 0x20, 0x4f, /* |`.p.B.Q.../K.. O| */
/* 00000340 */ 0xa0, 0x0c, 0xde, 0xfc, 0x00, 0x50, 0x4a, 0x40, 0x4e, 0x75, 0x76, 0x00, 0x9e, 0xfc, 0x00, 0x32, /* |.....PJ@Nuv....2| */
/* 00000350 */ 0x20, 0x4f, 0x74, 0xff, 0x45, 0xe8, 0x00, 0x12, 0x24, 0xc9, 0x42, 0x9a, 0x42, 0x1a, 0x14, 0xfc, /* | Ot.E...$.B.B...| */
/* 00000360 */ 0x00, 0x01, 0x24, 0xbc, 0x00, 0x01, 0x10, 0x00, 0xa0, 0x00, 0x66, 0x2c, 0xa0, 0x11, 0x66, 0x26, /* |..$.......f,..f&| */
/* 00000370 */ 0x28, 0x1a, 0x7c, 0x02, 0xe1, 0x46, 0x98, 0x86, 0x4a, 0x43, 0x6b, 0x2e, 0x66, 0x22, 0x22, 0x78, /* |(.|..F..JCk.f""x| */
/* 00000380 */ 0x01, 0x0c, 0x93, 0xc4, 0x24, 0xc9, 0x24, 0xc4, 0x58, 0x4a, 0x34, 0xfc, 0x00, 0x01, 0x24, 0x86, /* |....$.$.XJ4...$.| */
/* 00000390 */ 0xa0, 0x02, 0x66, 0x02, 0x74, 0x00, 0xa0, 0x01, 0x30, 0x02, 0xde, 0xfc, 0x00, 0x32, 0x4e, 0x75, /* |..f.t...0....2Nu| */
/* 000003a0 */ 0x32, 0x7c, 0x60, 0x00, 0xd8, 0x86, 0x7c, 0x00, 0x60, 0xda, 0x20, 0x04, 0xa1, 0x1e, 0x22, 0x48, /* |2|`...|.`. ..."H| */
/* 000003b0 */ 0x20, 0x4f, 0x60, 0xd0, 0x2f, 0x3c, 0x01, 0x56, 0x02, 0x00, 0x42, 0xa7, 0x2f, 0x3c, 0x60, 0x00, /* | O`./<.V..B./<`.| */
/* 000003c0 */ 0x00, 0x40, 0x42, 0x67, 0x4b, 0xf9, 0x00, 0x00, 0xfd, 0x90, 0x45, 0xed, 0x00, 0x72, 0x2f, 0x0f, /* |.@BgK.....E..r/.| */
/* 000003d0 */ 0x48, 0x52, 0x48, 0x6f, 0x00, 0x0e, 0x48, 0x6a, 0x00, 0x06, 0x42, 0x67, 0x42, 0xa7, 0xa8, 0xec, /* |HRHo..Hj..BgB...| */
/* 000003e0 */ 0xde, 0xfc, 0x00, 0x0e, 0x4e, 0x75, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, /* |....Nu..........| */
/* 000003f0 */ 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda /* |................| */
/* 00000400 */
};