summaryrefslogtreecommitdiffhomepage
path: root/src/boot
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/BootKit/BootKit.h16
-rw-r--r--src/boot/BootKit/Shared/BootImg.rsrc72
-rw-r--r--src/boot/amd64-ci.make6
-rw-r--r--src/boot/amd64-desktop.make20
-rw-r--r--src/boot/arm64-desktop.make11
-rw-r--r--src/boot/modules/BootNet/BootNet.cpp1
-rw-r--r--src/boot/modules/BootNet/README.md2
-rw-r--r--src/boot/modules/BootNet/amd64.json2
-rw-r--r--src/boot/modules/BootNet/arm64.json2
-rw-r--r--src/boot/modules/MemoryTest/MemoryTest.cpp30
-rw-r--r--src/boot/modules/MemoryTest/MemoryTestStartup.S24
-rw-r--r--src/boot/modules/MemoryTest/README.md3
-rw-r--r--src/boot/modules/MemoryTest/amd64.json35
-rw-r--r--src/boot/modules/MemoryTest/arm64.json35
-rw-r--r--src/boot/modules/SysChk/SysChk.cpp1
-rw-r--r--src/boot/modules/SysChk/amd64-ahci-epm.json3
-rw-r--r--src/boot/modules/SysChk/amd64-ahci-gpt.json4
-rw-r--r--src/boot/modules/SysChk/amd64-pio-epm.json2
-rw-r--r--src/boot/modules/SysChk/amd64-pio-gpt.json2
-rw-r--r--src/boot/src/BootFileReader.cpp1
-rw-r--r--src/boot/src/BootSupport.cpp4
-rw-r--r--src/boot/src/BootThread.cpp41
-rw-r--r--src/boot/src/HEL/AMD64/BootAPI.S7
-rw-r--r--src/boot/src/HEL/AMD64/BootEFI.cpp46
-rw-r--r--src/boot/src/HEL/AMD64/BootPlatform.cpp24
-rw-r--r--src/boot/src/HEL/ARM64/BootEFI.cpp5
-rw-r--r--src/boot/src/HEL/ARM64/BootPlatform.cpp5
-rw-r--r--src/boot/src/New+Delete.cpp13
-rw-r--r--src/boot/src/boot_rsrc.rsrc4
29 files changed, 318 insertions, 103 deletions
diff --git a/src/boot/BootKit/BootKit.h b/src/boot/BootKit/BootKit.h
index 675049d8..1cdf2032 100644
--- a/src/boot/BootKit/BootKit.h
+++ b/src/boot/BootKit/BootKit.h
@@ -291,16 +291,16 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* part_name) {
CopyMem(gpt_part->Signature, reinterpret_cast<VoidPtr>(const_cast<Char*>(kMagicGPT)),
StrLen(kMagicGPT));
- gpt_part->Revision = 0x00010000;
+ gpt_part->Revision = 0x00010000;
gpt_part->HeaderSize = sizeof(GPT_PARTITION_TABLE);
gpt_part->CRC32 = 0x00000000;
- gpt_part->Reserved1 = 0x00000000;
- gpt_part->LBAHeader = 0x00000000;
- gpt_part->LBAAltHeader = 0x00000000;
+ gpt_part->Reserved1 = 0x00000000;
+ gpt_part->LBAHeader = 0x00000000;
+ gpt_part->LBAAltHeader = 0x00000000;
gpt_part->FirstGPTEntry = 0x00000000;
- gpt_part->LastGPTEntry = 0x00000000;
+ gpt_part->LastGPTEntry = 0x00000000;
gpt_part->Guid.Data1 = 0x00000000;
gpt_part->Guid.Data2 = 0x0000;
@@ -310,10 +310,10 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* part_name) {
gpt_part->Revision = 0x00010000;
- gpt_part->StartingLBA = 0x00000000;
+ gpt_part->StartingLBA = 0x00000000;
gpt_part->NumPartitionEntries = 0x00000000;
- gpt_part->SizeOfEntries = 0x00000000;
- gpt_part->CRC32PartEntry = 0x00000000;
+ gpt_part->SizeOfEntries = 0x00000000;
+ gpt_part->CRC32PartEntry = 0x00000000;
SetMem(gpt_part->Reserved2, 0, kSectorAlignGPT_PartTbl);
diff --git a/src/boot/BootKit/Shared/BootImg.rsrc b/src/boot/BootKit/Shared/BootImg.rsrc
new file mode 100644
index 00000000..514fdf85
--- /dev/null
+++ b/src/boot/BootKit/Shared/BootImg.rsrc
@@ -0,0 +1,72 @@
+#pragma once
+
+#define BOOT_LOGO_HEIGHT 64
+#define BOOT_LOGO_WIDTH 64
+
+// array size is 12288
+inline const Kernel::UInt32 kBootLogo[] = {
+ 0x1e3c5a, 0x22415f, 0x294967, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2c4c6a, 0x2b4c69, 0x2b4a68, 0x274865, 0x244562, 0x21415e, 0x1d3d5a, 0x1f3e57, 0x2a5555, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1f3f5c, 0x335270, 0x416281, 0x436383, 0x436383, 0x426383, 0x426383, 0x426383, 0x426383, 0x436383, 0x426383, 0x436383, 0x426383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x426383, 0x436383, 0x426383, 0x426383, 0x426383, 0x426383, 0x426383, 0x426383, 0x436383, 0x426383, 0x436383, 0x426383, 0x426383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x436383, 0x426383, 0x426382, 0x426382, 0x406180, 0x3e5f7d, 0x395a79, 0x335472, 0x2b4d6a, 0x254462, 0x1e3f5d, 0x1e3d5b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244361, 0x3d5e7d, 0x436484, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x446584, 0x446584, 0x426382, 0x3d5e7c, 0x335472, 0x284865, 0x203f5d, 0x1d3a58, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3e5f7e, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436483, 0x436484, 0x406180, 0x355574, 0x274765, 0x1e405c, 0x24486d, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3e5e7e, 0x436483, 0x426383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x436383, 0x436383, 0x436383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x436383, 0x436383, 0x436383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x426383, 0x436383, 0x436383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x436383, 0x426383, 0x436383, 0x426383, 0x426383, 0x436383, 0x426383, 0x426383, 0x426383, 0x436383, 0x436383, 0x436383, 0x436383, 0x436483, 0x3e5f7e, 0x30506f, 0x22425f, 0x20415a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3d5e7d, 0x426383, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426383, 0x426382, 0x375876, 0x264663, 0x1f3f5b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3d5e7d, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426382, 0x426383, 0x3b5c7b, 0x284965, 0x1d3d5b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3d5e7d, 0x426382, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426282, 0x426383, 0x3d5d7d, 0x294967, 0x1e3f5a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3d5d7d, 0x426282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x416282, 0x426282, 0x3c5d7c, 0x284866, 0x1e3d5b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3c5d7c, 0x416282, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416281, 0x416282, 0x3a5a79, 0x254562, 0x1f3f5f, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3c5d7c, 0x416281, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416282, 0x355574, 0x20415e, 0x555555, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3c5c7c, 0x416181, 0x416181, 0x406181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x406181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x406181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x406181, 0x416181, 0x406181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x406181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x406181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x416181, 0x406080, 0x2d4d6b, 0x203d59, 0x000000, 0x000000, 0x000000,
+ 0x244461, 0x3c5c7c, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x406181, 0x3a5b7a, 0x254462, 0x24485b, 0x000000, 0x000000,
+ 0x244361, 0x3c5c7b, 0x406181, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x406180, 0x30506e, 0x1f3f5c, 0x000000, 0x000000,
+ 0x244361, 0x3b5c7b, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x406080, 0x3b5b7a, 0x244461, 0x194c66, 0x000000,
+ 0x244361, 0x3b5c7b, 0x406080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x2d4d6c, 0x1d3b59, 0x000000,
+ 0x244361, 0x3b5b7b, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x3f6080, 0x406081, 0x365676, 0x20415e, 0x000000,
+ 0x244361, 0x3b5b7b, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3e5f80, 0x3e5f80, 0x3e5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3c5c7d, 0x274563, 0x224455,
+ 0x244360, 0x3a5b7b, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3e5f80, 0x3e5f7f, 0x426182, 0x416181, 0x3e5f7f, 0x3c5d7e, 0x3d5e7f, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3e5f7f, 0x416181, 0x456484, 0x466585, 0x466584, 0x446383, 0x406080, 0x3e5e7f, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3e5f80, 0x3f5f80, 0x3f5f80, 0x3f5f80, 0x3e5f7f, 0x2b4b6a, 0x1e3c5a,
+ 0x234360, 0x3a5a7a, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3f5f80, 0x8c9fb2, 0xc6d0d9, 0xc1cbd6, 0xb2bfcc, 0x8b9eb2, 0x53708d, 0x3c5d7e, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3c5d7e, 0x68819a, 0xc1ccd6, 0xced6df, 0xd0d8e0, 0xcfd7df, 0xcad3dc, 0xbbc7d2, 0x6a839c, 0x3c5d7e, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3e5f7f, 0x3f5f80, 0x305170, 0x1d3d5a,
+ 0x234360, 0x3a5a7a, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7e, 0x8295a9, 0xf1f3f4, 0xffffff, 0xffffff, 0xffffff, 0xdae0e6, 0x7189a1, 0x3c5d7e, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3c5d7e, 0x5d7792, 0xdadfe4, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xe9ecef, 0x698199, 0x3c5c7d, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5e7f, 0x3e5f7f, 0x345574, 0x1f3f5d,
+ 0x234360, 0x3a5a7a, 0x3e5e7f, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3c5c7c, 0x7b8fa3, 0xf2f3f5, 0xffffff, 0xffffff, 0xffffff, 0xe6eaee, 0x69829b, 0x3b5c7d, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3c5c7d, 0x5a748e, 0xd9dee4, 0xffffff, 0xffffff, 0xe6e9ed, 0x6c8399, 0x3c5c7d, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7e, 0x3e5e7f, 0x375777, 0x21425f,
+ 0x234360, 0x395a79, 0x3e5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3e5e7e, 0xb7c2cd, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xd5dce3, 0x55718e, 0x3b5c7d, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x395a7b, 0x94a5b6, 0xffffff, 0xffffff, 0x99a9b9, 0x3a5b7b, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3d5e7e, 0x3e5e7e, 0x385979, 0x23425f,
+ 0x234360, 0x395979, 0x3d5e7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3a5a7c, 0x8c9eb1, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xb9c4d0, 0x456483, 0x3c5d7d, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3a5b7c, 0x7a90a6, 0xfdfdfd, 0xf8f9fa, 0x6e859d, 0x3a5b7c, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x395979, 0x234360,
+ 0x234360, 0x395979, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3a5a7c, 0x7a90a5, 0xfefefe, 0xe7eaee, 0xb3bdc8, 0xfafbfb, 0xffffff, 0xfcfdfd, 0x97a8ba, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3a5b7c, 0x71889f, 0xfafbfc, 0xf0f2f4, 0x5e7893, 0x3b5b7c, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x3d5d7e, 0x395979, 0x234360,
+ 0x234360, 0x395979, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3a5a7b, 0x7289a0, 0xfdfdfd, 0xd2d9e0, 0x4b6784, 0xacb8c5, 0xffffff, 0xffffff, 0xf1f3f6, 0x758ca3, 0x3a5b7c, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3a5a7b, 0x6d849d, 0xf9fafb, 0xe8ecef, 0x54708c, 0x3b5c7c, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3c5c7d, 0x3a5b7b, 0x395a7b, 0x3a5a7b, 0x395a7b, 0x395a7b, 0x3b5c7c, 0x3c5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x3d5d7d, 0x395979, 0x234360,
+ 0x234360, 0x385879, 0x3c5d7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x395a7b, 0x6d859d, 0xfbfcfc, 0xcbd3dc, 0x406080, 0x4b6785, 0xc9d1d9, 0xffffff, 0xffffff, 0xdce1e7, 0x587490, 0x3a5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x395a7b, 0x6b839b, 0xf9fafb, 0xe2e7eb, 0x4f6b89, 0x3b5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3b5c7c, 0x3a5a7c, 0x496785, 0x6c849d, 0x8da0b3, 0x99aabb, 0x95a7b8, 0x7e93a9, 0x55718e, 0x3c5c7d, 0x3b5c7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5d7d, 0x385879, 0x234360,
+ 0x234360, 0x385879, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x395a7b, 0x69829a, 0xfafafb, 0xc7d0d9, 0x405f7f, 0x395a7b, 0x607992, 0xe4e8ec, 0xffffff, 0xffffff, 0xbcc7d3, 0x456483, 0x3b5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x395a7b, 0x6a829b, 0xf9fafb, 0xdee3e9, 0x4c6987, 0x3b5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3a5b7c, 0x466483, 0x8a9db1, 0xd5dce3, 0xf7f8fa, 0xf6f7f8, 0xf5f6f7, 0xfefefe, 0xffffff, 0xe4e9ed, 0x96a8b9, 0x456483, 0x3b5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x385879, 0x234360,
+ 0x234360, 0x385878, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x395a7b, 0x678099, 0xf9f9fa, 0xc5ced8, 0x3f5f7f, 0x3c5c7d, 0x395a7b, 0x8194a7, 0xf7f8f9, 0xffffff, 0xfdfdfe, 0x97a8ba, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x395a7b, 0x69819a, 0xf9fafb, 0xdbe1e7, 0x496785, 0x3b5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3a5b7c, 0x4f6c8a, 0xbbc6d2, 0xfeffff, 0xf0f1f3, 0x9caab8, 0x667d94, 0x5f7790, 0x8193a6, 0xdadfe4, 0xffffff, 0xfefefe, 0xacbac8, 0x426181, 0x3b5b7c, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x3c5c7d, 0x385878, 0x234360,
+ 0x234360, 0x375878, 0x3c5c7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x39597b, 0x657e98, 0xf8f9fa, 0xc5ced7, 0x3f5e7e, 0x3b5b7c, 0x3b5b7c, 0x3e5d7d, 0xaab6c3, 0xffffff, 0xffffff, 0xf1f3f5, 0x7289a1, 0x39597b, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x39597a, 0x69829a, 0xf9fafb, 0xd9dfe5, 0x486684, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3a5b7c, 0x456383, 0xbac6d1, 0xffffff, 0xeef0f3, 0x768a9f, 0x395979, 0x38597a, 0x39597b, 0x375779, 0x5f7891, 0xe3e7eb, 0xffffff, 0xfafbfc, 0x8095aa, 0x39597b, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3c5c7c, 0x375878, 0x234360,
+ 0x234360, 0x375778, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x38597a, 0x647d97, 0xf7f9fa, 0xc6cfd8, 0x3f5e7e, 0x3b5b7c, 0x3b5b7c, 0x3a5a7b, 0x4d6986, 0xd1d8de, 0xffffff, 0xffffff, 0xdae0e6, 0x55718e, 0x39597b, 0x3b5b7c, 0x3b5b7c, 0x38597a, 0x6b839c, 0xfafbfb, 0xd8dee4, 0x476584, 0x3a5a7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x39597b, 0x8c9eb2, 0xfdfdfe, 0xffffff, 0x9cabba, 0x39597a, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x38587a, 0x9dacbb, 0xffffff, 0xffffff, 0xc7d0d9, 0x426180, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x375778, 0x234360,
+ 0x234360, 0x375778, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x38597a, 0x647d97, 0xf7f8fa, 0xc7d0d9, 0x3f5e7f, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x38597a, 0x6c8299, 0xeff1f3, 0xffffff, 0xffffff, 0xbac5d1, 0x436281, 0x3a5a7b, 0x3b5b7c, 0x38597a, 0x6c849c, 0xfafbfc, 0xd8dee4, 0x476583, 0x3a5a7b, 0x3b5b7c, 0x3b5b7c, 0x3a5a7b, 0x4c6987, 0xdae0e6, 0xffffff, 0xf0f2f4, 0x5f7892, 0x39597a, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x37587a, 0x778ca3, 0xfcfcfd, 0xffffff, 0xeaedf1, 0x56718e, 0x39597b, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x375778, 0x234360,
+ 0x234360, 0x375777, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x38587a, 0x647d97, 0xf7f8fa, 0xc8d1da, 0x3f5e7f, 0x3a5a7b, 0x3b5b7c, 0x3b5b7c, 0x3a5a7c, 0x3a5a7a, 0x96a5b5, 0xfdfefe, 0xffffff, 0xfcfdfd, 0x94a6b8, 0x3a5a7b, 0x3a5a7b, 0x38587a, 0x6e859d, 0xfbfcfc, 0xd8dee4, 0x466483, 0x3a5a7b, 0x3b5b7c, 0x3b5b7c, 0x38587a, 0x7a90a6, 0xfbfcfc, 0xffffff, 0xe2e6eb, 0x4b6886, 0x365779, 0x375879, 0x375879, 0x38587a, 0x39597a, 0x39597a, 0x8296ab, 0xfdfdfd, 0xffffff, 0xf1f3f6, 0x5e7893, 0x38597a, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x3b5b7c, 0x375777, 0x234360,
+ 0x234360, 0x365677, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x385879, 0x657e97, 0xf8f9fa, 0xc9d2da, 0x3f5e7e, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x39597b, 0x446280, 0xc2cad3, 0xffffff, 0xffffff, 0xf0f3f5, 0x7188a0, 0x38587a, 0x375879, 0x71879f, 0xfcfdfd, 0xd8dee4, 0x466483, 0x39597b, 0x3a5a7b, 0x3a5a7b, 0x39597a, 0xa7b5c4, 0xffffff, 0xffffff, 0xf1f3f5, 0x93a4b6, 0x788ea5, 0x8196ab, 0x8da0b3, 0x9aabbc, 0xa9b7c6, 0xb9c5d0, 0xe9ecf0, 0xffffff, 0xffffff, 0xd4dae1, 0x4b6785, 0x39597b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x365677, 0x234360,
+ 0x234360, 0x365677, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x375879, 0x677f98, 0xf9fafb, 0xcad3db, 0x405e7e, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x385879, 0x5d7690, 0xe5e8ec, 0xffffff, 0xffffff, 0xdbe1e7, 0x56728e, 0x355577, 0x768ca3, 0xfefefe, 0xd8dee4, 0x466483, 0x39597b, 0x3a5a7b, 0x3a5a7b, 0x3c5c7c, 0xbfc9d4, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xf9f9fa, 0xf4f5f7, 0xeff1f3, 0xe9ecee, 0xe1e5e9, 0xd7dce1, 0xc9d0d7, 0xb6c0ca, 0x9ba9b8, 0x5d768f, 0x39597a, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x365677, 0x234360,
+ 0x234360, 0x365677, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x375779, 0x6a829b, 0xfafbfc, 0xcdd4dd, 0x405f7f, 0x39597b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x385879, 0x8396a9, 0xf9fafa, 0xffffff, 0xffffff, 0xbec8d3, 0x416080, 0x8094a9, 0xffffff, 0xd8dee4, 0x466382, 0x39597a, 0x3a5a7b, 0x3a597b, 0x3e5d7d, 0xc4cdd7, 0xffffff, 0xffffff, 0xf8f9fa, 0xa7b3c0, 0x73879c, 0x647a92, 0x58718b, 0x506a86, 0x496481, 0x435f7e, 0x3e5c7b, 0x395879, 0x375678, 0x385879, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x3a5a7b, 0x365677, 0x234360,
+ 0x234360, 0x365676, 0x3a597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x365779, 0x6f869e, 0xfcfdfd, 0xd1d8e0, 0x426080, 0x39597a, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597a, 0x3e5c7c, 0xafbbc7, 0xffffff, 0xffffff, 0xfefefe, 0x9dadbd, 0x9babbb, 0xffffff, 0xd7dee4, 0x456382, 0x39597a, 0x39597b, 0x39597a, 0x3c5b7c, 0xbfc9d3, 0xffffff, 0xffffff, 0xd6dce2, 0x436180, 0x355678, 0x375779, 0x375779, 0x38587a, 0x38587a, 0x39597a, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x39597b, 0x3a597b, 0x365677, 0x234360,
+ 0x23435f, 0x365576, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x365678, 0x768ba2, 0xfefefe, 0xd8dee4, 0x456382, 0x38587a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x375879, 0x506b87, 0xd6dce2, 0xffffff, 0xffffff, 0xf7f8f9, 0xeceff2, 0xffffff, 0xd7dee4, 0x456382, 0x38587a, 0x39597a, 0x39597a, 0x385879, 0xabb8c5, 0xffffff, 0xffffff, 0xd6dce3, 0x446281, 0x38587a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x365576, 0x23435f,
+ 0x23435f, 0x355576, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x365678, 0x8295aa, 0xffffff, 0xe1e6eb, 0x4c6886, 0x385879, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x365678, 0x6f859b, 0xf1f3f5, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xd9dfe5, 0x466382, 0x38587a, 0x39597a, 0x39597a, 0x365678, 0x8598ac, 0xffffff, 0xffffff, 0xedf0f3, 0x5a7590, 0x375778, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x39597a, 0x355576, 0x23435f,
+ 0x22435f, 0x355576, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x355578, 0x95a6b7, 0xffffff, 0xeff1f4, 0x5a7490, 0x365678, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x38587a, 0x395879, 0x98a7b7, 0xfefefe, 0xffffff, 0xffffff, 0xffffff, 0xdce1e7, 0x486584, 0x385779, 0x39587a, 0x39587a, 0x375779, 0x55708b, 0xe7ebee, 0xffffff, 0xffffff, 0x9fafbf, 0x38587a, 0x385879, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x385779, 0x365678, 0x375779, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x39587a, 0x355576, 0x22435f,
+ 0x21415f, 0x345475, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x375779, 0x3a5a7b, 0xbbc6d1, 0xffffff, 0xfcfdfd, 0x7c91a7, 0x355577, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x375779, 0x43607f, 0xbfc8d1, 0xffffff, 0xffffff, 0xffffff, 0xdfe4e9, 0x496685, 0x375779, 0x38587a, 0x38587a, 0x38587a, 0x385879, 0x9fadbc, 0xffffff, 0xffffff, 0xf2f4f6, 0x8699ae, 0x3c5b7c, 0x355577, 0x365678, 0x375779, 0x365678, 0x365678, 0x476484, 0x8094aa, 0x8195aa, 0x39597a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x38587a, 0x355576, 0x22435f,
+ 0x21415d, 0x335374, 0x38587a, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x375779, 0x3c5b7c, 0x879aae, 0xf4f6f8, 0xffffff, 0xffffff, 0xc9d1da, 0x466483, 0x375779, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x365678, 0x546e89, 0xd5dbe1, 0xffffff, 0xffffff, 0xdee3e8, 0x486584, 0x375778, 0x385879, 0x385879, 0x385879, 0x375778, 0x496583, 0xc7cfd7, 0xffffff, 0xffffff, 0xf7f8f9, 0xb7c3cf, 0x758ca3, 0x58728e, 0x516d8a, 0x617a95, 0x92a4b6, 0xd5dce3, 0xfefefe, 0xa6b3c1, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x385879, 0x355475, 0x22435f,
+ 0x1f3e5c, 0x315171, 0x385879, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x375779, 0x3e5d7d, 0xa8b5c4, 0xfcfcfd, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x94a4b6, 0x365678, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x365577, 0x5c748e, 0xd1d7de, 0xffffff, 0xc9d1da, 0x3f5d7d, 0x375779, 0x385779, 0x385779, 0x385779, 0x385779, 0x365678, 0x516b87, 0xbdc6cf, 0xfbfcfc, 0xffffff, 0xffffff, 0xfcfcfd, 0xeef1f4, 0xe9edf0, 0xf5f6f8, 0xffffff, 0xf5f6f7, 0xa8b4c1, 0x476381, 0x375678, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x385779, 0x345475, 0x22435f,
+ 0x1e3c58, 0x2e4e6e, 0x385779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x3e5d7d, 0x8899ab, 0xabb6c2, 0xafbac5, 0xb0bac5, 0xb0bac6, 0xa8b4c0, 0x677e96, 0x365678, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x355577, 0x4b6683, 0x7f91a4, 0x5f7790, 0x375678, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x365578, 0x405d7c, 0x7c8fa3, 0xbec7d0, 0xe1e4e8, 0xeef0f2, 0xf2f4f5, 0xeef0f2, 0xdbe0e4, 0xadb8c4, 0x677d94, 0x395878, 0x365678, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x345475, 0x22435f,
+ 0x1b3a56, 0x2b4a69, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375678, 0x345476, 0x355476, 0x365576, 0x365576, 0x365576, 0x355476, 0x355577, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x365678, 0x335476, 0x355577, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x365678, 0x345476, 0x3a5878, 0x496481, 0x576f89, 0x5b728c, 0x556e88, 0x45617f, 0x375677, 0x345477, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x375779, 0x345475, 0x22435f,
+ 0x17374f, 0x254563, 0x365577, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x365577, 0x355577, 0x355477, 0x355577, 0x365678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375778, 0x345374, 0x22435f,
+ 0x3f3f3f, 0x20405c, 0x325273, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x375678, 0x335374, 0x22435f,
+ 0x000000, 0x1d3a55, 0x2c4b6b, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x365678, 0x335374, 0x22435f,
+ 0x000000, 0x183952, 0x244562, 0x345476, 0x365678, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365678, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365678, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365578, 0x365678, 0x365578, 0x365578, 0x365578, 0x365578, 0x365678, 0x335274, 0x22415f,
+ 0x000000, 0x000000, 0x1f3d59, 0x2e4e6e, 0x365578, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x365577, 0x335273, 0x22415f,
+ 0x000000, 0x000000, 0x1c384f, 0x254462, 0x345475, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x365577, 0x325273, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x1d3c56, 0x2c4c6c, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x355577, 0x325273, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x1c2f4b, 0x22405f, 0x315172, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355476, 0x355476, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355476, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x355477, 0x325173, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1b3651, 0x264564, 0x335375, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x355476, 0x325173, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1d3955, 0x294868, 0x345376, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x345476, 0x315172, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x193333, 0x1d3c56, 0x2a4a6a, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x315072, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e2d3c, 0x1d3b57, 0x2a4969, 0x335375, 0x345376, 0x345376, 0x345376, 0x345375, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345375, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345375, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345376, 0x345375, 0x345375, 0x345376, 0x315072, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1f2f3f, 0x1e3a55, 0x284766, 0x325173, 0x345375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x335375, 0x345375, 0x315072, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1c1c38, 0x1b3750, 0x244361, 0x2f4e70, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x305072, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x17334a, 0x1f3d5a, 0x294868, 0x315072, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x304f72, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x19263f, 0x1b3750, 0x23405d, 0x2a4969, 0x304f71, 0x335274, 0x335275, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335275, 0x335274, 0x335274, 0x335275, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335275, 0x335274, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x304f71, 0x22415f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x172f3f, 0x1b364f, 0x203e5b, 0x264564, 0x2c4b6c, 0x2f4f71, 0x315173, 0x325174, 0x325275, 0x335275, 0x335275, 0x335275, 0x325275, 0x335275, 0x335275, 0x335275, 0x335275, 0x325275, 0x325275, 0x335275, 0x335275, 0x325275, 0x335275, 0x335275, 0x335275, 0x335275, 0x325275, 0x325275, 0x335275, 0x335275, 0x325275, 0x325275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x335275, 0x325275, 0x325274, 0x335275, 0x335275, 0x335275, 0x335275, 0x325275, 0x335275, 0x335275, 0x335275, 0x2d4c6d, 0x1f3f5a,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0e2a38, 0x193049, 0x1c3952, 0x203e5a, 0x234260, 0x264665, 0x294868, 0x2b4a6a, 0x2b4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2c4b6c, 0x2a496a, 0x21405e, 0x19364f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x112233, 0x172941, 0x173246, 0x1a344c, 0x1b374f, 0x1b3851, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1c3852, 0x1b374f, 0x193347, 0x000000
+}; \ No newline at end of file
diff --git a/src/boot/amd64-ci.make b/src/boot/amd64-ci.make
index 28017bf3..1d3fcce0 100644
--- a/src/boot/amd64-ci.make
+++ b/src/boot/amd64-ci.make
@@ -69,8 +69,8 @@ FLAG_GNU=-fshort-wchar -Wall -Wpedantic -Wextra -Werror -D__EFI_x86_64__ -mno-re
-DEFI_FUNCTION_WRAPPER -I./ -I../kernel $(DEBUG_MACRO) $(DISK_DRV) -I../ -c -nostdlib -fno-rtti -fno-exceptions \
-std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_NE_API__ -DBOOTZ_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT
-BOOTLOADER=ne_bootz
-KERNEL=ne_kernel
+BOOTLOADER=bootzldr.exe
+KERNEL_IMG=neoskrnl.exe
SYSCHK=chk.efi
BOOTNET=net.efi
SCIKIT=libSystem.dll
@@ -130,7 +130,7 @@ efi:
$(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd
BINS=*.bin
-EXECUTABLES=ne_bootz ne_kernel OVMF.fd
+EXECUTABLES=bootzldr.exe neoskrnl.exe OVMF.fd
TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES)
diff --git a/src/boot/amd64-desktop.make b/src/boot/amd64-desktop.make
index 0854db60..228a8f49 100644
--- a/src/boot/amd64-desktop.make
+++ b/src/boot/amd64-desktop.make
@@ -49,12 +49,12 @@ DEBUG_MACRO = -D__DEBUG__
endif
ifeq ($(KVM_SUPPORT),)
-EMU_FLAGS=-M q35 -smp 4 -m 8G \
+EMU_FLAGS=-M q35 -smp 6 -m 8G \
-bios $(BIOS) -cdrom $(BOOT) -boot d
endif
ifneq ($(KVM_SUPPORT),)
-EMU_FLAGS=-M q35 -smp 4 -m 8G \
+EMU_FLAGS=-M q35 -smp 6 -m 8G \
-bios $(BIOS) -M q35 -cdrom $(BOOT) -boot d -accel kvm
endif
@@ -71,12 +71,16 @@ FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -D__nekernel_allow_non_nekernel_pe -Wall
-DEFI_FUNCTION_WRAPPER -I./ -I../kernel $(DISK_DRV) -I../ -c -nostdlib -fno-rtti -fno-exceptions \
-std=c++20 -DBOOTZ_GPT_SUPPORT -D__HAVE_NE_API__ -DBOOTZ_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT -Wl,--disable-reloc-section
-BOOTLOADER=ne_bootz
-KERNEL=ne_kernel
+BOOTLOADER=bootzldr.exe
+KERNEL_IMG=neoskrnl.exe
SYSCHK=chk.efi
BOOTNET=net.efi
+MEMTEST=memtest.efi
SCIKIT=libSystem.dll
DDK=libDDK.dll
+POSIXWRAPPER=libPOSIXWrapper.dll
+PTHREAD=libPThread.dll
+HAL=hal.x64.dll
.PHONY: invalid-recipe
invalid-recipe:
@@ -89,10 +93,14 @@ all: compile-amd64
$(LD_GNU) $(OBJ) $(LD_FLAGS) -o src/$(BOOTLOADER)
$(COPY) src/$(BOOTLOADER) src/root/EFI/BOOT/BOOTX64.EFI
$(COPY) src/$(BOOTLOADER) src/root/EFI/BOOT/BOOTZ.EFI
- $(COPY) ../kernel/$(KERNEL) src/root/$(KERNEL)
+ $(COPY) ../kernel/$(KERNEL_IMG) src/root/$(KERNEL_IMG)
$(COPY) ./modules/SysChk/$(SYSCHK) src/root/$(SYSCHK)
$(COPY) ./modules/BootNet/$(BOOTNET) src/root/$(BOOTNET)
+ $(COPY) ./modules/MemoryTest/$(MEMTEST) src/root/$(MEMTEST)
$(COPY) ../libSystem/$(SCIKIT) src/root/$(SCIKIT)
+ $(COPY) ../libPOSIXWrapper/$(POSIXWRAPPER) src/root/$(POSIXWRAPPER)
+ # $(COPY) ../libPThread/$(PTHREAD) src/root/$(PTHREAD)
+ # $(COPY) ../hal/$(HAL) src/root/$(HAL)
$(COPY) src/$(BOOTLOADER) src/root/$(BOOTLOADER)
$(COPY) ../libDDK/$(DDK) src/root/$(DDK)
@@ -140,7 +148,7 @@ efi:
$(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd
BINS=*.bin
-EXECUTABLES=ne_bootz ne_kernel OVMF.fd
+EXECUTABLES=bootzldr.exe neoskrnl.exe OVMF.fd
TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES)
diff --git a/src/boot/arm64-desktop.make b/src/boot/arm64-desktop.make
index 55004175..01282950 100644
--- a/src/boot/arm64-desktop.make
+++ b/src/boot/arm64-desktop.make
@@ -47,10 +47,11 @@ FLAG_GNU=-fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__NE_ARM64__ -fno-
-target aarch64-unknown-windows \
-std=c++20 -DBOOTZ_EPM_SUPPORT -D__nekernel_allow_non_nekernel_pe -DBOOTZ_USE_FB -D__FSKIT_USE_NEFS__ -D__BOOTZ_STANDALONE__ -D__NEKERNEL__ -D__BOOTZ__ -D__HAVE_NE_API__ -D__NE__ -I../ -I../kernel
-BOOT_LOADER=ne_bootz
-KERNEL=ne_kernel
+BOOT_LOADER=bootzldr.exe
+KERNEL_IMG=neoskrnl.exe
SYSCHK=chk.efi
STARTUP=startup.efi
+HAL=hal.arm64.dll
.PHONY: invalid-recipe
invalid-recipe:
@@ -62,9 +63,11 @@ all: compile
$(LD_GNU) $(OBJ) $(LD_FLAGS) /out:src/$(BOOT_LOADER)
$(COPY) src/$(BOOT_LOADER) src/root/EFI/BOOT/BOOTAA64.EFI
$(COPY) src/$(BOOT_LOADER) src/root/EFI/BOOT/BootZ.EFI
- $(COPY) ../kernel/$(KERNEL) src/root/$(KERNEL)
+ $(COPY) ../kernel/$(KERNEL_IMG) src/root/$(KERNEL_IMG)
$(COPY) ./modules/SysChk/$(SYSCHK) src/root/$(SYSCHK)
$(COPY) src/$(BOOT_LOADER) src/root/$(BOOT_LOADER)
+ # $(COPY) ../libPThread/$(PTHREAD) src/root/$(PTHREAD)
+ # $(COPY) ../hal/$(HAL) src/root/$(HAL)
ifneq ($(DEBUG_SUPPORT), )
DEBUG = -D__DEBUG__
@@ -94,7 +97,7 @@ efi:
$(HTTP_GET) https://retrage.github.io/edk2-nightly/bin/DEBUGAARCH64_QEMU_EFI.fd -O OVMF.fd
BINS=*.bin
-EXECUTABLES=ne_bootz ne_kernel OVMF.fd
+EXECUTABLES=bootzldr.exe neoskrnl.exe OVMF.fd
TARGETS=$(REM_FLAG) $(OBJ) $(BIN) $(IMG) $(IMG_2) $(EXECUTABLES)
diff --git a/src/boot/modules/BootNet/BootNet.cpp b/src/boot/modules/BootNet/BootNet.cpp
index e4cbd073..e31d9460 100644
--- a/src/boot/modules/BootNet/BootNet.cpp
+++ b/src/boot/modules/BootNet/BootNet.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/BootThread.h>
#include <FirmwareKit/EFI/API.h>
diff --git a/src/boot/modules/BootNet/README.md b/src/boot/modules/BootNet/README.md
index 9c013d6f..fb5e71aa 100644
--- a/src/boot/modules/BootNet/README.md
+++ b/src/boot/modules/BootNet/README.md
@@ -1,5 +1,5 @@
# BootNet
-This module network boots a copy of `ne_kernel` via its NetBoot protocol.
+This module network boots a copy of `neoskrnl.exe` via its NetBoot protocol.
This is for EFI modules only, as the NeBoot firmware already supports it.
diff --git a/src/boot/modules/BootNet/amd64.json b/src/boot/modules/BootNet/amd64.json
index 41ce26e1..e654b77c 100644
--- a/src/boot/modules/BootNet/amd64.json
+++ b/src/boot/modules/BootNet/amd64.json
@@ -21,7 +21,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x10000000,-e,BootNetModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,BootNetModuleMain"
],
"cpp_macros": [
"__BOOTZ__",
diff --git a/src/boot/modules/BootNet/arm64.json b/src/boot/modules/BootNet/arm64.json
index f939083e..bed477a4 100644
--- a/src/boot/modules/BootNet/arm64.json
+++ b/src/boot/modules/BootNet/arm64.json
@@ -21,7 +21,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x10000000,-e,BootNetModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,BootNetModuleMain"
],
"cpp_macros": [
"__BOOTZ__",
diff --git a/src/boot/modules/MemoryTest/MemoryTest.cpp b/src/boot/modules/MemoryTest/MemoryTest.cpp
new file mode 100644
index 00000000..49f28dcb
--- /dev/null
+++ b/src/boot/modules/MemoryTest/MemoryTest.cpp
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: Apache-2.0
+// Copyright 2024-2026, Amlal El Mahrouss (amlal@nekernel.org)
+// Licensed under the Apache License, Version 2.0 (see LICENSE file)
+// Official repository: https://github.com/ne-foss-org/nekernel
+
+#include <BootKit/BootKit.h>
+#include <BootKit/BootThread.h>
+#include <FirmwareKit/EFI/API.h>
+
+EXTERN_C Int32 MemoryTestModuleMain(Kernel::HEL::BootInfoHeader* handover) {
+ fw_init_efi((EfiSystemTable*) handover->f_FirmwareCustomTables[Kernel::HEL::kHandoverTableST]);
+
+ Boot::BootTextWriter writer;
+ writer.Write("MemoryTest: Testing Memory...\r");
+
+ constexpr auto kTestValue = 0x20000000L;
+
+ Int32* mem = (Int32*) kTestValue;
+ if (!mem) return kEfiFail;
+
+ auto prev = *mem;
+ *mem = 42;
+ if (*mem != 42) {
+ return kEfiFail;
+ }
+
+ *mem = prev;
+
+ return kEfiOk;
+}
diff --git a/src/boot/modules/MemoryTest/MemoryTestStartup.S b/src/boot/modules/MemoryTest/MemoryTestStartup.S
new file mode 100644
index 00000000..a5832ee6
--- /dev/null
+++ b/src/boot/modules/MemoryTest/MemoryTestStartup.S
@@ -0,0 +1,24 @@
+;; /*
+;; * ========================================================
+;; *
+;; * BootZ
+;; * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+;; *
+;; * ========================================================
+;; */
+
+#ifdef __NE_AMD64__
+.code64
+.intel_syntax noprefix
+#endif
+
+#define kTypeDriver 101
+#define kArchAmd64 122
+#define kHandoverMagic 0xBADCC
+
+.section .ldr
+
+.quad kHandoverMagic
+.word kTypeDriver
+.word 0
+.word kArchAmd64 \ No newline at end of file
diff --git a/src/boot/modules/MemoryTest/README.md b/src/boot/modules/MemoryTest/README.md
new file mode 100644
index 00000000..fac97400
--- /dev/null
+++ b/src/boot/modules/MemoryTest/README.md
@@ -0,0 +1,3 @@
+# MemoryTest:
+
+This module tests the memory of a x64 machine by allocating to it.
diff --git a/src/boot/modules/MemoryTest/amd64.json b/src/boot/modules/MemoryTest/amd64.json
new file mode 100644
index 00000000..8d1f8bd3
--- /dev/null
+++ b/src/boot/modules/MemoryTest/amd64.json
@@ -0,0 +1,35 @@
+{
+ "compiler_path": "x86_64-w64-mingw32-g++",
+ "compiler_std": "c++20",
+ "headers_path": [
+ "../",
+ "../../",
+ "../../../kernel",
+ "../../../",
+ "./"
+ ],
+ "sources_path": [
+ "*.cpp",
+ "*.S",
+ "../../src/HEL/AMD64/*.cpp",
+ "../../src/HEL/AMD64/*.S",
+ "../../src/*.cpp"
+ ],
+ "output_name": "memtest.efi",
+ "compiler_flags": [
+ "-nostdlib",
+ "-std=c++20",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,MemoryTestModuleMain"
+ ],
+ "cpp_macros": [
+ "__BOOTZ__",
+ "__BOOTZ_STANDALONE__",
+ "__NE_AMD64__",
+ "__nekernel_max_cores=8 ",
+ "kMemTestVersionHighest=0x0100",
+ "kMemTestVersionLowest=0x0100",
+ "kMemTestEFIVersion=0x0100"
+ ]
+}
diff --git a/src/boot/modules/MemoryTest/arm64.json b/src/boot/modules/MemoryTest/arm64.json
new file mode 100644
index 00000000..41590bb4
--- /dev/null
+++ b/src/boot/modules/MemoryTest/arm64.json
@@ -0,0 +1,35 @@
+{
+ "compiler_path": "x86_64-w64-mingw32-g++",
+ "compiler_std": "c++20",
+ "headers_path": [
+ "../",
+ "../../",
+ "../../../kernel",
+ "../../../",
+ "./"
+ ],
+ "sources_path": [
+ "*.cpp",
+ "*.S",
+ "../../src/HEL/ARM64/*.cpp",
+ "../../src/HEL/ARM64/*.S",
+ "../../src/*.cpp"
+ ],
+ "output_name": "memtest.efi",
+ "compiler_flags": [
+ "-nostdlib",
+ "-std=c++20",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,MemoryTestModuleMain"
+ ],
+ "cpp_macros": [
+ "__BOOTZ__",
+ "__BOOTZ_STANDALONE__",
+ "__NE_ARM64__",
+ "__nekernel_max_cores=8 ",
+ "kMemTestVersionHighest=0x0100",
+ "kMemTestVersionLowest=0x0100",
+ "kMemTestEFIVersion=0x0100"
+ ]
+}
diff --git a/src/boot/modules/SysChk/SysChk.cpp b/src/boot/modules/SysChk/SysChk.cpp
index 336f4814..1a93d748 100644
--- a/src/boot/modules/SysChk/SysChk.cpp
+++ b/src/boot/modules/SysChk/SysChk.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/BootThread.h>
#include <BootKit/HW/SATA.h>
diff --git a/src/boot/modules/SysChk/amd64-ahci-epm.json b/src/boot/modules/SysChk/amd64-ahci-epm.json
index 43b0bff7..99037618 100644
--- a/src/boot/modules/SysChk/amd64-ahci-epm.json
+++ b/src/boot/modules/SysChk/amd64-ahci-epm.json
@@ -13,6 +13,7 @@
"../../src/New+Delete.cpp",
"../../../kernel/HALKit/AMD64/PCI/*.cpp",
"../../../kernel/HALKit/AMD64/Storage/*.cpp",
+ "../../../kernel/HALKit/AMD64/Network/*.cpp",
"../../../kernel/src/Storage/*.cpp",
"../../../kernel/src/Network/*.cpp",
"../../../kernel/HALKit/AMD64/*.cpp",
@@ -25,7 +26,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,SysChkModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/src/boot/modules/SysChk/amd64-ahci-gpt.json b/src/boot/modules/SysChk/amd64-ahci-gpt.json
index d36f66bf..d9160952 100644
--- a/src/boot/modules/SysChk/amd64-ahci-gpt.json
+++ b/src/boot/modules/SysChk/amd64-ahci-gpt.json
@@ -13,7 +13,9 @@
"../../src/New+Delete.cpp",
"../../../kernel/HALKit/AMD64/PCI/*.cpp",
"../../../kernel/HALKit/AMD64/Storage/*.cpp",
+ "../../../kernel/HALKit/AMD64/Network/*.cpp",
"../../../kernel/src/Storage/*.cpp",
+ "../../../kernel/src/Network/*.cpp",
"../../../kernel/HALKit/AMD64/*.cpp",
"../../../kernel/HALKit/AMD64/*.s",
"../../../kernel/src/*.cpp"
@@ -24,7 +26,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,SysChkModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/src/boot/modules/SysChk/amd64-pio-epm.json b/src/boot/modules/SysChk/amd64-pio-epm.json
index 7e4b1d4e..ffcca945 100644
--- a/src/boot/modules/SysChk/amd64-pio-epm.json
+++ b/src/boot/modules/SysChk/amd64-pio-epm.json
@@ -31,7 +31,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,SysChkModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/src/boot/modules/SysChk/amd64-pio-gpt.json b/src/boot/modules/SysChk/amd64-pio-gpt.json
index d954daed..5457f8a9 100644
--- a/src/boot/modules/SysChk/amd64-pio-gpt.json
+++ b/src/boot/modules/SysChk/amd64-pio-gpt.json
@@ -24,7 +24,7 @@
"-std=c++20",
"-fno-rtti",
"-fno-exceptions",
- "-Wl,--subsystem=17,--image-base,0x10000000,-e,SysChkModuleMain"
+ "-Wl,--subsystem=17,--image-base,0x20000000,-e,SysChkModuleMain"
],
"cpp_macros": [
"__NEOSKRNL__",
diff --git a/src/boot/src/BootFileReader.cpp b/src/boot/src/BootFileReader.cpp
index 7f6da47e..0ca48cd3 100644
--- a/src/boot/src/BootFileReader.cpp
+++ b/src/boot/src/BootFileReader.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/Platform.h>
#include <BootKit/Protocol.h>
diff --git a/src/boot/src/BootSupport.cpp b/src/boot/src/BootSupport.cpp
index 232ac965..2680e439 100644
--- a/src/boot/src/BootSupport.cpp
+++ b/src/boot/src/BootSupport.cpp
@@ -16,13 +16,13 @@
#define kAtExitMaxDestructors (128U)
typedef struct atexit_func_entry {
- void(*destructor_func)();
+ void (*destructor_func)();
} atexit_func_entry_t;
typedef long long uarch_t;
atexit_func_entry_t __atexit_funcs[kAtExitMaxDestructors];
-uarch_t __atexit_func_count;
+uarch_t __atexit_func_count;
/// @note This function is a stub, not implemented by the bootloader as of right now. (AMLALE)
EXTERN_C int atexit(void (*f)()) {
diff --git a/src/boot/src/BootThread.cpp b/src/boot/src/BootThread.cpp
index 19e87bae..19d7e8f8 100644
--- a/src/boot/src/BootThread.cpp
+++ b/src/boot/src/BootThread.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/BootThread.h>
#include <BootKit/Support.h>
@@ -14,9 +13,10 @@
#include <KernelKit/PE.h>
#include <KernelKit/PEF.h>
#include <modules/CoreGfx/TextGfx.h>
+#include "FirmwareKit/Handover.h"
// \brief This macro defines the maximum size of a image's stack.
-#define kBootThreadSz mib_cast(16)
+#define kBootThreadSz kib_cast(8)
/// @brief External boot services symbol.
EXTERN EfiBootServices* BS;
@@ -79,13 +79,6 @@ BootThread::BootThread(VoidPtr blob) : fStartAddress(nullptr), fBlob(blob) {
writer.Write("BootZ: Image-Base: ").Write(loadStartAddress).Write("\r");
- fStack = new UInt8[kBootThreadSz];
-
- if (!fStack) {
- writer.Write("BootZ: Unable to allocate the stack for the thread.\r");
- return;
- }
-
LDR_SECTION_HEADER_PTR sectPtr =
(LDR_SECTION_HEADER_PTR) (((Char*) opt_header_ptr) + header_ptr->SizeOfOptionalHeader);
@@ -180,36 +173,16 @@ Int32 BootThread::Start(HEL::BootInfoHeader* handover, Bool own_stack) {
return kEfiFail;
}
+ NE_UNUSED(own_stack);
+
fHandover = handover;
BootTextWriter writer;
+ writer.Write("BootThread: ").Write(fBlobName).Write("\r");
- writer.Write("BootZ: Starting: ").Write(fBlobName).Write("\r");
- writer.Write("BootZ: Handover address: ").Write((UIntPtr) fHandover).Write("\r");
-
- if (own_stack) {
- writer.Write("BootZ: Using it's own stack.\r");
- writer.Write("BootZ: Stack address: ").Write((UIntPtr) &fStack[kBootThreadSz - 1]).Write("\r");
- writer.Write("BootZ: Stack size: ").Write(kBootThreadSz).Write("\r");
-
- fHandover->f_StackTop = &fStack[kBootThreadSz - 1];
- fHandover->f_StackSz = kBootThreadSz;
-
- auto ret = rt_jump_to_address(fStartAddress, fHandover, &fStack[kBootThreadSz - 1]);
-
- // we don't need the stack anymore.
-
- delete[] fStack;
- fStack = nullptr;
-
- return ret;
- } else {
- writer.Write("BootZ: Using the bootloader's stack.\r");
-
- return reinterpret_cast<HEL::HandoverProc>(fStartAddress)(fHandover);
- }
+ auto ret = ((HEL::HandoverProc)fStartAddress)(fHandover);
- return kEfiFail;
+ return ret;
}
const Char* BootThread::GetName() {
diff --git a/src/boot/src/HEL/AMD64/BootAPI.S b/src/boot/src/HEL/AMD64/BootAPI.S
index 33c1f5d3..a3c37c78 100644
--- a/src/boot/src/HEL/AMD64/BootAPI.S
+++ b/src/boot/src/HEL/AMD64/BootAPI.S
@@ -28,16 +28,9 @@ sched_jump_to_task:
rt_jump_to_address:
mov rbx, rcx
mov rcx, rdx
- push rbx
- push rdx
mov rsp, r8
- push rax
jmp rbx
- pop rdx
- pop rbx
- pop rax
-
ret
rt_reset_hardware:
diff --git a/src/boot/src/HEL/AMD64/BootEFI.cpp b/src/boot/src/HEL/AMD64/BootEFI.cpp
index ffcf394c..d3492843 100644
--- a/src/boot/src/HEL/AMD64/BootEFI.cpp
+++ b/src/boot/src/HEL/AMD64/BootEFI.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/BootThread.h>
#include <FirmwareKit/EFI.h>
@@ -75,7 +74,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
Boot::Stop();
}
- writer.Write("BootZ: The NeKernel Bootloader. Copyright 2024-2026, Amlal El Mahrouss and al.\r");
+ writer.Write("BootZ: The NeKernel Loader. Copyright 2024-2026, Amlal El Mahrouss and al.\r");
for (SizeT index_vt = 0; index_vt < sys_table->NumberOfTableEntries; ++index_vt) {
Char* vendor_table =
@@ -121,8 +120,10 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
if (mp) {
mp->GetNumberOfProcessors(mp, &cnt_disabled, &cnt_enabled);
+ kHandoverHeader->f_NumberOfProcessors = cnt_enabled;
handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1;
} else {
+ handover_hdr->f_NumberOfProcessors = 1;
handover_hdr->f_HardwareTables.f_MultiProcessingEnabled = NO;
}
@@ -179,6 +180,18 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
syschk_thread->Start(handover_hdr, NO);
}
+ Boot::BootFileReader reader_memtest(L"memtest.efi", image_handle);
+ reader_memtest.ReadAll(0);
+
+ if (reader_memtest.Blob()) {
+ auto memtest_thread = new Boot::BootThread(reader_memtest.Blob());
+
+ if (memtest_thread) {
+ memtest_thread->SetName("MemoryTest");
+ memtest_thread->Start(handover_hdr, NO);
+ }
+ }
+
handover_hdr->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor);
handover_hdr->f_Magic = kHandoverMagic;
@@ -204,6 +217,17 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
ST->RuntimeServices->GetVariable(L"/props/kern_ver", kEfiGlobalNamespaceVarGUID, nullptr, &sz_ver,
&ver);
+ UInt32 sz_smp_max = sizeof(UInt64);
+ UInt64 smp_max = 0;
+
+ ST->RuntimeServices->GetVariable(L"/props/smp_max", kEfiGlobalNamespaceVarGUID, nullptr,
+ &sz_smp_max, &smp_max);
+
+ /// This variable makes sure we enable the core we want to actually use.
+ if (smp_max > 0 && smp_max < kHandoverHeader->f_NumberOfProcessors) {
+ kHandoverHeader->f_NumberOfProcessors = smp_max;
+ }
+
if (ver < KERNEL_VERSION_BCD) {
ver = KERNEL_VERSION_BCD;
@@ -244,16 +268,20 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
handover_hdr->f_KernelImage = reader_kernel.Blob();
handover_hdr->f_KernelSz = reader_kernel.Size();
- kernel_thread.Start(handover_hdr, YES);
+ return kernel_thread.Start(handover_hdr, YES);
}
- Boot::BootFileReader reader_netboot(L"net.efi", image_handle);
- reader_netboot.ReadAll(0);
+ Boot::BootFileReader reader_net(L"memtest.efi", image_handle);
+ reader_net.ReadAll(0);
- if (!reader_netboot.Blob()) return kEfiFail;
+ if (reader_net.Blob()) {
+ auto net_thread = new Boot::BootThread(reader_net.Blob());
- auto netboot_thread = Boot::BootThread(reader_netboot.Blob());
- netboot_thread.SetName("BootNet");
+ if (net_thread) {
+ net_thread->SetName("BootNet");
+ net_thread->Start(handover_hdr, NO);
+ }
+ }
- return netboot_thread.Start(handover_hdr, NO);
+ return kEfiFail;
}
diff --git a/src/boot/src/HEL/AMD64/BootPlatform.cpp b/src/boot/src/HEL/AMD64/BootPlatform.cpp
index 85c8da57..dc52c5c1 100644
--- a/src/boot/src/HEL/AMD64/BootPlatform.cpp
+++ b/src/boot/src/HEL/AMD64/BootPlatform.cpp
@@ -3,25 +3,35 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/Platform.h>
#include <BootKit/Protocol.h>
#ifdef __BOOTZ_STANDALONE__
-/// @brief These functions are used for x64 backends only. Do not try to use the same name for other backends, use their ISA specific conventions.
+/// @brief These functions are used for x64 backends only. Do not try to use the same name for other
+/// backends, use their ISA specific conventions.
using namespace Boot;
-EXTERN_C void rt_halt() { asm volatile("hlt"); }
+EXTERN_C void rt_halt() {
+ asm volatile("hlt");
+}
-EXTERN_C void rt_cli() { asm volatile("cli"); }
+EXTERN_C void rt_cli() {
+ asm volatile("cli");
+}
-EXTERN_C void rt_sti() { asm volatile("sti"); }
+EXTERN_C void rt_sti() {
+ asm volatile("sti");
+}
-EXTERN_C void rt_cld() { asm volatile("cld"); }
+EXTERN_C void rt_cld() {
+ asm volatile("cld");
+}
-EXTERN_C void rt_std() { asm volatile("std"); }
+EXTERN_C void rt_std() {
+ asm volatile("std");
+}
#endif // __BOOTZ_STANDALONE__
diff --git a/src/boot/src/HEL/ARM64/BootEFI.cpp b/src/boot/src/HEL/ARM64/BootEFI.cpp
index 9c40c9c3..2cfacc22 100644
--- a/src/boot/src/HEL/ARM64/BootEFI.cpp
+++ b/src/boot/src/HEL/ARM64/BootEFI.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/BootThread.h>
#include <FirmwareKit/EFI.h>
@@ -95,8 +94,10 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
if (mp) {
mp->GetNumberOfProcessors(mp, &cnt_disabled, &cnt_enabled);
+ kHandoverHeader->f_NumberOfProcessors = cnt_enabled;
kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled = cnt_enabled > 1;
} else {
+ kHandoverHeader->f_NumberOfProcessors = 1;
kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled = NO;
}
@@ -123,7 +124,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, EfiSystemTa
kHandoverHeader->f_FirmwareVendorLen = Boot::BStrLen(sys_table->FirmwareVendor);
- Boot::BootFileReader reader_kernel(L"ne_kernel", image_handle);
+ Boot::BootFileReader reader_kernel(L"neoskrnl.exe", image_handle);
reader_kernel.ReadAll(0);
diff --git a/src/boot/src/HEL/ARM64/BootPlatform.cpp b/src/boot/src/HEL/ARM64/BootPlatform.cpp
index 142ea621..238401fd 100644
--- a/src/boot/src/HEL/ARM64/BootPlatform.cpp
+++ b/src/boot/src/HEL/ARM64/BootPlatform.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/Platform.h>
#include <BootKit/Protocol.h>
@@ -12,7 +11,9 @@
using namespace Boot;
-EXTERN_C void rt_halt() { while (Yes); }
+EXTERN_C void rt_halt() {
+ while (Yes);
+}
EXTERN_C void rt_cli() {}
diff --git a/src/boot/src/New+Delete.cpp b/src/boot/src/New+Delete.cpp
index 4d7592be..f3f3d753 100644
--- a/src/boot/src/New+Delete.cpp
+++ b/src/boot/src/New+Delete.cpp
@@ -3,7 +3,6 @@
// Licensed under the Apache License, Version 2.0 (see LICENSE file)
// Official repository: https://github.com/ne-foss-org/nekernel
-
#include <BootKit/BootKit.h>
#include <BootKit/Platform.h>
#include <BootKit/Protocol.h>
@@ -16,7 +15,7 @@
/// @return
void* operator new(size_t sz) {
if (sz == 0) ++sz;
-
+
void* buf = nullptr;
while (BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf) != kEfiOk);
@@ -29,7 +28,7 @@ void* operator new(size_t sz) {
/// @return
void* operator new[](size_t sz) {
if (sz == 0) ++sz;
-
+
void* buf = nullptr;
BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf);
@@ -38,7 +37,7 @@ void* operator new[](size_t sz) {
/// @brief Deletes the object.
/// @param buf the object.
-void operator delete(void* buf) {
+void operator delete(void* buf) noexcept {
if (!buf) return;
BS->FreePool(buf);
@@ -46,7 +45,7 @@ void operator delete(void* buf) {
/// @brief Deletes the object.
/// @param buf the object.
-void operator delete[](void* buf) {
+void operator delete[](void* buf) noexcept {
if (!buf) return;
BS->FreePool(buf);
@@ -55,7 +54,7 @@ void operator delete[](void* buf) {
/// @brief Deletes the object (array specific).
/// @param buf the object.
/// @param size it's size.
-void operator delete(void* buf, size_t size) {
+void operator delete(void* buf, size_t size) noexcept {
if (!buf) return;
SetMem(buf, 0, size);
@@ -65,7 +64,7 @@ void operator delete(void* buf, size_t size) {
/// @brief Deletes the object (array specific).
/// @param buf the object.
/// @param size it's size.
-void operator delete[](void* buf, size_t size) {
+void operator delete[](void* buf, size_t size) noexcept {
if (!buf) return;
SetMem(buf, 0, size);
diff --git a/src/boot/src/boot_rsrc.rsrc b/src/boot/src/boot_rsrc.rsrc
index e875fa24..2c4e469f 100644
--- a/src/boot/src/boot_rsrc.rsrc
+++ b/src/boot/src/boot_rsrc.rsrc
@@ -12,8 +12,8 @@ BEGIN
VALUE "FileDescription", "NeKernel OS Loader."
VALUE "FileVersion", BOOTLOADER_VERSION
VALUE "InternalName", "bootz"
- VALUE "LegalCopyright", "Copyright (C) 2024-2025, Amlal El Mahrouss licensed under the Apache 2.0 license."
- VALUE "OriginalFilename", "ne_bootz"
+ VALUE "LegalCopyright", "Copyright (C) 2024-2026, Amlal El Mahrouss licensed under the Apache 2.0 license."
+ VALUE "OriginalFilename", "bootzldr.exe"
VALUE "ProductName", "bootz"
VALUE "ProductVersion", BOOTLOADER_VERSION
END