*Added support for NEW Hermes cIOS (It still might have some bugs so please report them to me)

NOTE: When you change Global cIOS boot you need to restart for it to take effect.

NOTE2: Best way of launching games (most compatibility) is avoiding an IOS Reload by not initializing the network and not have different boot IOS than the one set in GameSettings.

NOTE3: Know issue: IOS249 boots slower now at the starts. IOS222 boots fast as always.
This commit is contained in:
dimok321 2009-06-11 23:02:05 +00:00
parent 1b4d69bd6e
commit bc3d173ef4
21 changed files with 1870 additions and 339 deletions

File diff suppressed because one or more lines are too long

View File

@ -19,6 +19,7 @@
#include "updater.h"
#include "http.h"
#include "partition.h"
#include "usbstorage.h"
#include "getentries.h"
/*** Variables that are also used extern ***/
@ -1489,9 +1490,9 @@ DiscWait(const char *title, const char *msg, const char *btn1Label, const char *
timerTxt.SetTextf("%u %s", i,LANGUAGE.secondsleft);
VIDEO_WaitVSync();
if(Settings.cios == ios222) {
ret = IOS_ReloadIOS(222);
ret = Sys_IosReload(222);
} else {
ret = IOS_ReloadIOS(249);
ret = Sys_IosReload(249);
}
sleep(1);
ret = WBFS_Init(WBFS_DEVICE_USB);
@ -1878,10 +1879,12 @@ ProgressWindow(const char *title, const char *msg)
s32 ret;
__Disc_SetLowMem();
USBStorage_Watchdog(0);
ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, ShowProgress, ONLY_GAME_PARTITION, 0);
USBStorage_Watchdog(1);
HaltGui();
mainWindow->Remove(&promptWindow);
mainWindow->SetState(STATE_DEFAULT);

140
source/dip_plugin.c Normal file
View File

@ -0,0 +1,140 @@
#define size_dip_plugin 3700
unsigned char dip_plugin[3700] __attribute__((aligned (32)))={
19, 119, 230, 81, 18, 52, 0, 1, 32, 34, 205, 172, 32, 32, 13, 57, 32, 32, 8, 197, 32, 32, 8, 153, 32, 32, 91, 129, 32,
32, 0, 73, 32, 32, 40, 117, 32, 32, 54, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
19, 119, 235, 77, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 71, 120, 234, 0, 2, 143, 70, 192, 71,
120, 234, 0, 2, 159, 70, 192, 71, 120, 234, 0, 2, 175, 70, 192, 71, 120, 234, 0, 2, 167, 70, 192, 71, 120, 234, 0, 2,
141, 70, 192, 71, 120, 234, 0, 2, 127, 70, 192, 71, 120, 234, 0, 2, 165, 70, 192, 71, 120, 234, 0, 2, 161, 70, 192,
71, 120, 234, 0, 2, 167, 70, 192, 71, 120, 234, 0, 2, 167, 181, 0, 75, 7, 176, 137, 147, 0, 70, 104, 35, 0, 33, 0, 34,
0, 147, 1, 147, 2, 240, 0, 253, 93, 176, 9, 188, 2, 71, 8, 70, 192, 227, 0, 0, 0, 181, 16, 28, 3, 34, 32, 28, 12, 72,
13, 28, 25, 247, 255, 255, 206, 33, 32, 72, 11, 247, 255, 255, 198, 73, 10, 34, 1, 104, 11, 66, 19, 209, 253, 34, 32,
28, 32, 73, 6, 247, 255, 255, 192, 28, 32, 33, 32, 247, 255, 255, 184, 75, 4, 104, 24, 188, 16, 188, 2, 71, 8, 70, 192,
13, 0, 96, 0, 13, 0, 96, 28, 13, 0, 96, 32, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 10, 203, 70, 154, 75,
20, 176, 137, 37, 0, 28, 7, 28, 14, 70, 145, 70, 108, 70, 155, 70, 168, 70, 91, 96, 35, 70, 67, 96, 99, 96, 163, 70,
83, 96, 227, 28, 56, 70, 75, 28, 49, 97, 35, 247, 255, 255, 158, 70, 104, 28, 57, 28, 50, 240, 0, 253, 14, 53, 1, 40,
0, 209, 8, 176, 9, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 45, 15, 217, 223, 231, 243,
208, 0, 0, 0, 181, 112, 176, 136, 75, 8, 28, 6, 28, 13, 70, 108, 147, 0, 96, 97, 146, 2, 247, 255, 255, 125, 28, 49,
28, 42, 70, 104, 240, 0, 252, 237, 176, 8, 188, 112, 188, 2, 71, 8, 168, 0, 0, 0, 181, 240, 70, 95, 70, 86, 70, 77,
70, 68, 180, 240, 176, 143, 144, 4, 145, 3, 146, 2, 41, 0, 209, 0, 224, 126, 10, 82, 70, 145, 35, 128, 34, 0, 1, 27,
70, 147, 34, 255, 147, 1, 3, 210, 171, 6, 146, 0, 70, 152, 224, 7, 154, 3, 68, 179, 69, 90, 217, 62, 154, 5, 24, 179,
10, 219, 68, 153, 154, 3, 70, 91, 26, 214, 70, 74, 2, 83, 154, 2, 66, 154, 216, 87, 35, 0, 147, 5, 36, 0, 159, 4, 34,
128, 68, 95, 28, 56, 28, 49, 1, 18, 240, 0, 248, 103, 44, 0, 209, 47, 40, 0, 208, 45, 155, 0, 28, 6, 66, 152, 217, 1,
38, 255, 3, 246, 10, 242, 70, 146, 36, 0, 75, 43, 70, 66, 96, 19, 35, 0, 96, 83, 96, 147, 70, 83, 96, 211, 70, 75, 97,
19, 28, 56, 28, 49, 247, 255, 255, 34, 70, 64, 28, 57, 28, 50, 240, 0, 252, 146, 52, 1, 28, 5, 40, 0, 208, 192, 44,
15, 217, 230, 45, 0, 208, 188, 176, 15, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8,
154, 5, 25, 147, 154, 1, 66, 147, 217, 1, 155, 5, 26, 214, 32, 128, 1, 0, 33, 32, 247, 255, 254, 247, 28, 4, 40, 0,
208, 18, 33, 128, 1, 9, 70, 74, 247, 255, 255, 59, 28, 5, 40, 0, 208, 15, 28, 32, 247, 255, 254, 213, 231, 216, 26,
211, 0, 155, 28, 28, 147, 5, 30, 99, 65, 156, 231, 163, 37, 1, 66, 109, 231, 208, 37, 0, 231, 206, 154, 5, 28, 56, 24,
161, 28, 50, 247, 255, 254, 210, 28, 56, 28, 49, 247, 255, 254, 202, 231, 228, 70, 192, 208, 0, 0, 0, 181, 48, 28, 13,
28, 20, 6, 195, 209, 18, 75, 15, 66, 152, 217, 19, 33, 0, 75, 14, 24, 194, 75, 14, 66, 154, 216, 1, 75, 13, 26, 25,
66, 161, 211, 5, 28, 8, 66, 169, 216, 10, 30, 99, 67, 152, 224, 0, 32, 0, 188, 48, 188, 2, 71, 8, 35, 192, 4, 91, 26,
25, 231, 232, 28, 40, 30, 99, 67, 152, 231, 244, 1, 127, 255, 255, 240, 0, 0, 0, 3, 97, 127, 255, 19, 97, 128, 0, 181,
240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 70, 137, 176, 129, 73, 51, 34, 4, 28, 7, 240, 0, 250, 235, 40, 0, 209,
3, 35, 128, 0, 91, 69, 153, 208, 13, 75, 47, 70, 154, 120, 27, 43, 0, 209, 81, 176, 1, 188, 60, 70, 144, 70, 153, 70,
162, 70, 171, 188, 240, 188, 1, 71, 0, 74, 40, 35, 10, 70, 146, 112, 19, 38, 243, 75, 38, 74, 39, 37, 0, 70, 152, 70,
147, 224, 2, 53, 1, 66, 181, 210, 19, 25, 124, 28, 32, 70, 65, 34, 13, 240, 0, 250, 195, 40, 0, 209, 244, 70, 89, 34,
13, 28, 32, 247, 255, 254, 98, 53, 1, 28, 32, 33, 13, 247, 255, 254, 89, 66, 181, 211, 235, 34, 12, 66, 82, 68, 74,
70, 144, 42, 0, 208, 27, 75, 23, 37, 0, 78, 23, 70, 153, 224, 2, 53, 1, 69, 69, 210, 19, 25, 124, 28, 32, 28, 49, 34,
12, 240, 0, 250, 161, 40, 0, 209, 244, 70, 73, 34, 12, 28, 32, 247, 255, 254, 64, 53, 1, 28, 32, 33, 12, 247, 255, 254,
55, 69, 69, 211, 235, 70, 82, 120, 19, 59, 1, 112, 19, 231, 173, 70, 78, 62, 13, 46, 0, 209, 183, 231, 211, 70, 192,
19, 119, 235, 176, 19, 119, 238, 128, 19, 119, 235, 217, 19, 119, 235, 204, 19, 119, 235, 180, 19, 119, 235, 192, 181,
48, 28, 4, 72, 15, 28, 13, 104, 131, 104, 193, 176, 129, 24, 91, 24, 154, 105, 3, 43, 0, 209, 15, 104, 67, 43, 0, 209,
7, 28, 32, 28, 41, 247, 255, 254, 147, 176, 1, 188, 48, 188, 2, 71, 8, 28, 32, 28, 41, 247, 255, 254, 161, 231, 246,
28, 32, 28, 41, 240, 0, 250, 118, 231, 241, 70, 192, 19, 119, 238, 132, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180,
240, 176, 129, 28, 4, 70, 139, 72, 48, 33, 1, 70, 145, 247, 255, 253, 248, 70, 130, 40, 0, 219, 74, 120, 35, 43, 0,
208, 80, 77, 43, 34, 0, 84, 171, 52, 1, 120, 35, 50, 1, 43, 0, 209, 249, 28, 87, 35, 10, 70, 72, 84, 171, 40, 0, 221,
45, 35, 15, 38, 0, 70, 152, 224, 24, 28, 122, 28, 81, 28, 59, 28, 79, 32, 48, 84, 232, 70, 88, 93, 131, 70, 64, 64,
3, 51, 48, 84, 171, 43, 57, 217, 1, 51, 7, 84, 171, 70, 67, 64, 51, 43, 15, 208, 16, 35, 32, 54, 1, 84, 107, 69, 177,
221, 16, 47, 252, 221, 228, 28, 58, 28, 41, 70, 80, 247, 255, 253, 200, 39, 3, 35, 0, 34, 1, 33, 2, 231, 222, 35, 10,
54, 1, 84, 107, 69, 177, 220, 238, 28, 32, 28, 57, 247, 255, 253, 166, 70, 80, 28, 41, 28, 58, 247, 255, 253, 181, 70,
80, 247, 255, 253, 154, 176, 1, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 1, 71, 0, 34, 0, 39, 1,
77, 2, 231, 179, 70, 192, 19, 119, 235, 232, 19, 119, 239, 32, 181, 240, 70, 71, 180, 128, 79, 33, 28, 4, 104, 59, 70,
152, 43, 0, 209, 17, 35, 1, 96, 59, 33, 32, 247, 255, 253, 142, 104, 227, 43, 8, 208, 12, 28, 32, 240, 0, 250, 241,
70, 67, 96, 59, 188, 4, 70, 144, 188, 240, 188, 2, 71, 8, 240, 0, 250, 232, 231, 247, 28, 33, 72, 20, 49, 12, 34, 4,
247, 255, 255, 110, 34, 32, 28, 33, 72, 17, 247, 255, 255, 105, 105, 163, 104, 24, 104, 89, 247, 255, 253, 110, 105,
163, 36, 197, 104, 27, 1, 164, 28, 32, 33, 8, 104, 93, 104, 30, 247, 255, 253, 100, 75, 9, 4, 45, 64, 30, 67, 53, 28,
32, 96, 37, 33, 8, 247, 255, 253, 75, 70, 67, 96, 59, 32, 0, 231, 208, 70, 192, 19, 119, 238, 172, 19, 119, 235, 248,
19, 119, 236, 4, 0, 0, 255, 255, 181, 16, 73, 21, 28, 4, 104, 139, 104, 202, 24, 154, 105, 11, 43, 0, 209, 18, 104,
75, 43, 0, 209, 11, 33, 32, 247, 255, 253, 183, 40, 0, 219, 3, 105, 162, 75, 13, 66, 154, 208, 10, 188, 16, 188, 2,
71, 8, 33, 32, 247, 255, 253, 193, 231, 242, 33, 32, 240, 0, 249, 151, 231, 238, 75, 7, 104, 27, 104, 26, 35, 1, 112,
19, 120, 83, 43, 0, 209, 236, 247, 255, 253, 12, 231, 233, 70, 192, 19, 119, 238, 132, 93, 28, 158, 163, 19, 119, 224,
8, 181, 240, 70, 87, 70, 70, 180, 192, 28, 4, 120, 0, 176, 129, 28, 14, 28, 23, 40, 224, 208, 24, 77, 133, 35, 0, 98,
43, 28, 3, 59, 112, 43, 143, 217, 13, 28, 32, 28, 49, 28, 58, 240, 0, 250, 122, 28, 4, 176, 1, 28, 32, 188, 12, 70,
144, 70, 154, 188, 240, 188, 2, 71, 8, 74, 123, 0, 155, 88, 211, 70, 159, 77, 120, 106, 43, 43, 0, 209, 2, 105, 43,
43, 0, 208, 230, 28, 48, 33, 0, 28, 58, 240, 0, 248, 240, 106, 43, 224, 143, 104, 107, 43, 0, 209, 2, 105, 43, 43, 0,
208, 217, 36, 0, 231, 221, 35, 1, 34, 37, 84, 171, 104, 43, 43, 0, 208, 0, 224, 173, 28, 32, 28, 58, 240, 0, 250, 76,
28, 4, 34, 0, 35, 37, 84, 234, 44, 0, 209, 204, 224, 46, 104, 235, 104, 169, 70, 154, 105, 43, 70, 136, 43, 0, 209,
0, 224, 176, 32, 0, 34, 0, 70, 67, 70, 81, 67, 11, 209, 2, 42, 0, 209, 0, 224, 176, 28, 3, 30, 90, 65, 147, 96, 107,
28, 48, 28, 57, 247, 255, 255, 105, 28, 4, 231, 176, 105, 43, 43, 0, 208, 167, 35, 2, 224, 85, 104, 97, 104, 162, 40,
208, 209, 0, 224, 144, 28, 48, 247, 255, 254, 122, 28, 4, 40, 0, 209, 160, 35, 37, 92, 235, 43, 0, 209, 156, 28, 48,
28, 57, 247, 255, 253, 243, 231, 151, 35, 36, 92, 234, 42, 0, 209, 179, 105, 41, 84, 234, 35, 37, 96, 42, 96, 106, 96,
170, 96, 234, 98, 42, 84, 234, 70, 136, 41, 0, 209, 0, 231, 128, 105, 108, 247, 255, 252, 148, 70, 64, 28, 41, 28, 34,
56, 1, 49, 24, 240, 0, 249, 19, 28, 4, 231, 122, 104, 107, 43, 0, 208, 93, 75, 60, 36, 160, 98, 43, 2, 36, 231, 114,
104, 107, 43, 0, 209, 3, 105, 43, 43, 0, 209, 0, 231, 101, 104, 99, 104, 162, 7, 155, 67, 19, 74, 53, 36, 0, 64, 19,
96, 235, 231, 98, 104, 99, 72, 51, 64, 24, 247, 255, 252, 128, 28, 4, 231, 91, 104, 98, 35, 36, 84, 234, 36, 0, 231,
86, 105, 43, 96, 51, 28, 48, 28, 57, 247, 255, 252, 69, 36, 0, 231, 78, 104, 99, 97, 43, 43, 0, 209, 40, 105, 99, 36,
0, 97, 107, 231, 70, 104, 43, 231, 238, 104, 99, 36, 0, 96, 43, 231, 64, 104, 171, 231, 232, 104, 99, 36, 0, 96, 171,
231, 58, 104, 107, 43, 0, 209, 3, 105, 43, 43, 0, 209, 0, 231, 45, 28, 48, 33, 0, 28, 58, 240, 0, 248, 55, 28, 48, 28,
57, 247, 255, 252, 31, 36, 0, 231, 40, 104, 97, 104, 162, 28, 48, 247, 255, 253, 250, 28, 4, 231, 79, 28, 40, 28, 33,
49, 8, 34, 6, 48, 24, 247, 255, 252, 19, 231, 206, 105, 43, 43, 0, 209, 158, 231, 15, 2, 201, 2, 82, 231, 107, 28, 58,
28, 32, 28, 49, 240, 0, 249, 135, 28, 2, 30, 83, 65, 154, 231, 71, 105, 43, 43, 0, 208, 0, 231, 74, 96, 106, 36, 0,
231, 2, 70, 192, 19, 119, 238, 132, 19, 119, 236, 12, 0, 5, 49, 0, 255, 255, 128, 0, 127, 255, 255, 255, 181, 240, 70,
87, 70, 78, 70, 69, 180, 224, 70, 128, 28, 14, 70, 148, 42, 0, 208, 51, 33, 3, 28, 2, 64, 10, 35, 4, 26, 155, 28, 24,
64, 8, 69, 96, 216, 49, 40, 0, 208, 49, 36, 0, 70, 67, 85, 30, 52, 1, 66, 160, 216, 250, 69, 132, 208, 32, 70, 99, 26,
27, 8, 159, 70, 153, 0, 187, 70, 154, 43, 0, 208, 17, 4, 51, 6, 50, 2, 49, 67, 26, 67, 10, 28, 21, 70, 67, 67, 53, 24,
26, 33, 0, 0, 139, 49, 1, 80, 213, 66, 185, 211, 250, 68, 84, 69, 209, 208, 6, 70, 67, 25, 24, 52, 1, 112, 6, 48, 1,
69, 164, 216, 250, 188, 28, 70, 144, 70, 153, 70, 162, 188, 240, 188, 1, 71, 0, 70, 96, 231, 203, 36, 0, 231, 211, 70,
192, 181, 48, 28, 5, 28, 12, 28, 16, 42, 0, 208, 12, 120, 42, 120, 11, 66, 154, 209, 12, 33, 0, 224, 3, 92, 106, 92,
99, 66, 154, 209, 6, 49, 1, 66, 136, 216, 248, 32, 0, 188, 48, 188, 2, 71, 8, 32, 1, 66, 64, 231, 249, 181, 112, 76,
17, 28, 6, 104, 32, 176, 130, 28, 13, 98, 2, 97, 6, 100, 1, 97, 65, 33, 68, 247, 255, 251, 123, 28, 48, 28, 41, 247,
255, 251, 119, 75, 10, 34, 2, 104, 24, 104, 35, 73, 9, 147, 0, 35, 1, 247, 255, 251, 134, 28, 41, 28, 4, 28, 48, 247,
255, 251, 121, 176, 2, 28, 32, 188, 112, 188, 2, 71, 8, 19, 119, 238, 176, 19, 119, 238, 180, 87, 70, 83, 2, 181, 240,
176, 133, 28, 4, 28, 15, 146, 3, 40, 1, 217, 5, 32, 1, 66, 64, 176, 5, 188, 240, 188, 2, 71, 8, 77, 38, 104, 43, 43,
0, 208, 65, 78, 37, 104, 48, 40, 0, 219, 1, 247, 255, 251, 67, 75, 35, 0, 162, 88, 208, 33, 1, 247, 255, 251, 77, 96,
48, 40, 0, 219, 232, 104, 40, 28, 57, 34, 6, 48, 32, 247, 255, 251, 60, 104, 40, 169, 3, 34, 4, 48, 64, 247, 255, 251,
54, 104, 42, 36, 4, 28, 19, 51, 32, 96, 19, 104, 42, 35, 6, 96, 83, 104, 42, 33, 68, 28, 19, 51, 64, 96, 147, 104, 43,
96, 220, 104, 40, 247, 255, 251, 32, 104, 43, 104, 48, 34, 2, 147, 0, 73, 14, 35, 0, 247, 255, 251, 48, 104, 42, 28,
19, 51, 32, 96, 19, 104, 43, 96, 92, 104, 42, 28, 19, 51, 64, 96, 147, 104, 43, 96, 220, 231, 181, 75, 7, 78, 3, 96,
43, 35, 1, 66, 91, 96, 51, 231, 188, 19, 119, 238, 176, 19, 119, 238, 180, 19, 119, 238, 108, 87, 70, 83, 1, 19, 119,
238, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 45, 64, 128, 229, 159, 112, 248, 229, 151, 112, 0, 235, 0, 0, 45,
232, 189, 64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 228, 229, 151, 112, 0, 235, 0, 0, 39, 232, 189,
64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 208, 229, 151, 112, 0, 235, 0, 0, 33, 232, 189, 64, 128,
225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 188, 229, 151, 112, 0, 235, 0, 0, 27, 232, 189, 64, 128, 225, 47,
255, 30, 233, 45, 64, 128, 229, 159, 112, 168, 229, 151, 112, 0, 235, 0, 0, 21, 232, 189, 64, 128, 225, 47, 255, 30,
233, 45, 64, 128, 229, 159, 112, 148, 229, 151, 112, 0, 235, 0, 0, 15, 232, 189, 64, 128, 225, 47, 255, 30, 230, 0,
8, 16, 225, 47, 255, 30, 230, 0, 7, 240, 225, 47, 255, 30, 230, 0, 3, 144, 225, 47, 255, 30, 230, 0, 3, 176, 225, 47,
255, 30, 230, 0, 3, 208, 225, 47, 255, 30, 230, 0, 3, 240, 225, 47, 255, 30, 230, 0, 4, 80, 225, 47, 255, 30, 225, 47,
255, 23, 180, 124, 181, 0, 247, 255, 252, 254, 188, 2, 188, 124, 71, 8, 181, 112, 176, 136, 104, 133, 28, 1, 75, 14,
71, 24, 70, 192, 70, 114, 28, 1, 32, 4, 223, 171, 71, 16, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 75, 8,
104, 27, 71, 24, 19, 119, 224, 16, 19, 119, 224, 20, 19, 119, 224, 24, 19, 119, 224, 28, 19, 119, 224, 32, 19, 119,
224, 36, 32, 16, 0, 213, 19, 119, 224, 12, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 0, 0, 1, 0, 44, 0,
0, 0, 72, 0, 2, 20, 60, 96, 128, 0, 44, 0, 0, 0, 64, 130, 2, 20, 60, 96, 128, 0, 4, 56, 96, 0, 1, 72, 0, 2, 68, 56,
97, 0, 24, 12, 56, 96, 0, 1, 72, 0, 2, 68, 56, 97, 0, 24, 0, 0, 47, 100, 101, 118, 47, 102, 97, 116, 47, 108, 111, 103,
0, 0, 0, 0, 69, 83, 95, 105, 111, 99, 116, 108, 118, 0, 0, 0, 100, 117, 109, 112, 0, 0, 0, 0, 19, 119, 230, 232, 19,
119, 230, 196, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119,
230, 116, 19, 119, 230, 116, 19, 119, 230, 186, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 30, 19, 119, 230, 116, 19,
119, 231, 80, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 40, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119,
230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
119, 230, 116, 19, 119, 231, 138, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 40, 19, 119,
230, 116, 19, 119, 230, 116, 19, 119, 230, 180, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119,
230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
19, 119, 230, 116, 19, 119, 231, 40, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 154, 19, 119, 230, 116, 19, 119,
230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 154, 19, 119, 230,
116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 232, 10, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116,
19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19,
119, 230, 116, 19, 119, 230, 116, 19, 119, 232, 2, 19, 119, 231, 254, 19, 119, 231, 246, 19, 119, 231, 242, 19, 119,
231, 226, 19, 119, 231, 210, 19, 119, 231, 200, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230,
116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 230, 116, 19, 119, 231, 186, 47, 100, 101, 118,
47, 117, 115, 98, 47, 101, 104, 99, 0, 0, 0, 0, 47, 100, 101, 118, 47, 115, 100, 105, 111, 47, 115, 100, 104, 99, 0,
0, 19, 119, 238, 76, 19, 119, 238, 92
};

3
source/dip_plugin.h Normal file
View File

@ -0,0 +1,3 @@
#define size_dip_plugin 3700
extern unsigned char dip_plugin[3700];

View File

@ -31,7 +31,10 @@ void __Disc_SetLowMem(void)
*(vu32 *)0x800000EC = 0x81800000;
*(vu32 *)0x800000F4 = 0x817E5480;
*(vu32 *)0x800000F8 = 0x0E7BE2C0;
*(vu32 *)0x800000FC = 0x2B73A840;
*(vu32 *)0x800000FC = 0x2B73A840;
/** online check **/
memcpy((u32*) 0x80003180, (u32*) 0x80000000, 4);
/* Copy disc ID */
memcpy((void *)0x80003180, (void *)0x80000000, 4);

661
source/ehcmodule.c Normal file
View File

@ -0,0 +1,661 @@
#define size_ehcmodule 18412
unsigned char ehcmodule[18412] __attribute__((aligned (32)))={
127, 69, 76, 70, 1, 2, 1, 97, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 40, 0, 0, 0, 1, 19, 112, 0, 0, 0, 0, 0, 52, 0, 0, 0,
0, 0, 0, 6, 6, 0, 52, 0, 32, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160,
0, 0, 0, 160, 0, 240, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 212, 0, 0, 0, 160, 0, 0, 0, 160, 0, 0, 0, 52, 0, 0, 0,
52, 0, 240, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 212, 0, 240, 0,
0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 0, 1, 8, 19, 112, 0, 0, 19, 112, 0, 0, 0, 0, 69, 156, 0, 0, 69, 156, 0, 0, 0, 5, 0, 0,
0, 4, 0, 0, 0, 1, 0, 0, 70, 164, 19, 112, 128, 0, 19, 112, 128, 0, 0, 0, 1, 72, 0, 2, 11, 56, 0, 0, 0, 6, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 4, 0, 0, 0, 9, 19, 112, 0, 0, 0, 0, 0, 125, 0, 0, 0, 72,
0, 0, 0, 126, 0, 0, 64, 0, 0, 0, 0, 127, 19, 114, 139, 56, 227, 160, 0, 0, 227, 160, 16, 0, 229, 159, 48, 0, 225, 47,
255, 19, 19, 112, 8, 13, 225, 160, 0, 0, 225, 160, 0, 0, 225, 160, 0, 0, 70, 192, 71, 120, 234, 0, 16, 74, 70, 192,
71, 120, 234, 0, 16, 118, 70, 192, 71, 120, 234, 0, 16, 94, 70, 192, 71, 120, 234, 0, 16, 78, 70, 192, 71, 120, 234,
0, 16, 106, 70, 192, 71, 120, 234, 0, 16, 58, 70, 192, 71, 120, 234, 0, 16, 38, 70, 192, 71, 120, 234, 0, 16, 78, 70,
192, 71, 120, 234, 0, 16, 62, 70, 192, 71, 120, 234, 0, 16, 100, 70, 192, 71, 120, 234, 0, 16, 62, 70, 192, 71, 120,
234, 0, 16, 66, 70, 192, 71, 120, 234, 0, 16, 62, 70, 192, 71, 120, 234, 0, 16, 28, 70, 192, 71, 120, 234, 0, 16, 38,
70, 192, 71, 120, 234, 0, 16, 34, 70, 192, 71, 120, 234, 0, 16, 26, 181, 240, 28, 15, 120, 1, 28, 6, 28, 10, 58, 48,
6, 19, 14, 27, 36, 0, 28, 69, 43, 9, 216, 11, 1, 35, 28, 28, 67, 20, 28, 40, 120, 1, 28, 69, 28, 10, 58, 48, 6, 19,
14, 27, 43, 9, 217, 243, 28, 11, 59, 97, 6, 27, 14, 27, 43, 5, 216, 6, 1, 34, 28, 11, 59, 87, 28, 20, 67, 28, 28, 40,
231, 234, 28, 11, 59, 65, 6, 27, 14, 27, 43, 5, 217, 6, 28, 115, 66, 157, 208, 10, 96, 60, 188, 240, 188, 2, 71, 8,
1, 34, 28, 11, 59, 55, 28, 20, 67, 28, 28, 40, 231, 214, 32, 0, 231, 243, 70, 192, 181, 240, 70, 71, 180, 128, 28, 13,
28, 6, 240, 4, 250, 7, 70, 128, 70, 65, 28, 48, 247, 255, 255, 120, 45, 0, 208, 33, 28, 40, 240, 4, 249, 253, 28, 7,
28, 57, 28, 40, 247, 255, 255, 110, 72, 13, 33, 1, 247, 255, 255, 150, 28, 4, 40, 0, 219, 13, 28, 49, 70, 66, 247, 255,
255, 123, 45, 0, 208, 4, 28, 32, 28, 41, 28, 58, 247, 255, 255, 116, 28, 32, 247, 255, 255, 129, 188, 4, 70, 144, 188,
240, 188, 1, 71, 0, 39, 0, 231, 227, 19, 112, 128, 36, 181, 0, 75, 4, 176, 129, 28, 1, 104, 24, 247, 255, 255, 109,
176, 1, 188, 1, 71, 0, 19, 112, 128, 24, 181, 0, 75, 9, 28, 1, 176, 129, 104, 24, 247, 255, 255, 89, 40, 0, 208, 2,
176, 1, 188, 2, 71, 8, 72, 4, 33, 0, 247, 255, 255, 176, 32, 100, 240, 0, 251, 131, 231, 251, 19, 112, 128, 24, 19,
112, 128, 52, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 149, 72, 198, 33, 0, 247, 255, 255, 157, 75,
197, 33, 64, 104, 24, 247, 255, 255, 56, 33, 16, 247, 255, 255, 45, 70, 129, 72, 193, 70, 73, 144, 6, 247, 255, 255,
27, 72, 192, 70, 74, 75, 192, 28, 1, 247, 255, 255, 69, 75, 191, 76, 191, 70, 130, 72, 191, 34, 0, 146, 13, 146, 14,
146, 15, 146, 16, 146, 17, 147, 5, 148, 4, 144, 11, 74, 187, 75, 188, 76, 188, 72, 189, 146, 10, 147, 9, 148, 8, 144,
7, 34, 0, 169, 19, 70, 72, 247, 255, 255, 47, 70, 80, 247, 255, 255, 0, 156, 19, 74, 183, 66, 148, 208, 243, 75, 173,
66, 156, 209, 0, 224, 230, 120, 35, 120, 98, 6, 27, 4, 18, 67, 26, 120, 163, 2, 27, 67, 19, 120, 226, 67, 26, 42, 2,
209, 0, 224, 198, 42, 2, 216, 17, 42, 1, 209, 0, 224, 154, 39, 1, 66, 127, 38, 1, 154, 5, 104, 19, 43, 0, 208, 0, 224,
141, 46, 0, 208, 211, 152, 19, 28, 57, 247, 255, 254, 212, 231, 206, 42, 6, 209, 0, 224, 172, 42, 7, 209, 235, 126,
35, 126, 98, 6, 27, 4, 18, 67, 26, 126, 163, 2, 27, 67, 19, 126, 226, 67, 26, 70, 147, 124, 35, 124, 98, 6, 27, 4, 18,
67, 26, 124, 163, 2, 27, 67, 19, 124, 226, 67, 26, 146, 12, 125, 35, 125, 98, 6, 27, 4, 18, 67, 26, 125, 163, 2, 27,
67, 19, 125, 226, 28, 21, 67, 29, 123, 35, 43, 0, 208, 0, 224, 196, 154, 15, 42, 0, 208, 0, 224, 192, 122, 35, 122,
98, 6, 27, 4, 18, 67, 26, 122, 163, 122, 224, 2, 27, 67, 19, 67, 24, 240, 0, 251, 73, 28, 6, 155, 12, 70, 88, 25, 91,
70, 152, 0, 217, 70, 68, 247, 255, 254, 164, 44, 0, 221, 9, 70, 92, 37, 0, 104, 32, 104, 97, 53, 1, 247, 255, 254, 155,
52, 8, 69, 168, 220, 247, 153, 19, 72, 124, 123, 11, 123, 74, 6, 27, 4, 18, 67, 26, 123, 139, 2, 27, 67, 19, 123, 202,
67, 26, 66, 130, 209, 0, 225, 172, 66, 130, 217, 0, 224, 157, 42, 6, 217, 0, 224, 187, 42, 5, 211, 0, 225, 41, 42, 1,
209, 0, 225, 207, 42, 0, 209, 0, 225, 117, 42, 2, 209, 0, 225, 32, 39, 1, 38, 1, 154, 12, 69, 66, 219, 0, 231, 125,
0, 211, 70, 88, 24, 196, 28, 21, 104, 32, 104, 97, 53, 1, 247, 255, 254, 72, 52, 8, 69, 168, 220, 247, 154, 5, 104,
19, 43, 0, 209, 0, 231, 113, 70, 80, 73, 86, 247, 255, 254, 112, 231, 108, 123, 35, 123, 98, 6, 27, 4, 18, 67, 26, 123,
163, 153, 6, 2, 27, 67, 19, 123, 226, 28, 21, 67, 29, 28, 40, 240, 4, 248, 136, 40, 0, 209, 90, 125, 35, 125, 98, 6,
27, 4, 18, 67, 26, 125, 163, 2, 27, 67, 19, 125, 226, 156, 16, 28, 23, 67, 31, 44, 0, 209, 0, 224, 217, 32, 1, 144,
16, 38, 1, 231, 67, 39, 1, 38, 1, 231, 64, 122, 35, 122, 98, 6, 27, 4, 18, 67, 26, 122, 163, 2, 27, 67, 19, 122, 226,
156, 15, 28, 16, 67, 24, 66, 132, 209, 47, 32, 0, 144, 15, 39, 0, 38, 1, 231, 45, 156, 14, 44, 0, 209, 0, 231, 4, 152,
5, 104, 3, 43, 0, 209, 0, 230, 255, 168, 18, 240, 0, 251, 37, 154, 18, 75, 59, 28, 4, 66, 154, 221, 0, 230, 246, 154,
4, 33, 1, 152, 13, 240, 2, 254, 14, 73, 43, 70, 80, 247, 255, 254, 26, 32, 128, 4, 64, 153, 18, 240, 3, 255, 33, 154,
13, 24, 18, 146, 13, 66, 148, 219, 0, 230, 226, 35, 0, 147, 13, 230, 223, 38, 0, 231, 73, 240, 0, 250, 144, 240, 0,
250, 134, 39, 0, 38, 1, 230, 251, 155, 15, 43, 0, 208, 83, 39, 6, 66, 127, 38, 1, 230, 244, 75, 38, 66, 154, 209, 0,
224, 136, 66, 154, 217, 0, 224, 141, 59, 3, 66, 154, 209, 0, 224, 198, 66, 154, 210, 0, 225, 37, 51, 1, 66, 154, 209,
0, 225, 21, 51, 1, 66, 154, 208, 0, 231, 90, 70, 92, 104, 35, 105, 34, 104, 24, 104, 163, 38, 1, 104, 25, 240, 1, 253,
159, 28, 7, 231, 81, 42, 12, 209, 0, 224, 184, 42, 12, 210, 0, 231, 73, 28, 19, 59, 26, 43, 1, 217, 0, 231, 68, 39,
1, 38, 0, 231, 67, 70, 192, 19, 112, 128, 76, 19, 112, 128, 24, 19, 112, 128, 92, 0, 152, 150, 128, 0, 0, 6, 102, 19,
112, 128, 12, 19, 112, 129, 128, 19, 112, 128, 108, 19, 112, 128, 124, 19, 112, 129, 72, 19, 112, 128, 136, 19, 112,
128, 148, 0, 0, 5, 85, 85, 77, 83, 1, 0, 0, 7, 255, 85, 77, 83, 6, 28, 40, 153, 11, 34, 13, 240, 3, 255, 7, 40, 0, 209,
164, 125, 35, 125, 98, 6, 27, 4, 18, 67, 26, 28, 47, 125, 163, 55, 13, 28, 57, 2, 27, 67, 19, 125, 226, 120, 12, 28,
22, 28, 34, 58, 48, 67, 30, 6, 19, 14, 27, 37, 0, 28, 72, 43, 9, 216, 11, 1, 43, 28, 29, 67, 21, 28, 1, 120, 12, 28,
72, 28, 34, 58, 48, 6, 19, 14, 27, 43, 9, 217, 243, 28, 35, 59, 97, 6, 27, 14, 27, 43, 5, 216, 40, 1, 42, 28, 35, 59,
87, 28, 21, 67, 29, 28, 1, 231, 234, 240, 1, 249, 209, 34, 1, 146, 16, 38, 1, 230, 103, 152, 9, 104, 3, 66, 90, 65,
83, 96, 3, 39, 0, 38, 1, 230, 221, 76, 143, 66, 162, 208, 51, 66, 162, 217, 0, 224, 180, 75, 141, 66, 154, 208, 0, 230,
209, 156, 5, 35, 0, 96, 35, 240, 0, 251, 92, 32, 0, 144, 14, 39, 0, 38, 1, 230, 201, 28, 35, 59, 65, 6, 27, 14, 27,
43, 5, 216, 0, 224, 152, 28, 123, 66, 152, 209, 0, 231, 71, 41, 0, 209, 0, 231, 68, 44, 47, 208, 0, 231, 65, 169, 18,
247, 255, 253, 75, 40, 0, 209, 0, 231, 59, 120, 3, 43, 0, 208, 0, 231, 55, 28, 50, 153, 18, 28, 40, 240, 0, 249, 127,
38, 1, 28, 7, 230, 40, 70, 90, 104, 19, 156, 5, 104, 27, 96, 35, 230, 158, 70, 92, 104, 35, 105, 34, 104, 24, 104, 163,
38, 1, 104, 25, 240, 2, 253, 17, 28, 7, 230, 149, 46, 0, 209, 0, 224, 198, 39, 6, 66, 127, 38, 1, 230, 142, 46, 0, 208,
249, 70, 88, 105, 3, 70, 90, 136, 24, 105, 147, 136, 28, 106, 19, 136, 29, 104, 19, 120, 25, 104, 147, 120, 26, 2, 3,
10, 0, 67, 3, 2, 32, 10, 36, 67, 32, 4, 0, 12, 0, 144, 0, 2, 40, 10, 45, 67, 40, 4, 0, 12, 0, 144, 1, 70, 92, 107, 32,
4, 27, 144, 2, 12, 27, 28, 48, 240, 0, 255, 99, 38, 1, 28, 7, 230, 102, 240, 2, 251, 6, 28, 7, 40, 0, 219, 116, 154,
5, 153, 19, 32, 1, 96, 16, 122, 11, 122, 74, 6, 27, 4, 18, 67, 26, 122, 139, 152, 10, 2, 27, 67, 19, 122, 202, 67, 26,
146, 15, 33, 0, 247, 255, 253, 32, 35, 1, 147, 14, 38, 1, 230, 74, 70, 88, 104, 3, 70, 90, 104, 24, 104, 147, 105, 18,
104, 25, 240, 2, 251, 133, 38, 1, 28, 7, 230, 62, 70, 90, 104, 16, 240, 0, 249, 192, 38, 1, 28, 7, 230, 55, 46, 0, 208,
162, 70, 88, 104, 3, 120, 25, 104, 131, 136, 26, 105, 3, 28, 48, 240, 0, 255, 18, 38, 1, 28, 7, 230, 41, 1, 42, 28,
35, 59, 55, 28, 21, 67, 29, 28, 1, 231, 33, 75, 51, 66, 154, 208, 21, 51, 1, 66, 154, 208, 0, 230, 25, 156, 17, 44,
0, 208, 63, 70, 80, 247, 255, 252, 123, 70, 88, 104, 3, 105, 2, 104, 25, 104, 131, 152, 17, 104, 27, 240, 2, 254, 112,
39, 0, 38, 1, 230, 9, 122, 11, 122, 74, 6, 27, 4, 18, 67, 26, 122, 139, 70, 88, 2, 27, 67, 19, 122, 202, 28, 20, 67,
28, 35, 0, 147, 18, 104, 195, 43, 4, 208, 38, 70, 90, 104, 16, 153, 18, 240, 2, 254, 17, 144, 17, 40, 0, 208, 27, 39,
0, 148, 15, 152, 8, 231, 154, 153, 19, 152, 7, 122, 11, 122, 74, 6, 27, 4, 18, 67, 26, 122, 139, 38, 1, 2, 27, 67, 19,
122, 202, 33, 0, 67, 26, 146, 15, 247, 255, 252, 173, 35, 0, 147, 14, 229, 216, 39, 1, 66, 127, 38, 1, 229, 212, 39,
1, 66, 127, 231, 225, 104, 129, 34, 4, 168, 18, 240, 3, 253, 226, 231, 210, 70, 90, 104, 19, 70, 92, 120, 24, 104, 147,
105, 18, 120, 25, 105, 163, 240, 0, 248, 247, 38, 1, 28, 7, 229, 190, 85, 77, 83, 128, 85, 77, 83, 16, 87, 70, 83, 1,
181, 0, 33, 128, 176, 129, 2, 73, 72, 18, 247, 255, 252, 3, 75, 18, 33, 64, 96, 24, 247, 255, 252, 30, 33, 16, 247,
255, 252, 19, 75, 15, 33, 250, 28, 2, 96, 24, 0, 137, 75, 13, 72, 14, 247, 255, 252, 46, 75, 13, 96, 24, 247, 255, 252,
2, 240, 0, 249, 64, 40, 0, 219, 5, 247, 255, 252, 192, 32, 0, 176, 1, 188, 2, 71, 8, 32, 1, 66, 64, 231, 249, 70, 192,
19, 113, 73, 128, 19, 112, 128, 24, 19, 112, 128, 16, 0, 0, 6, 102, 0, 15, 66, 64, 19, 112, 128, 20, 181, 240, 77, 17,
176, 131, 28, 4, 73, 16, 34, 0, 104, 40, 247, 255, 251, 255, 79, 15, 28, 33, 104, 56, 247, 255, 251, 254, 76, 11, 174,
1, 104, 40, 28, 49, 34, 0, 247, 255, 251, 255, 155, 1, 66, 163, 209, 247, 28, 49, 104, 40, 34, 0, 247, 255, 251, 247,
104, 56, 247, 255, 251, 200, 176, 3, 188, 240, 188, 1, 71, 0, 19, 112, 128, 16, 0, 0, 5, 85, 19, 112, 128, 20, 181,
240, 77, 19, 28, 4, 176, 131, 73, 18, 34, 0, 104, 40, 247, 255, 251, 213, 1, 97, 27, 9, 79, 16, 0, 137, 25, 9, 104,
56, 0, 201, 247, 255, 251, 208, 76, 11, 174, 1, 104, 40, 28, 49, 34, 0, 247, 255, 251, 209, 155, 1, 66, 163, 209, 247,
28, 49, 104, 40, 34, 0, 247, 255, 251, 201, 104, 56, 247, 255, 251, 154, 176, 3, 188, 240, 188, 1, 71, 0, 19, 112, 128,
16, 0, 0, 5, 85, 19, 112, 128, 20, 181, 240, 75, 24, 28, 5, 104, 31, 35, 84, 92, 252, 70, 140, 28, 22, 44, 0, 208, 32,
28, 57, 49, 96, 32, 0, 224, 3, 48, 1, 49, 40, 66, 132, 221, 24, 105, 139, 43, 0, 209, 248, 136, 10, 2, 19, 10, 18, 67,
19, 4, 27, 12, 27, 66, 171, 209, 240, 136, 74, 2, 19, 10, 18, 67, 19, 4, 27, 12, 27, 69, 99, 209, 232, 0, 131, 24, 27,
0, 219, 24, 251, 103, 158, 224, 1, 38, 6, 66, 118, 28, 48, 188, 240, 188, 2, 71, 8, 70, 192, 19, 112, 128, 28, 181,
0, 40, 0, 208, 1, 35, 0, 98, 3, 32, 0, 188, 2, 71, 8, 181, 112, 75, 16, 28, 6, 104, 28, 35, 84, 92, 229, 45, 0, 208,
18, 111, 163, 66, 179, 208, 19, 28, 33, 49, 160, 34, 0, 224, 8, 0, 147, 24, 155, 0, 219, 51, 88, 24, 224, 104, 11, 49,
40, 66, 179, 208, 3, 50, 1, 66, 170, 219, 243, 32, 0, 188, 112, 188, 2, 71, 8, 28, 32, 48, 88, 231, 249, 19, 112, 128,
28, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 70, 147, 74, 35, 28, 31, 104, 20, 35, 84, 92, 227, 70, 128,
70, 148, 43, 0, 208, 59, 40, 0, 208, 57, 37, 0, 35, 84, 38, 0, 70, 169, 70, 154, 224, 1, 69, 69, 218, 36, 0, 179, 25,
155, 0, 219, 24, 228, 111, 35, 43, 0, 208, 22, 0, 232, 28, 3, 70, 74, 51, 2, 82, 58, 52, 96, 83, 218, 136, 34, 28, 1,
4, 18, 10, 19, 14, 18, 67, 19, 49, 4, 83, 203, 136, 99, 24, 56, 4, 27, 10, 26, 14, 27, 67, 26, 128, 194, 53, 1, 70,
99, 104, 28, 70, 82, 92, 163, 54, 1, 66, 179, 220, 216, 6, 43, 14, 24, 70, 91, 112, 24, 32, 0, 188, 60, 70, 144, 70,
153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 32, 0, 231, 242, 19, 112, 128, 28, 181, 0, 75, 12, 28, 1, 120, 27, 43,
1, 208, 2, 32, 0, 188, 2, 71, 8, 40, 0, 208, 11, 74, 8, 72, 8, 120, 19, 51, 4, 0, 155, 88, 195, 96, 11, 120, 19, 51,
20, 0, 155, 88, 192, 231, 239, 72, 3, 74, 1, 231, 247, 19, 112, 129, 85, 19, 112, 129, 84, 19, 114, 73, 152, 181, 48,
76, 18, 75, 18, 176, 131, 96, 35, 240, 2, 252, 95, 40, 0, 218, 5, 32, 1, 66, 64, 176, 3, 188, 48, 188, 2, 71, 8, 72,
13, 33, 1, 247, 255, 250, 201, 28, 5, 40, 0, 219, 242, 35, 0, 73, 10, 34, 0, 147, 0, 247, 255, 250, 152, 96, 32, 28,
40, 247, 255, 250, 184, 104, 33, 34, 1, 35, 84, 84, 202, 32, 0, 231, 228, 19, 112, 128, 28, 19, 114, 74, 60, 19, 112,
128, 160, 77, 76, 68, 160, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 124, 130, 124, 199, 125, 6, 6, 19, 70,
148, 125, 68, 4, 58, 67, 26, 2, 51, 67, 19, 28, 33, 176, 129, 70, 128, 67, 25, 208, 121, 124, 67, 70, 154, 43, 0, 208,
114, 34, 0, 70, 147, 70, 145, 70, 75, 24, 205, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123,
42, 28, 16, 67, 24, 208, 82, 121, 43, 43, 0, 208, 58, 39, 0, 38, 0, 224, 10, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26,
122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 25, 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27,
67, 19, 124, 98, 28, 16, 67, 24, 208, 1, 240, 2, 251, 154, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27,
67, 19, 123, 34, 28, 16, 67, 24, 208, 1, 240, 2, 251, 140, 121, 43, 55, 1, 54, 18, 66, 187, 220, 210, 122, 107, 122,
170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 240, 2, 251, 122, 70, 66, 124, 82, 70,
67, 70, 146, 70, 66, 124, 155, 124, 215, 70, 156, 4, 58, 6, 27, 67, 26, 70, 67, 125, 30, 2, 51, 67, 19, 70, 66, 125,
84, 28, 33, 67, 25, 35, 1, 34, 13, 68, 155, 68, 145, 69, 218, 221, 8, 70, 98, 6, 19, 4, 58, 67, 26, 2, 51, 67, 19, 28,
33, 67, 25, 231, 143, 28, 8, 240, 2, 251, 85, 176, 1, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 1,
71, 0, 181, 48, 75, 15, 176, 129, 104, 25, 108, 10, 28, 19, 51, 8, 0, 155, 88, 92, 50, 1, 100, 10, 28, 32, 240, 2, 251,
60, 33, 0, 28, 5, 34, 96, 28, 32, 240, 3, 251, 218, 35, 64, 96, 163, 35, 128, 4, 91, 176, 1, 99, 101, 28, 32, 96, 35,
96, 99, 188, 48, 188, 2, 71, 8, 19, 112, 128, 28, 181, 48, 77, 16, 176, 129, 104, 43, 43, 0, 209, 3, 176, 1, 188, 48,
188, 1, 71, 0, 76, 12, 35, 160, 88, 224, 40, 0, 208, 1, 240, 2, 251, 25, 34, 164, 33, 0, 28, 32, 240, 3, 251, 182, 72,
7, 33, 0, 247, 255, 250, 42, 74, 6, 35, 0, 112, 19, 74, 6, 96, 43, 96, 19, 231, 228, 70, 192, 19, 112, 129, 80, 19,
114, 73, 152, 19, 112, 128, 172, 19, 112, 129, 85, 19, 112, 129, 76, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180,
240, 74, 204, 176, 137, 146, 3, 104, 17, 70, 129, 108, 10, 28, 19, 51, 8, 0, 155, 88, 91, 50, 1, 100, 10, 28, 24, 70,
152, 240, 2, 250, 230, 34, 96, 28, 4, 33, 0, 70, 64, 240, 3, 251, 132, 70, 67, 99, 92, 70, 66, 35, 64, 96, 147, 35,
128, 4, 91, 96, 19, 96, 83, 70, 75, 99, 211, 70, 74, 35, 0, 97, 83, 105, 19, 147, 4, 126, 82, 70, 75, 146, 6, 126, 24,
40, 0, 209, 0, 224, 176, 34, 128, 35, 192, 70, 70, 70, 147, 0, 91, 70, 74, 104, 215, 154, 6, 42, 0, 208, 0, 70, 155,
70, 75, 105, 218, 75, 176, 37, 255, 64, 19, 147, 5, 34, 255, 59, 1, 147, 2, 2, 19, 34, 128, 1, 82, 70, 154, 4, 45, 146,
1, 155, 4, 14, 58, 70, 156, 6, 59, 67, 26, 70, 83, 64, 59, 2, 27, 67, 26, 28, 59, 64, 43, 10, 27, 67, 26, 96, 242, 34,
0, 98, 50, 75, 163, 154, 1, 64, 59, 26, 208, 155, 4, 66, 131, 211, 0, 224, 213, 34, 0, 28, 28, 146, 4, 70, 91, 4, 34,
67, 26, 6, 19, 14, 17, 67, 25, 70, 83, 64, 19, 2, 27, 64, 42, 67, 25, 10, 18, 67, 17, 70, 98, 96, 177, 100, 50, 155,
6, 43, 0, 208, 4, 154, 3, 104, 19, 105, 219, 105, 91, 96, 115, 154, 2, 25, 19, 154, 5, 66, 19, 209, 1, 75, 144, 68,
155, 154, 4, 42, 0, 221, 0, 224, 230, 39, 128, 4, 127, 150, 7, 70, 74, 96, 119, 105, 19, 43, 0, 208, 65, 126, 19, 70,
154, 43, 0, 209, 61, 154, 3, 35, 128, 104, 17, 0, 91, 70, 93, 108, 10, 64, 93, 75, 131, 67, 29, 28, 19, 51, 8, 0, 155,
88, 94, 50, 1, 100, 10, 28, 48, 240, 2, 250, 83, 33, 0, 28, 4, 34, 96, 28, 48, 240, 3, 250, 241, 70, 75, 99, 243, 14,
34, 6, 35, 32, 255, 67, 26, 2, 0, 28, 35, 33, 255, 4, 9, 64, 3, 99, 116, 96, 55, 2, 27, 96, 119, 64, 12, 67, 26, 10,
36, 155, 7, 67, 34, 96, 26, 70, 82, 99, 158, 96, 242, 6, 43, 98, 50, 14, 42, 67, 26, 28, 43, 64, 3, 2, 27, 64, 13, 67,
26, 10, 45, 67, 42, 70, 83, 96, 178, 100, 51, 104, 179, 34, 128, 4, 18, 67, 19, 176, 9, 70, 64, 96, 179, 188, 60, 70,
144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 70, 75, 104, 89, 37, 255, 6, 11, 14, 10, 67, 26, 2, 45, 28,
11, 64, 43, 2, 27, 36, 255, 67, 26, 4, 36, 28, 11, 64, 35, 10, 27, 67, 26, 70, 67, 96, 218, 98, 24, 75, 85, 28, 10,
64, 26, 35, 128, 1, 91, 26, 155, 43, 8, 216, 0, 224, 132, 75, 83, 70, 66, 96, 147, 35, 8, 100, 19, 155, 3, 104, 25,
108, 10, 28, 19, 51, 8, 0, 155, 88, 94, 50, 1, 100, 10, 28, 48, 240, 2, 249, 234, 34, 96, 28, 4, 33, 0, 28, 48, 240,
3, 250, 136, 35, 64, 96, 179, 35, 128, 4, 91, 70, 74, 96, 51, 96, 115, 99, 242, 6, 35, 14, 34, 67, 26, 35, 255, 2, 27,
64, 35, 2, 27, 67, 26, 35, 255, 4, 27, 99, 116, 64, 28, 10, 36, 67, 34, 70, 67, 96, 26, 99, 158, 154, 4, 42, 0, 209,
2, 75, 58, 70, 155, 231, 0, 74, 58, 75, 56, 70, 147, 230, 252, 28, 4, 66, 163, 217, 92, 35, 128, 1, 91, 24, 250, 75,
54, 28, 17, 34, 1, 64, 25, 28, 48, 70, 148, 6, 11, 14, 10, 67, 26, 70, 83, 64, 11, 2, 27, 67, 26, 28, 11, 64, 43, 10,
27, 67, 26, 35, 0, 97, 2, 98, 67, 34, 128, 1, 82, 155, 4, 24, 164, 24, 137, 66, 163, 216, 5, 28, 28, 155, 4, 70, 164,
27, 27, 147, 4, 231, 5, 34, 1, 68, 148, 70, 99, 48, 4, 43, 4, 221, 222, 28, 32, 153, 5, 240, 3, 249, 186, 154, 4, 26,
100, 27, 18, 70, 164, 146, 4, 230, 245, 68, 103, 247, 255, 254, 61, 107, 66, 70, 75, 14, 17, 99, 195, 6, 19, 67, 25,
70, 83, 64, 19, 2, 27, 64, 42, 67, 25, 10, 18, 67, 17, 96, 49, 99, 176, 28, 6, 230, 198, 43, 8, 209, 0, 231, 119, 34,
128, 1, 82, 75, 17, 24, 137, 64, 25, 28, 10, 28, 11, 64, 42, 64, 35, 10, 27, 2, 18, 67, 26, 14, 9, 70, 67, 67, 10, 97,
26, 98, 88, 231, 101, 154, 4, 66, 162, 209, 201, 231, 189, 70, 192, 19, 112, 128, 28, 0, 0, 7, 255, 0, 0, 15, 255, 128,
0, 0, 0, 128, 2, 8, 0, 128, 0, 1, 128, 128, 0, 0, 128, 255, 255, 240, 0, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180,
240, 176, 133, 144, 3, 145, 2, 126, 11, 43, 0, 209, 0, 226, 33, 154, 2, 105, 17, 41, 0, 208, 8, 126, 83, 43, 0, 209,
0, 226, 19, 104, 144, 240, 2, 249, 130, 155, 2, 96, 216, 72, 227, 34, 0, 104, 3, 70, 129, 105, 219, 70, 154, 195, 4,
51, 4, 70, 81, 96, 74, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 195, 4, 96, 26, 152, 2, 247,
255, 254, 31, 70, 82, 100, 144, 155, 2, 158, 3, 126, 25, 105, 220, 34, 128, 105, 179, 1, 146, 67, 26, 35, 15, 64, 11,
28, 5, 2, 27, 28, 16, 67, 24, 41, 0, 208, 0, 225, 205, 75, 207, 28, 1, 67, 25, 6, 11, 14, 10, 36, 255, 2, 36, 67, 26,
28, 11, 64, 35, 2, 27, 32, 255, 4, 0, 67, 26, 28, 11, 64, 3, 10, 27, 70, 81, 67, 26, 96, 74, 108, 74, 35, 64, 96, 139,
28, 17, 28, 19, 64, 3, 64, 33, 10, 27, 2, 9, 67, 25, 14, 19, 67, 25, 35, 224, 64, 26, 35, 2, 67, 26, 6, 18, 67, 17,
70, 82, 96, 17, 107, 106, 70, 86, 6, 19, 14, 17, 67, 25, 28, 19, 64, 35, 2, 27, 64, 2, 67, 25, 10, 18, 67, 17, 70, 83,
97, 25, 35, 128, 4, 91, 97, 115, 152, 2, 126, 2, 42, 0, 208, 0, 225, 125, 70, 81, 105, 138, 75, 176, 70, 78, 64, 19,
70, 82, 97, 147, 104, 51, 70, 80, 105, 155, 108, 89, 35, 255, 2, 27, 28, 10, 64, 26, 35, 255, 4, 27, 64, 11, 10, 27,
2, 18, 67, 26, 14, 11, 67, 26, 35, 224, 64, 25, 35, 2, 67, 25, 6, 9, 67, 10, 96, 2, 33, 96, 240, 2, 248, 231, 70, 81,
108, 140, 44, 0, 208, 6, 28, 32, 33, 96, 240, 2, 248, 223, 107, 164, 44, 0, 209, 248, 70, 78, 104, 51, 70, 82, 108,
81, 105, 152, 35, 255, 2, 27, 28, 10, 64, 26, 35, 255, 4, 27, 64, 11, 10, 27, 2, 18, 67, 26, 14, 11, 67, 26, 35, 224,
64, 25, 35, 2, 67, 25, 6, 9, 67, 10, 96, 2, 104, 51, 33, 96, 105, 152, 240, 2, 248, 191, 104, 51, 152, 3, 104, 154,
75, 140, 33, 2, 104, 28, 105, 195, 29, 23, 51, 16, 0, 155, 24, 211, 51, 4, 70, 152, 70, 139, 32, 100, 247, 255, 251,
56, 70, 73, 104, 14, 70, 67, 104, 26, 104, 179, 104, 56, 29, 29, 104, 91, 33, 55, 64, 25, 75, 129, 64, 26, 42, 1, 208,
0, 225, 84, 70, 91, 66, 25, 208, 0, 225, 93, 7, 195, 213, 0, 225, 99, 60, 100, 44, 0, 220, 227, 96, 41, 70, 73, 104,
11, 104, 155, 104, 27, 75, 120, 96, 26, 34, 1, 66, 83, 70, 155, 70, 78, 104, 51, 33, 96, 105, 155, 108, 88, 240, 2,
248, 108, 70, 81, 108, 72, 33, 96, 240, 2, 248, 103, 70, 82, 108, 148, 44, 0, 208, 6, 107, 96, 33, 96, 240, 2, 248,
95, 107, 164, 44, 0, 209, 248, 70, 78, 104, 51, 105, 152, 35, 255, 108, 65, 2, 27, 28, 10, 64, 26, 35, 255, 4, 27, 64,
11, 10, 27, 2, 18, 67, 26, 14, 11, 67, 26, 35, 224, 64, 25, 35, 2, 67, 25, 6, 9, 67, 10, 96, 2, 104, 51, 33, 96, 105,
152, 240, 2, 248, 88, 104, 51, 33, 96, 105, 155, 108, 88, 240, 2, 248, 58, 152, 2, 126, 2, 42, 0, 208, 23, 153, 3, 35,
15, 106, 72, 28, 17, 64, 25, 6, 19, 43, 0, 218, 0, 224, 248, 34, 1, 28, 19, 64, 139, 28, 4, 70, 86, 67, 156, 105, 179,
9, 219, 28, 24, 64, 16, 28, 3, 64, 139, 152, 3, 67, 35, 98, 67, 70, 89, 41, 0, 209, 53, 70, 74, 104, 19, 158, 3, 104,
154, 105, 155, 28, 23, 108, 91, 55, 24, 70, 154, 105, 243, 36, 0, 51, 16, 0, 155, 24, 211, 51, 4, 70, 152, 32, 100,
247, 255, 250, 170, 70, 73, 104, 14, 70, 64, 104, 179, 104, 2, 29, 29, 104, 56, 104, 91, 33, 55, 64, 25, 75, 58, 64,
26, 42, 1, 208, 0, 224, 228, 35, 2, 66, 25, 208, 0, 224, 234, 69, 130, 209, 0, 224, 240, 52, 1, 44, 200, 209, 227, 96,
41, 70, 78, 104, 51, 104, 155, 104, 27, 75, 49, 96, 26, 32, 1, 66, 65, 70, 139, 70, 74, 104, 19, 105, 219, 108, 156,
44, 0, 208, 59, 35, 255, 72, 44, 39, 255, 4, 27, 38, 3, 33, 64, 37, 0, 2, 63, 147, 1, 70, 176, 70, 132, 70, 138, 104,
162, 70, 70, 6, 19, 14, 17, 67, 25, 28, 19, 64, 59, 2, 27, 67, 25, 155, 1, 28, 8, 64, 26, 10, 18, 67, 16, 10, 3, 64,
51, 43, 2, 208, 8, 107, 225, 108, 34, 105, 75, 70, 102, 24, 210, 12, 3, 64, 51, 26, 210, 97, 74, 108, 35, 43, 0, 209,
3, 35, 255, 64, 3, 43, 64, 208, 4, 70, 81, 66, 8, 208, 1, 37, 1, 66, 109, 107, 164, 44, 0, 209, 213, 45, 0, 208, 3,
107, 226, 35, 1, 66, 91, 97, 83, 70, 75, 104, 26, 35, 0, 100, 19, 158, 2, 105, 49, 41, 0, 208, 6, 126, 115, 43, 0, 208,
65, 104, 240, 240, 1, 255, 165, 158, 2, 126, 51, 43, 0, 208, 66, 224, 13, 19, 112, 128, 28, 64, 64, 64, 0, 1, 0, 0,
128, 19, 112, 128, 32, 0, 0, 32, 1, 19, 112, 129, 76, 0, 0, 127, 255, 70, 88, 40, 0, 209, 2, 153, 2, 105, 73, 70, 139,
176, 5, 70, 88, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 155, 3, 106, 88, 6, 19, 43, 0,
219, 54, 33, 0, 35, 15, 64, 19, 24, 203, 64, 216, 7, 198, 213, 41, 70, 80, 105, 130, 35, 128, 67, 26, 97, 130, 230,
113, 75, 50, 28, 34, 64, 26, 35, 128, 4, 18, 5, 219, 67, 26, 28, 17, 67, 1, 230, 42, 154, 2, 104, 208, 240, 1, 255,
90, 158, 2, 126, 51, 43, 0, 209, 203, 104, 112, 33, 8, 240, 1, 255, 90, 231, 198, 158, 2, 104, 176, 240, 1, 255, 101,
96, 240, 229, 234, 104, 8, 33, 8, 240, 1, 255, 103, 153, 2, 96, 72, 229, 214, 70, 81, 105, 138, 35, 128, 67, 154, 97,
138, 230, 71, 33, 16, 231, 199, 49, 16, 231, 4, 74, 28, 35, 1, 96, 19, 104, 179, 70, 78, 96, 89, 104, 51, 32, 1, 104,
155, 66, 65, 104, 27, 70, 139, 230, 177, 96, 41, 70, 78, 104, 51, 32, 2, 104, 155, 66, 65, 104, 27, 70, 139, 230, 168,
96, 41, 70, 78, 104, 51, 32, 0, 104, 155, 70, 131, 104, 27, 230, 160, 74, 13, 35, 1, 96, 19, 104, 179, 70, 78, 96, 89,
104, 51, 104, 155, 104, 27, 231, 33, 96, 41, 70, 78, 104, 51, 32, 2, 104, 155, 66, 65, 104, 27, 70, 139, 231, 27, 96,
41, 70, 74, 104, 19, 104, 155, 104, 27, 231, 21, 70, 192, 0, 0, 7, 255, 19, 112, 129, 76, 181, 48, 176, 137, 70, 109,
118, 41, 9, 201, 118, 105, 33, 128, 0, 137, 145, 7, 36, 0, 70, 105, 148, 0, 146, 4, 147, 2, 247, 255, 253, 116, 176,
9, 188, 48, 188, 2, 71, 8, 181, 240, 70, 71, 180, 128, 176, 136, 70, 128, 70, 104, 48, 58, 136, 5, 48, 4, 136, 6, 72,
40, 4, 45, 104, 4, 32, 248, 88, 32, 4, 54, 112, 66, 2, 26, 10, 27, 67, 26, 4, 18, 12, 19, 112, 195, 10, 43, 14, 45,
67, 43, 14, 18, 4, 27, 112, 130, 12, 55, 12, 26, 14, 27, 113, 3, 14, 54, 2, 59, 67, 51, 4, 27, 113, 66, 14, 26, 12,
27, 112, 1, 113, 195, 70, 108, 35, 0, 9, 201, 113, 130, 118, 35, 118, 97, 35, 64, 144, 0, 147, 7, 152, 16, 75, 20, 151,
4, 66, 152, 216, 12, 96, 160, 70, 105, 70, 64, 247, 255, 253, 51, 28, 5, 176, 8, 28, 40, 188, 4, 70, 144, 188, 240,
188, 2, 71, 8, 28, 56, 240, 1, 254, 130, 28, 58, 153, 16, 144, 2, 240, 2, 254, 207, 70, 105, 70, 64, 247, 255, 253,
31, 153, 2, 28, 5, 28, 58, 152, 16, 240, 2, 254, 197, 152, 2, 240, 1, 254, 100, 231, 226, 70, 192, 19, 112, 128, 28,
19, 136, 0, 0, 181, 0, 176, 133, 42, 0, 209, 4, 32, 3, 66, 64, 176, 5, 188, 2, 71, 8, 28, 19, 34, 0, 145, 0, 146, 1,
146, 2, 33, 1, 34, 11, 247, 255, 255, 142, 231, 242, 70, 192, 181, 0, 176, 133, 34, 0, 146, 0, 146, 1, 146, 2, 28, 11,
34, 9, 33, 0, 247, 255, 255, 129, 176, 5, 188, 2, 71, 8, 181, 16, 176, 132, 28, 20, 70, 106, 50, 27, 120, 18, 2, 36,
67, 28, 35, 0, 147, 0, 146, 1, 145, 2, 34, 6, 33, 128, 28, 35, 247, 255, 255, 109, 176, 4, 188, 16, 188, 2, 71, 8, 70,
192, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 137, 144, 6, 72, 160, 155, 6, 104, 1, 51, 16, 145, 7,
104, 138, 0, 155, 24, 213, 154, 6, 70, 128, 152, 6, 0, 146, 104, 105, 24, 19, 146, 5, 154, 7, 0, 219, 24, 211, 34, 0,
103, 26, 75, 151, 64, 25, 70, 155, 41, 1, 208, 0, 224, 227, 75, 149, 32, 100, 96, 107, 247, 255, 248, 239, 75, 148,
32, 100, 96, 107, 247, 255, 248, 234, 75, 146, 32, 100, 96, 107, 247, 255, 248, 187, 70, 64, 104, 4, 104, 106, 104,
163, 104, 105, 29, 31, 104, 91, 32, 55, 70, 129, 64, 24, 70, 91, 64, 26, 42, 1, 208, 0, 224, 203, 34, 2, 70, 146, 66,
16, 208, 0, 224, 184, 38, 128, 0, 118, 66, 49, 209, 0, 224, 205, 32, 100, 247, 255, 248, 159, 70, 67, 104, 28, 104,
106, 104, 163, 104, 105, 29, 31, 104, 91, 70, 72, 64, 24, 70, 91, 64, 26, 42, 1, 208, 0, 224, 176, 70, 82, 66, 16, 208,
0, 224, 158, 66, 49, 209, 0, 224, 181, 32, 100, 247, 255, 248, 135, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29,
31, 104, 91, 70, 72, 64, 24, 70, 91, 64, 26, 42, 1, 208, 0, 224, 152, 70, 82, 66, 16, 208, 0, 224, 134, 66, 49, 209,
0, 224, 157, 32, 100, 247, 255, 248, 111, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104, 91, 32, 55, 70,
131, 64, 24, 75, 98, 64, 26, 70, 153, 42, 1, 208, 0, 224, 126, 34, 2, 66, 16, 209, 109, 38, 128, 0, 118, 66, 49, 209,
0, 224, 130, 32, 100, 247, 255, 248, 84, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104, 91, 70, 88, 64,
24, 70, 75, 64, 26, 42, 1, 209, 102, 70, 82, 66, 16, 209, 85, 66, 49, 208, 109, 32, 100, 247, 255, 248, 63, 70, 67,
104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104, 91, 70, 88, 64, 24, 70, 75, 64, 26, 42, 1, 209, 81, 70, 82, 66,
16, 209, 64, 66, 49, 208, 88, 32, 100, 247, 255, 248, 42, 70, 67, 104, 28, 104, 106, 104, 163, 104, 105, 29, 31, 104,
91, 70, 88, 64, 24, 70, 75, 64, 26, 42, 1, 209, 60, 34, 2, 66, 16, 209, 43, 38, 128, 0, 118, 66, 49, 208, 65, 32, 100,
247, 255, 248, 19, 70, 67, 104, 28, 104, 105, 104, 163, 104, 109, 104, 90, 29, 31, 28, 16, 35, 55, 64, 24, 70, 75, 64,
25, 41, 1, 209, 36, 70, 82, 66, 16, 209, 19, 66, 53, 208, 43, 96, 56, 70, 64, 104, 3, 32, 1, 104, 155, 66, 64, 104,
27, 75, 48, 96, 25, 176, 9, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 96, 56, 70, 64, 104,
3, 32, 2, 104, 155, 66, 64, 104, 27, 231, 238, 35, 128, 1, 155, 32, 1, 96, 107, 66, 64, 231, 232, 74, 35, 35, 1, 96,
19, 104, 163, 96, 88, 70, 64, 104, 3, 32, 1, 104, 155, 66, 64, 104, 27, 231, 220, 153, 5, 154, 6, 37, 0, 24, 139, 0,
219, 153, 7, 70, 66, 96, 56, 70, 154, 51, 88, 24, 204, 104, 19, 32, 100, 104, 155, 104, 27, 247, 254, 255, 237, 35,
22, 147, 1, 35, 128, 28, 32, 33, 128, 34, 6, 0, 91, 149, 0, 148, 2, 247, 255, 254, 52, 40, 0, 219, 190, 158, 6, 28,
32, 54, 1, 4, 51, 12, 27, 33, 0, 34, 5, 149, 0, 149, 1, 149, 2, 247, 255, 254, 38, 40, 0, 219, 176, 155, 7, 68, 83,
103, 221, 103, 30, 231, 171, 70, 192, 19, 112, 128, 28, 0, 0, 32, 1, 0, 0, 24, 3, 0, 0, 25, 3, 0, 0, 16, 1, 19, 112,
129, 76, 181, 112, 77, 12, 35, 84, 104, 42, 92, 211, 43, 0, 208, 14, 36, 0, 38, 84, 0, 163, 25, 27, 0, 219, 24, 211,
103, 92, 28, 32, 247, 255, 254, 153, 104, 42, 52, 1, 93, 147, 66, 163, 220, 242, 32, 0, 188, 112, 188, 2, 71, 8, 19,
112, 128, 28, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 75, 81, 39, 0, 34, 144, 176, 133, 28, 4, 70, 146,
70, 185, 70, 155, 224, 98, 70, 82, 88, 162, 32, 1, 70, 144, 240, 1, 252, 171, 28, 6, 40, 0, 208, 83, 70, 75, 147, 0,
35, 1, 147, 1, 144, 2, 33, 128, 70, 64, 34, 8, 35, 0, 247, 255, 253, 211, 40, 0, 219, 108, 120, 50, 28, 48, 70, 144,
240, 1, 252, 138, 120, 35, 69, 67, 208, 11, 70, 82, 88, 160, 70, 74, 146, 0, 146, 1, 146, 2, 33, 0, 34, 9, 247, 255,
253, 191, 40, 0, 219, 50, 104, 163, 43, 0, 209, 89, 70, 83, 88, 224, 136, 227, 70, 74, 147, 0, 146, 1, 146, 2, 33, 33,
34, 255, 35, 0, 247, 255, 253, 174, 28, 5, 40, 0, 219, 67, 32, 10, 247, 254, 255, 86, 70, 83, 88, 224, 123, 35, 70,
74, 147, 0, 146, 1, 146, 2, 33, 2, 34, 1, 35, 0, 247, 255, 253, 156, 28, 5, 40, 0, 219, 14, 70, 83, 88, 224, 123, 99,
70, 74, 147, 0, 146, 1, 146, 2, 33, 2, 34, 1, 35, 0, 247, 255, 253, 141, 28, 5, 40, 0, 218, 24, 47, 20, 208, 22, 32,
100, 247, 254, 255, 51, 55, 1, 47, 0, 208, 199, 70, 82, 88, 163, 105, 216, 247, 255, 254, 21, 28, 5, 32, 10, 247, 254,
255, 39, 28, 107, 208, 5, 45, 0, 218, 141, 69, 93, 208, 139, 47, 20, 209, 232, 176, 5, 28, 40, 188, 60, 70, 144, 70,
153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 69, 88, 209, 218, 231, 184, 28, 48, 240, 1, 252, 31, 231, 213, 6, 27,
70, 82, 14, 27, 88, 160, 104, 98, 43, 0, 208, 206, 6, 18, 14, 18, 146, 0, 70, 74, 146, 1, 146, 2, 33, 1, 34, 11, 247,
255, 253, 79, 40, 0, 218, 146, 231, 193, 255, 255, 228, 164, 181, 0, 176, 129, 33, 0, 247, 255, 255, 79, 176, 1, 188,
2, 71, 8, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 143, 28, 30, 70, 107, 51, 103, 120, 27, 145, 2, 147,
1, 70, 107, 51, 107, 120, 27, 33, 128, 147, 0, 155, 1, 37, 0, 59, 1, 6, 27, 28, 7, 70, 146, 14, 27, 32, 11, 0, 138,
147, 4, 70, 131, 149, 5, 149, 3, 70, 145, 45, 0, 209, 54, 70, 91, 59, 1, 6, 27, 152, 0, 14, 27, 70, 155, 40, 0, 208,
61, 153, 4, 41, 15, 217, 79, 37, 3, 66, 109, 70, 88, 6, 4, 152, 5, 34, 1, 70, 128, 44, 0, 221, 1, 42, 0, 209, 26, 44,
0, 220, 0, 225, 211, 28, 169, 208, 1, 42, 0, 209, 49, 155, 27, 43, 0, 208, 1, 70, 64, 112, 24, 153, 28, 41, 0, 208,
1, 154, 3, 96, 10, 176, 15, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 28, 107, 208,
35, 70, 64, 144, 5, 45, 0, 208, 200, 70, 88, 6, 4, 22, 35, 15, 217, 34, 9, 37, 0, 66, 154, 65, 105, 28, 56, 247, 255,
254, 232, 28, 5, 40, 0, 219, 201, 231, 185, 153, 4, 41, 15, 216, 0, 224, 177, 37, 3, 66, 109, 70, 90, 6, 20, 231, 191,
28, 56, 33, 0, 247, 255, 254, 215, 28, 130, 209, 199, 28, 5, 231, 197, 74, 209, 35, 1, 96, 19, 231, 203, 34, 160, 88,
184, 70, 144, 40, 0, 208, 170, 33, 0, 34, 31, 240, 2, 252, 28, 70, 67, 88, 250, 75, 202, 70, 64, 96, 19, 35, 152, 88,
250, 36, 255, 6, 19, 14, 17, 88, 61, 67, 25, 2, 36, 28, 19, 32, 255, 4, 0, 64, 35, 2, 27, 64, 2, 67, 25, 10, 18, 67,
17, 96, 105, 70, 66, 88, 185, 6, 51, 14, 50, 67, 26, 28, 51, 64, 35, 2, 27, 67, 26, 28, 51, 64, 3, 10, 27, 67, 26, 96,
138, 70, 69, 89, 123, 32, 0, 115, 24, 70, 105, 34, 11, 89, 123, 92, 81, 115, 89, 35, 156, 92, 251, 43, 0, 209, 0, 224,
236, 89, 122, 35, 12, 115, 147, 36, 160, 89, 56, 153, 24, 154, 1, 48, 15, 240, 2, 251, 155, 33, 144, 88, 120, 89, 59,
123, 121, 34, 31, 247, 255, 252, 100, 28, 5, 40, 31, 208, 0, 225, 18, 46, 0, 209, 0, 224, 234, 4, 51, 12, 27, 172, 6,
70, 152, 123, 123, 37, 144, 89, 120, 118, 35, 9, 219, 33, 0, 118, 99, 70, 74, 70, 67, 70, 85, 96, 33, 96, 165, 97, 226,
97, 35, 28, 33, 247, 255, 249, 204, 28, 5, 28, 104, 209, 0, 224, 206, 45, 0, 218, 0, 224, 193, 66, 181, 208, 0, 224,
189, 68, 178, 28, 51, 70, 180, 45, 0, 218, 0, 225, 16, 38, 0, 34, 160, 70, 144, 88, 184, 33, 255, 34, 13, 240, 2, 251,
164, 123, 59, 70, 69, 33, 144, 89, 122, 88, 120, 118, 35, 9, 219, 37, 0, 118, 99, 70, 73, 35, 13, 96, 37, 97, 225, 97,
35, 96, 162, 28, 33, 247, 255, 249, 162, 28, 5, 40, 0, 218, 0, 231, 89, 40, 13, 209, 0, 224, 166, 155, 5, 77, 131, 70,
152, 70, 91, 34, 1, 6, 28, 231, 21, 34, 160, 88, 184, 70, 144, 40, 0, 209, 0, 231, 71, 33, 0, 34, 31, 240, 2, 251, 122,
70, 67, 88, 250, 75, 121, 70, 64, 96, 19, 35, 152, 88, 250, 36, 255, 6, 19, 14, 17, 88, 61, 67, 25, 2, 36, 28, 19, 32,
255, 4, 0, 64, 35, 2, 27, 64, 2, 67, 25, 10, 18, 67, 17, 96, 105, 70, 66, 88, 185, 6, 51, 14, 50, 67, 26, 28, 51, 64,
35, 2, 27, 67, 26, 28, 51, 64, 3, 10, 27, 67, 26, 96, 138, 70, 67, 88, 250, 35, 128, 66, 91, 115, 19, 70, 69, 70, 104,
33, 11, 89, 123, 92, 8, 115, 88, 35, 156, 92, 251, 43, 0, 208, 65, 89, 122, 35, 12, 115, 147, 36, 160, 89, 56, 153,
24, 154, 1, 37, 144, 48, 15, 240, 2, 250, 247, 89, 120, 123, 121, 89, 59, 34, 31, 247, 255, 251, 193, 28, 5, 40, 31,
209, 68, 46, 0, 208, 73, 172, 6, 224, 4, 37, 1, 28, 30, 66, 109, 46, 0, 208, 27, 123, 59, 33, 144, 88, 120, 118, 35,
9, 219, 118, 99, 70, 75, 97, 227, 4, 51, 34, 0, 12, 27, 70, 85, 96, 165, 96, 34, 97, 35, 28, 33, 247, 255, 249, 39,
28, 5, 40, 0, 219, 232, 26, 51, 68, 130, 66, 174, 209, 225, 28, 30, 46, 0, 209, 227, 45, 0, 219, 0, 231, 94, 152, 5,
70, 89, 15, 234, 70, 128, 6, 12, 230, 149, 155, 1, 70, 65, 88, 122, 43, 6, 216, 55, 35, 6, 115, 147, 231, 184, 157,
1, 70, 67, 88, 250, 45, 6, 216, 50, 35, 6, 115, 147, 231, 13, 77, 57, 46, 0, 208, 0, 231, 34, 28, 43, 70, 172, 231,
61, 40, 0, 218, 0, 230, 118, 77, 53, 70, 89, 6, 12, 230, 116, 172, 6, 231, 56, 70, 69, 89, 123, 36, 255, 104, 26, 104,
152, 104, 93, 123, 27, 14, 17, 70, 152, 6, 19, 67, 25, 70, 132, 28, 19, 2, 36, 32, 255, 64, 35, 4, 0, 2, 27, 64, 2,
67, 25, 10, 18, 75, 41, 67, 17, 66, 153, 208, 16, 153, 5, 77, 39, 70, 136, 231, 62, 35, 16, 115, 147, 231, 128, 35,
16, 115, 147, 230, 218, 40, 0, 218, 0, 230, 137, 70, 91, 77, 31, 6, 28, 230, 72, 6, 43, 14, 42, 67, 26, 28, 43, 64,
35, 2, 27, 67, 26, 28, 43, 64, 3, 10, 27, 28, 17, 67, 25, 70, 99, 14, 26, 6, 27, 67, 26, 70, 99, 64, 35, 2, 27, 67,
26, 70, 99, 64, 3, 10, 27, 67, 26, 146, 3, 34, 152, 88, 187, 66, 153, 208, 18, 77, 18, 231, 18, 15, 218, 155, 5, 70,
88, 70, 101, 70, 152, 38, 0, 6, 4, 230, 36, 42, 0, 209, 0, 230, 40, 74, 4, 35, 1, 37, 1, 96, 19, 66, 109, 230, 48, 28,
75, 80, 187, 37, 0, 230, 34, 19, 112, 129, 76, 85, 83, 66, 67, 255, 255, 216, 237, 255, 255, 216, 233, 255, 255, 216,
238, 83, 66, 83, 85, 255, 255, 216, 236, 255, 255, 216, 235, 181, 240, 70, 87, 70, 78, 70, 69, 180, 224, 176, 140, 70,
129, 32, 18, 70, 136, 240, 1, 249, 213, 70, 109, 34, 47, 68, 106, 38, 0, 53, 31, 28, 7, 70, 146, 112, 22, 28, 40, 33,
0, 34, 16, 240, 2, 250, 94, 47, 0, 208, 32, 35, 1, 112, 46, 147, 1, 147, 2, 70, 83, 147, 3, 70, 72, 70, 65, 34, 0, 35,
0, 149, 0, 150, 4, 247, 255, 253, 172, 28, 4, 40, 0, 219, 3, 70, 82, 120, 19, 43, 0, 209, 14, 28, 56, 240, 1, 249, 162,
176, 12, 28, 32, 188, 28, 70, 144, 70, 153, 70, 162, 188, 240, 188, 2, 71, 8, 36, 4, 66, 100, 231, 243, 35, 3, 70, 66,
112, 43, 1, 83, 112, 107, 33, 0, 35, 18, 34, 18, 28, 56, 113, 43, 113, 110, 240, 2, 250, 43, 35, 6, 147, 1, 70, 72,
70, 65, 28, 58, 35, 18, 149, 0, 150, 2, 150, 3, 150, 4, 247, 255, 253, 125, 28, 4, 40, 0, 219, 212, 120, 187, 34, 15,
64, 19, 70, 82, 112, 19, 59, 2, 6, 27, 14, 27, 43, 2, 216, 202, 76, 0, 231, 200, 255, 255, 216, 239, 181, 240, 70, 95,
70, 86, 70, 77, 70, 68, 180, 240, 176, 149, 144, 11, 72, 91, 145, 10, 144, 8, 120, 3, 146, 9, 43, 1, 208, 9, 32, 0,
176, 21, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 4, 11, 12, 27, 147, 15, 74, 82, 75, 83,
33, 0, 145, 14, 146, 7, 70, 153, 152, 7, 70, 74, 120, 0, 28, 7, 55, 4, 0, 187, 144, 12, 88, 209, 152, 15, 28, 11, 67,
67, 32, 128, 2, 0, 66, 131, 216, 111, 153, 15, 70, 139, 28, 10, 42, 0, 208, 216, 152, 12, 153, 9, 7, 67, 14, 27, 70,
108, 0, 191, 157, 11, 147, 13, 28, 22, 70, 138, 52, 69, 151, 6, 28, 55, 69, 94, 217, 0, 70, 95, 4, 58, 12, 19, 32, 79,
70, 152, 68, 104, 35, 0, 112, 3, 32, 40, 35, 55, 112, 32, 68, 107, 120, 27, 33, 0, 112, 99, 14, 43, 112, 163, 12, 43,
112, 227, 14, 18, 10, 43, 70, 64, 113, 161, 114, 97, 113, 35, 113, 101, 113, 226, 114, 32, 70, 73, 123, 139, 154, 12,
66, 147, 217, 168, 155, 6, 72, 46, 88, 26, 42, 0, 208, 163, 32, 79, 33, 10, 68, 104, 70, 67, 67, 83, 34, 0, 145, 1,
146, 2, 144, 3, 146, 4, 72, 39, 153, 12, 70, 82, 148, 0, 247, 255, 252, 241, 40, 0, 221, 40, 33, 79, 68, 105, 120, 11,
43, 0, 208, 0, 231, 139, 70, 65, 26, 115, 4, 27, 153, 6, 12, 30, 70, 75, 88, 90, 46, 0, 208, 4, 28, 19, 67, 123, 25,
237, 68, 154, 231, 176, 40, 0, 218, 0, 231, 122, 155, 11, 152, 10, 154, 14, 24, 27, 147, 11, 35, 128, 50, 1, 0, 155,
146, 14, 66, 154, 209, 130, 32, 1, 231, 110, 240, 2, 248, 97, 154, 15, 70, 131, 231, 141, 40, 0, 218, 218, 28, 130,
209, 230, 154, 8, 35, 0, 112, 19, 70, 73, 35, 160, 88, 200, 40, 0, 208, 1, 240, 1, 248, 184, 33, 0, 34, 164, 70, 72,
240, 2, 249, 85, 72, 6, 33, 0, 247, 253, 255, 201, 32, 0, 231, 80, 70, 192, 19, 112, 129, 85, 19, 112, 129, 84, 19,
114, 73, 152, 19, 112, 128, 172, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 141, 144, 5, 32, 22, 70, 137,
240, 1, 248, 164, 28, 4, 144, 11, 40, 0, 209, 0, 226, 13, 35, 0, 147, 0, 35, 18, 147, 1, 35, 128, 144, 2, 33, 128, 152,
5, 34, 6, 0, 91, 247, 255, 249, 201, 144, 6, 40, 0, 219, 0, 224, 142, 152, 11, 240, 1, 248, 128, 70, 74, 70, 73, 124,
137, 124, 215, 6, 11, 4, 58, 67, 26, 70, 75, 70, 140, 125, 30, 70, 73, 125, 76, 2, 51, 67, 19, 28, 33, 67, 25, 209,
0, 225, 222, 70, 74, 124, 82, 70, 144, 42, 0, 209, 0, 225, 230, 35, 0, 70, 155, 70, 154, 70, 82, 24, 141, 122, 107,
122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 208, 82, 121, 43, 43, 0, 208, 58,
39, 0, 38, 0, 224, 10, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 25,
132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67, 19, 124, 98, 28, 16, 67, 24, 208, 1, 240, 1, 248,
55, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27, 67, 19, 123, 34, 28, 16, 67, 24, 208, 1, 240, 1, 248,
41, 121, 43, 55, 1, 54, 18, 66, 159, 219, 210, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123,
42, 28, 16, 67, 24, 240, 1, 248, 23, 70, 74, 70, 75, 70, 73, 124, 137, 124, 91, 124, 215, 70, 152, 4, 58, 6, 11, 67,
26, 70, 75, 70, 140, 125, 30, 70, 73, 125, 76, 2, 51, 67, 19, 28, 33, 67, 25, 34, 1, 35, 13, 68, 147, 68, 154, 69, 195,
219, 0, 225, 123, 70, 97, 6, 11, 4, 58, 67, 26, 2, 51, 67, 19, 28, 33, 67, 25, 231, 142, 28, 33, 34, 18, 70, 72, 240,
2, 248, 77, 28, 32, 240, 0, 255, 236, 70, 73, 120, 138, 120, 203, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18,
12, 19, 14, 18, 112, 138, 122, 10, 112, 203, 122, 75, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12, 19, 14,
18, 114, 10, 122, 138, 114, 75, 122, 203, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12, 19, 14, 18, 114,
138, 123, 10, 114, 203, 123, 75, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12, 19, 115, 75, 124, 75, 14,
18, 0, 88, 24, 192, 0, 128, 115, 10, 24, 192, 240, 0, 255, 188, 70, 74, 14, 3, 116, 147, 12, 3, 116, 211, 10, 3, 117,
19, 117, 80, 40, 0, 209, 0, 225, 47, 124, 83, 33, 0, 0, 90, 24, 210, 0, 146, 24, 210, 240, 2, 248, 63, 70, 73, 124,
75, 43, 0, 209, 0, 225, 59, 34, 0, 146, 7, 146, 10, 32, 9, 240, 0, 255, 158, 28, 4, 40, 0, 209, 0, 225, 8, 153, 7, 34,
2, 6, 11, 14, 29, 35, 9, 28, 33, 147, 0, 152, 5, 28, 43, 247, 255, 249, 71, 70, 75, 124, 154, 124, 219, 70, 73, 6, 18,
4, 27, 67, 19, 125, 10, 2, 18, 67, 26, 125, 75, 28, 33, 67, 19, 154, 10, 24, 210, 70, 146, 28, 16, 34, 9, 240, 1, 255,
205, 28, 32, 240, 0, 255, 108, 70, 83, 120, 154, 120, 219, 2, 18, 67, 19, 4, 27, 10, 26, 14, 27, 67, 26, 4, 18, 12,
20, 70, 81, 14, 18, 112, 138, 112, 204, 28, 32, 240, 0, 255, 102, 144, 11, 40, 0, 209, 0, 224, 208, 70, 82, 120, 211,
152, 5, 147, 0, 153, 11, 34, 2, 28, 43, 247, 255, 249, 17, 144, 6, 40, 0, 218, 0, 230, 197, 70, 83, 120, 29, 121, 27,
0, 216, 24, 192, 0, 64, 240, 0, 255, 77, 70, 81, 14, 3, 114, 75, 12, 3, 114, 139, 10, 3, 114, 203, 115, 8, 40, 0, 209,
0, 224, 192, 121, 11, 33, 0, 0, 218, 24, 210, 0, 82, 240, 1, 255, 209, 70, 82, 121, 19, 43, 0, 209, 0, 224, 138, 155,
11, 33, 0, 25, 91, 27, 100, 70, 152, 70, 163, 145, 8, 145, 9, 70, 83, 122, 90, 122, 155, 70, 81, 6, 18, 4, 27, 67, 19,
122, 202, 2, 18, 67, 26, 123, 11, 70, 65, 67, 19, 154, 9, 24, 157, 28, 40, 34, 9, 240, 1, 255, 109, 121, 43, 120, 44,
0, 216, 26, 192, 240, 0, 255, 21, 14, 3, 115, 171, 12, 3, 115, 235, 10, 3, 116, 43, 116, 104, 40, 0, 209, 0, 224, 137,
70, 91, 27, 27, 70, 155, 121, 43, 33, 0, 0, 218, 26, 210, 240, 1, 255, 152, 70, 89, 68, 160, 41, 0, 209, 0, 224, 120,
70, 66, 120, 83, 59, 4, 6, 27, 14, 27, 43, 1, 216, 0, 224, 112, 70, 64, 70, 90, 224, 5, 120, 67, 59, 4, 6, 27, 14, 27,
43, 1, 217, 98, 120, 3, 26, 210, 24, 192, 42, 0, 209, 244, 70, 65, 26, 68, 6, 35, 14, 27, 115, 107, 44, 0, 209, 98,
121, 43, 43, 0, 208, 37, 39, 0, 38, 0, 123, 171, 123, 234, 6, 27, 4, 18, 67, 26, 124, 43, 124, 108, 2, 27, 67, 19, 67,
28, 25, 164, 70, 65, 34, 7, 28, 32, 240, 1, 255, 29, 120, 35, 121, 34, 68, 152, 121, 99, 2, 18, 67, 19, 4, 27, 10, 26,
14, 27, 67, 26, 4, 18, 12, 19, 14, 18, 113, 34, 113, 99, 121, 43, 55, 1, 54, 7, 66, 187, 216, 219, 155, 8, 153, 9, 51,
1, 49, 18, 147, 8, 145, 9, 70, 82, 121, 19, 153, 8, 66, 139, 217, 0, 231, 124, 152, 11, 240, 0, 254, 156, 154, 7, 155,
10, 50, 1, 51, 13, 146, 7, 147, 10, 70, 73, 124, 75, 66, 147, 217, 0, 230, 251, 34, 0, 146, 6, 152, 6, 176, 13, 188,
60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 34, 4, 66, 82, 146, 6, 230, 0, 28, 8, 240, 0, 254,
126, 231, 237, 70, 67, 26, 196, 6, 35, 14, 27, 231, 160, 35, 0, 115, 107, 231, 160, 35, 4, 66, 91, 147, 6, 229, 237,
28, 32, 240, 0, 254, 122, 14, 3, 114, 107, 12, 3, 114, 171, 10, 3, 114, 235, 115, 40, 40, 0, 208, 239, 70, 65, 28, 34,
240, 1, 254, 191, 70, 90, 27, 18, 68, 160, 70, 147, 231, 135, 28, 32, 240, 0, 254, 89, 35, 0, 147, 6, 231, 198, 181,
240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 141, 70, 130, 32, 1, 28, 12, 240, 0, 254, 86, 144, 5, 40, 0, 209,
0, 225, 239, 33, 0, 34, 164, 70, 80, 240, 1, 254, 227, 70, 81, 35, 1, 34, 152, 80, 139, 35, 144, 80, 204, 70, 105, 28,
32, 49, 26, 247, 255, 253, 146, 28, 4, 40, 0, 218, 0, 225, 194, 75, 178, 104, 27, 43, 0, 208, 0, 224, 211, 72, 177,
70, 105, 49, 26, 34, 22, 240, 1, 254, 133, 33, 43, 68, 105, 120, 15, 47, 0, 209, 0, 226, 30, 70, 108, 141, 163, 141,
226, 33, 0, 4, 27, 28, 20, 67, 28, 70, 139, 70, 137, 38, 0, 70, 74, 24, 165, 121, 41, 41, 0, 208, 68, 35, 0, 70, 152,
39, 0, 122, 106, 122, 171, 6, 18, 4, 27, 67, 19, 122, 234, 2, 18, 67, 26, 123, 43, 67, 19, 25, 220, 121, 99, 43, 8,
209, 0, 224, 189, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67, 19, 124, 98, 28, 16, 67, 24, 208, 1,
240, 0, 253, 242, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 115, 166, 2, 27, 67, 19, 123, 34, 115, 230, 28,
16, 116, 38, 116, 102, 67, 24, 208, 1, 240, 0, 253, 224, 114, 102, 114, 166, 114, 230, 115, 38, 121, 41, 36, 1, 68,
160, 55, 18, 69, 65, 216, 198, 70, 106, 141, 147, 33, 43, 141, 210, 68, 105, 4, 27, 28, 20, 120, 15, 67, 28, 35, 1,
33, 13, 68, 155, 68, 137, 69, 95, 216, 175, 44, 0, 209, 0, 225, 83, 47, 0, 209, 0, 225, 77, 34, 0, 70, 145, 70, 144,
70, 67, 24, 229, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 208, 72,
121, 43, 43, 0, 208, 58, 39, 0, 38, 0, 224, 10, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123,
42, 28, 16, 67, 24, 25, 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67, 19, 124, 98, 28, 16, 67,
24, 208, 1, 240, 0, 253, 144, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27, 67, 19, 123, 34, 28, 16, 67,
24, 208, 1, 240, 0, 253, 130, 121, 43, 55, 1, 54, 18, 66, 159, 219, 210, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122,
235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 240, 0, 253, 112, 70, 105, 36, 43, 141, 139, 141, 202, 68, 108, 120, 39,
4, 27, 28, 20, 67, 28, 34, 1, 35, 13, 68, 145, 68, 152, 69, 185, 219, 0, 224, 236, 70, 108, 141, 163, 141, 226, 4, 27,
28, 20, 67, 28, 231, 154, 33, 0, 72, 70, 224, 3, 49, 1, 41, 18, 209, 0, 231, 37, 36, 26, 68, 108, 92, 66, 92, 99, 66,
154, 208, 245, 152, 5, 240, 0, 253, 73, 70, 104, 48, 26, 36, 1, 247, 254, 249, 96, 66, 100, 224, 225, 121, 162, 42,
6, 208, 4, 42, 2, 208, 2, 42, 5, 208, 0, 231, 57, 121, 227, 43, 80, 208, 0, 231, 53, 121, 35, 43, 1, 216, 0, 231, 86,
42, 6, 208, 3, 35, 1, 70, 81, 34, 156, 84, 139, 70, 81, 115, 78, 115, 14, 121, 34, 70, 148, 42, 0, 209, 0, 231, 71,
32, 0, 33, 0, 224, 3, 48, 1, 49, 7, 69, 132, 217, 26, 123, 162, 123, 227, 6, 18, 4, 27, 67, 19, 124, 34, 2, 18, 67,
26, 124, 99, 67, 19, 24, 90, 120, 211, 43, 2, 209, 237, 120, 146, 6, 19, 43, 0, 218, 0, 224, 145, 70, 83, 115, 90, 121,
34, 48, 1, 70, 148, 49, 7, 69, 132, 216, 228, 70, 81, 123, 11, 43, 0, 209, 0, 231, 32, 70, 82, 123, 83, 43, 0, 209,
0, 231, 27, 121, 107, 70, 81, 112, 11, 120, 163, 70, 106, 96, 75, 120, 227, 96, 139, 141, 147, 141, 210, 4, 27, 28,
17, 67, 25, 209, 0, 224, 152, 35, 43, 68, 107, 120, 28, 44, 0, 209, 0, 224, 143, 34, 0, 70, 145, 70, 144, 70, 67, 24,
205, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 208, 76, 121, 43, 43,
0, 208, 62, 39, 0, 38, 0, 224, 14, 19, 112, 129, 80, 19, 114, 73, 128, 122, 107, 122, 170, 6, 27, 4, 18, 67, 26, 122,
235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 25, 132, 123, 163, 123, 226, 6, 27, 4, 18, 67, 26, 124, 35, 2, 27, 67,
19, 124, 98, 28, 16, 67, 24, 208, 1, 240, 0, 252, 174, 122, 99, 122, 162, 6, 27, 4, 18, 67, 26, 122, 227, 2, 27, 67,
19, 123, 34, 28, 16, 67, 24, 208, 1, 240, 0, 252, 160, 121, 43, 55, 1, 54, 18, 66, 159, 219, 210, 122, 107, 122, 170,
6, 27, 4, 18, 67, 26, 122, 235, 2, 27, 67, 19, 123, 42, 28, 16, 67, 24, 240, 0, 252, 142, 70, 106, 141, 147, 33, 43,
141, 210, 68, 105, 120, 12, 4, 27, 28, 17, 67, 25, 35, 1, 34, 13, 68, 153, 68, 144, 69, 161, 218, 43, 70, 105, 141,
139, 141, 202, 4, 27, 28, 17, 67, 25, 231, 151, 70, 83, 115, 26, 121, 34, 70, 148, 231, 81, 28, 32, 240, 0, 252, 112,
76, 59, 152, 5, 240, 0, 252, 108, 35, 160, 70, 81, 88, 200, 40, 0, 208, 1, 240, 0, 252, 101, 70, 80, 33, 0, 34, 164,
240, 1, 253, 2, 176, 13, 28, 32, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 36, 4, 66, 100,
231, 242, 28, 8, 240, 0, 252, 80, 70, 82, 38, 144, 32, 1, 89, 148, 240, 0, 252, 86, 28, 5, 40, 0, 208, 61, 35, 0, 147,
0, 35, 1, 147, 1, 144, 2, 33, 128, 28, 32, 34, 8, 35, 0, 247, 254, 253, 126, 40, 0, 219, 50, 28, 40, 120, 44, 240, 0,
252, 54, 70, 83, 120, 25, 66, 161, 208, 5, 70, 84, 89, 160, 247, 254, 253, 228, 40, 0, 219, 34, 70, 81, 104, 138, 42,
0, 208, 8, 35, 144, 6, 18, 88, 200, 14, 18, 121, 201, 247, 254, 253, 195, 40, 0, 219, 21, 70, 80, 247, 255, 248, 20,
28, 4, 40, 0, 219, 169, 35, 16, 70, 82, 115, 147, 72, 15, 240, 0, 252, 31, 70, 84, 35, 160, 80, 224, 40, 0, 208, 18,
152, 5, 240, 0, 252, 11, 36, 0, 231, 168, 76, 10, 231, 151, 28, 40, 240, 0, 252, 4, 76, 7, 231, 146, 70, 106, 141, 147,
141, 210, 4, 27, 28, 20, 67, 28, 230, 51, 36, 4, 66, 100, 231, 136, 255, 255, 216, 240, 0, 0, 128, 16, 255, 255, 216,
231, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 73, 98, 176, 141, 144, 6, 70, 136, 28, 8, 153, 6, 247, 255,
253, 142, 40, 0, 218, 0, 224, 165, 70, 67, 123, 154, 146, 7, 42, 0, 209, 0, 224, 140, 73, 91, 35, 38, 38, 0, 68, 107,
70, 139, 70, 154, 70, 177, 224, 6, 155, 7, 54, 1, 66, 158, 219, 0, 224, 127, 70, 65, 123, 138, 6, 51, 14, 29, 66, 149,
210, 244, 73, 82, 70, 90, 96, 17, 72, 79, 28, 41, 247, 255, 249, 237, 28, 4, 40, 0, 219, 90, 75, 77, 70, 89, 96, 11,
7, 107, 70, 82, 14, 31, 35, 18, 70, 73, 112, 19, 35, 36, 112, 87, 112, 145, 112, 209, 113, 19, 113, 81, 32, 36, 240,
0, 251, 184, 28, 4, 40, 0, 208, 16, 70, 74, 70, 81, 35, 6, 145, 0, 147, 1, 146, 2, 146, 3, 146, 4, 72, 61, 28, 41, 28,
34, 35, 36, 247, 254, 255, 155, 28, 32, 240, 0, 251, 152, 70, 81, 35, 37, 112, 79, 112, 11, 32, 8, 240, 0, 251, 157,
28, 7, 40, 0, 208, 186, 35, 2, 70, 82, 147, 1, 70, 75, 146, 0, 147, 2, 147, 3, 147, 4, 72, 47, 28, 41, 28, 58, 35, 8,
247, 254, 255, 128, 28, 4, 40, 0, 219, 22, 172, 11, 28, 32, 28, 57, 34, 4, 240, 1, 251, 213, 28, 43, 154, 11, 73, 39,
51, 20, 0, 155, 80, 90, 28, 32, 29, 57, 34, 4, 240, 1, 251, 202, 29, 43, 154, 11, 73, 33, 0, 155, 80, 90, 36, 0, 28,
56, 240, 0, 251, 99, 28, 162, 208, 48, 44, 0, 219, 139, 153, 6, 74, 30, 137, 11, 32, 0, 128, 19, 137, 75, 74, 29, 128,
19, 74, 29, 35, 1, 112, 19, 75, 28, 70, 90, 112, 29, 75, 23, 96, 19, 224, 20, 75, 24, 34, 0, 112, 26, 35, 160, 70, 66,
88, 208, 40, 0, 208, 1, 240, 0, 251, 68, 33, 0, 70, 64, 34, 164, 240, 1, 251, 225, 72, 19, 33, 0, 247, 253, 250, 85,
32, 3, 66, 64, 176, 13, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 75, 9, 34, 0, 112, 26,
70, 65, 35, 160, 88, 200, 40, 0, 209, 225, 231, 226, 70, 192, 19, 114, 73, 152, 19, 112, 128, 32, 0, 15, 66, 64, 19,
112, 129, 86, 19, 112, 129, 88, 19, 112, 129, 85, 19, 112, 129, 84, 19, 112, 128, 172, 181, 240, 70, 95, 70, 86, 70,
77, 70, 68, 180, 240, 74, 73, 176, 129, 104, 19, 70, 146, 43, 0, 208, 9, 32, 0, 176, 1, 188, 60, 70, 144, 70, 153, 70,
162, 70, 171, 188, 240, 188, 2, 71, 8, 75, 66, 104, 29, 70, 153, 35, 84, 92, 235, 43, 0, 208, 121, 38, 0, 224, 53, 32,
250, 0, 128, 247, 253, 253, 227, 70, 64, 247, 255, 254, 254, 40, 0, 208, 103, 25, 187, 0, 219, 24, 235, 70, 74, 111,
92, 104, 19, 28, 32, 104, 155, 70, 155, 247, 254, 252, 189, 48, 1, 208, 68, 32, 250, 0, 128, 247, 253, 253, 205, 70,
64, 247, 255, 254, 232, 40, 0, 208, 81, 25, 187, 0, 219, 24, 235, 111, 92, 70, 74, 104, 19, 28, 32, 104, 157, 247, 254,
252, 168, 48, 1, 208, 58, 32, 250, 0, 128, 247, 253, 253, 184, 70, 75, 104, 29, 34, 84, 92, 171, 54, 1, 66, 179, 221,
65, 0, 183, 25, 187, 0, 219, 28, 26, 24, 236, 50, 88, 111, 35, 25, 82, 70, 144, 43, 0, 208, 237, 28, 16, 247, 255, 254,
193, 40, 0, 208, 42, 70, 74, 104, 19, 111, 100, 104, 155, 28, 32, 70, 155, 247, 254, 252, 131, 48, 1, 209, 175, 32,
250, 0, 64, 247, 253, 253, 147, 28, 35, 51, 16, 0, 155, 74, 19, 68, 91, 96, 90, 231, 164, 32, 250, 0, 64, 247, 253,
253, 136, 28, 35, 51, 16, 0, 155, 74, 14, 68, 91, 96, 90, 231, 175, 32, 250, 0, 64, 247, 253, 253, 125, 28, 35, 51,
16, 0, 155, 74, 8, 24, 235, 96, 90, 231, 185, 35, 1, 70, 82, 96, 19, 74, 6, 35, 0, 96, 19, 231, 116, 32, 1, 66, 64,
231, 114, 19, 112, 129, 80, 19, 112, 128, 28, 0, 0, 16, 1, 19, 112, 129, 76, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68,
180, 240, 75, 142, 176, 151, 120, 27, 144, 11, 146, 10, 43, 1, 208, 9, 32, 0, 176, 23, 188, 60, 70, 144, 70, 153, 70,
162, 70, 171, 188, 240, 188, 2, 71, 8, 4, 11, 33, 0, 70, 138, 74, 133, 73, 134, 12, 27, 147, 14, 146, 9, 35, 0, 145,
8, 224, 137, 74, 131, 35, 144, 88, 208, 70, 147, 40, 0, 209, 0, 224, 208, 75, 129, 105, 196, 104, 27, 28, 32, 104, 157,
247, 254, 252, 30, 28, 67, 209, 0, 224, 188, 40, 0, 208, 0, 224, 195, 35, 160, 70, 89, 88, 200, 40, 0, 208, 1, 240,
0, 250, 55, 35, 160, 70, 90, 33, 0, 80, 209, 35, 144, 88, 208, 247, 255, 254, 61, 40, 0, 208, 0, 224, 177, 155, 9, 34,
0, 96, 26, 32, 100, 247, 253, 253, 22, 75, 111, 153, 8, 96, 11, 75, 111, 70, 89, 120, 27, 154, 14, 28, 30, 54, 4, 147,
12, 0, 179, 88, 203, 32, 128, 70, 153, 70, 75, 67, 83, 2, 0, 146, 15, 66, 131, 217, 4, 70, 73, 240, 1, 249, 167, 154,
14, 144, 15, 42, 0, 209, 0, 224, 181, 155, 10, 153, 12, 147, 13, 7, 75, 14, 27, 70, 108, 0, 182, 157, 11, 147, 16, 28,
23, 52, 77, 150, 7, 154, 15, 28, 62, 66, 151, 217, 0, 28, 22, 4, 50, 12, 19, 33, 87, 70, 152, 68, 105, 35, 0, 112, 11,
33, 42, 35, 67, 112, 33, 68, 107, 120, 27, 14, 18, 112, 99, 14, 43, 112, 163, 12, 43, 112, 227, 33, 0, 113, 226, 10,
43, 70, 66, 113, 161, 114, 97, 113, 35, 113, 101, 114, 34, 70, 89, 123, 139, 154, 12, 66, 147, 216, 38, 33, 3, 66, 74,
70, 146, 75, 71, 153, 8, 96, 11, 154, 9, 104, 19, 43, 0, 209, 2, 70, 83, 43, 0, 218, 117, 155, 17, 51, 1, 43, 15, 220,
99, 147, 17, 43, 12, 221, 1, 34, 12, 146, 17, 153, 9, 104, 11, 43, 0, 208, 0, 231, 107, 70, 82, 50, 2, 208, 70, 75,
58, 154, 8, 96, 19, 70, 83, 51, 2, 208, 222, 73, 53, 70, 139, 231, 142, 70, 75, 43, 0, 208, 213, 70, 65, 34, 10, 70,
75, 67, 75, 146, 1, 33, 1, 34, 87, 145, 2, 68, 106, 33, 0, 146, 3, 145, 4, 72, 44, 153, 12, 154, 13, 148, 0, 247, 254,
253, 157, 70, 130, 40, 0, 221, 63, 34, 87, 68, 106, 120, 19, 43, 0, 209, 55, 70, 65, 26, 123, 4, 27, 12, 31, 155, 7,
70, 90, 88, 210, 70, 145, 47, 0, 208, 180, 70, 75, 67, 115, 153, 13, 25, 173, 24, 201, 145, 13, 231, 133, 32, 250, 0,
64, 247, 253, 252, 112, 28, 35, 51, 16, 0, 155, 74, 29, 24, 235, 96, 90, 32, 100, 247, 253, 252, 103, 70, 82, 50, 2,
209, 184, 155, 17, 43, 0, 221, 181, 73, 19, 28, 8, 70, 139, 33, 1, 247, 254, 252, 183, 70, 130, 40, 0, 219, 172, 75,
16, 154, 8, 96, 19, 231, 64, 70, 81, 15, 203, 34, 1, 64, 83, 6, 27, 14, 24, 230, 246, 75, 14, 70, 154, 231, 131, 70,
83, 43, 0, 218, 193, 231, 127, 32, 1, 230, 237, 34, 1, 66, 83, 70, 154, 231, 121, 19, 112, 129, 85, 19, 112, 129, 76,
19, 112, 128, 32, 19, 114, 73, 152, 19, 112, 128, 28, 0, 15, 66, 64, 19, 112, 129, 84, 0, 0, 16, 1, 255, 255, 216, 234,
181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 75, 144, 176, 151, 120, 27, 144, 12, 146, 11, 43, 1, 208, 9, 32,
0, 176, 23, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 74, 137, 4, 11, 33, 0, 70, 136, 146,
10, 73, 135, 74, 136, 12, 27, 147, 14, 145, 8, 35, 0, 146, 7, 224, 141, 154, 8, 35, 144, 88, 208, 40, 0, 209, 0, 224,
187, 75, 130, 105, 196, 104, 27, 28, 32, 104, 157, 247, 254, 250, 231, 28, 67, 209, 0, 224, 167, 40, 0, 208, 0, 224,
174, 153, 8, 35, 160, 88, 200, 40, 0, 208, 2, 240, 0, 249, 0, 153, 8, 35, 160, 34, 0, 80, 202, 35, 144, 88, 200, 247,
255, 253, 6, 40, 0, 208, 0, 224, 156, 154, 10, 96, 16, 32, 100, 247, 253, 251, 224, 35, 0, 70, 152, 153, 10, 104, 11,
43, 0, 209, 89, 75, 110, 154, 7, 70, 65, 96, 19, 49, 2, 208, 116, 75, 108, 73, 104, 120, 27, 154, 14, 28, 30, 54, 4,
147, 13, 0, 179, 88, 203, 32, 128, 70, 153, 70, 75, 67, 83, 2, 0, 146, 15, 66, 131, 217, 4, 70, 73, 240, 1, 248, 104,
154, 14, 144, 15, 42, 0, 209, 0, 224, 167, 155, 11, 153, 13, 70, 155, 7, 75, 14, 27, 70, 108, 0, 182, 157, 12, 147,
16, 28, 23, 52, 77, 150, 9, 154, 15, 28, 62, 66, 151, 217, 0, 28, 22, 4, 50, 12, 19, 33, 87, 70, 154, 68, 105, 35, 0,
112, 11, 33, 40, 35, 67, 112, 33, 68, 107, 120, 27, 33, 0, 112, 99, 14, 43, 112, 163, 14, 18, 12, 43, 112, 227, 113,
161, 113, 226, 114, 97, 10, 43, 70, 82, 73, 71, 113, 35, 113, 101, 114, 34, 123, 139, 154, 13, 66, 147, 216, 69, 35,
3, 66, 89, 70, 136, 75, 69, 153, 7, 96, 11, 154, 10, 104, 19, 43, 0, 208, 115, 155, 17, 51, 1, 43, 15, 220, 34, 147,
17, 43, 12, 221, 1, 35, 12, 147, 17, 153, 10, 104, 11, 43, 0, 208, 0, 231, 103, 70, 65, 49, 2, 209, 144, 154, 17, 42,
0, 221, 141, 72, 52, 33, 1, 247, 254, 251, 196, 70, 128, 40, 0, 219, 1, 75, 54, 70, 152, 32, 10, 247, 253, 251, 96,
231, 128, 154, 7, 96, 19, 155, 17, 51, 1, 43, 15, 221, 220, 70, 65, 15, 203, 34, 1, 64, 83, 6, 27, 14, 24, 231, 49,
32, 250, 0, 64, 247, 253, 251, 78, 28, 35, 51, 16, 0, 155, 74, 42, 24, 235, 96, 90, 32, 100, 247, 253, 251, 69, 231,
209, 70, 75, 43, 0, 208, 182, 34, 10, 70, 81, 146, 1, 34, 87, 70, 75, 67, 75, 68, 106, 33, 0, 145, 2, 146, 3, 145, 4,
72, 25, 153, 13, 70, 90, 148, 0, 247, 254, 252, 64, 70, 128, 40, 0, 221, 7, 33, 87, 68, 105, 120, 11, 43, 0, 208, 5,
74, 25, 70, 144, 231, 157, 70, 66, 42, 0, 219, 154, 70, 81, 26, 123, 4, 27, 12, 31, 74, 13, 155, 9, 88, 210, 70, 145,
47, 0, 208, 144, 70, 75, 67, 115, 25, 173, 68, 155, 231, 99, 75, 11, 153, 7, 34, 1, 96, 11, 66, 83, 70, 152, 231, 139,
70, 67, 43, 0, 219, 136, 32, 1, 230, 230, 70, 192, 19, 112, 129, 85, 19, 112, 129, 76, 19, 114, 73, 152, 19, 112, 128,
32, 19, 112, 128, 28, 0, 15, 66, 64, 19, 112, 129, 84, 255, 255, 253, 102, 0, 0, 16, 1, 255, 255, 216, 234, 71, 112,
70, 192, 181, 0, 75, 4, 176, 129, 28, 1, 104, 24, 247, 252, 254, 187, 176, 1, 188, 1, 71, 0, 19, 112, 129, 92, 181,
0, 75, 9, 28, 1, 176, 129, 104, 24, 247, 252, 254, 167, 40, 0, 208, 2, 176, 1, 188, 2, 71, 8, 72, 4, 33, 0, 247, 252,
254, 254, 32, 100, 247, 253, 250, 209, 231, 251, 19, 112, 129, 92, 19, 112, 128, 192, 181, 0, 176, 129, 247, 252, 254,
150, 176, 1, 188, 1, 71, 0, 70, 192, 181, 0, 176, 129, 247, 252, 254, 142, 176, 1, 188, 1, 71, 0, 70, 192, 181, 0, 176,
129, 247, 252, 254, 134, 176, 1, 188, 1, 71, 0, 70, 192, 181, 16, 28, 4, 247, 252, 254, 94, 28, 32, 188, 16, 188, 2,
71, 8, 181, 16, 28, 4, 247, 252, 254, 86, 28, 32, 188, 16, 188, 2, 71, 8, 181, 16, 28, 4, 247, 252, 254, 78, 28, 32,
188, 16, 188, 2, 71, 8, 181, 0, 33, 192, 176, 129, 72, 5, 2, 9, 247, 252, 254, 63, 75, 4, 176, 1, 96, 24, 32, 0, 188,
2, 71, 8, 70, 192, 19, 112, 137, 128, 19, 112, 129, 92, 181, 112, 176, 132, 28, 13, 28, 6, 247, 255, 252, 126, 76, 14,
28, 32, 247, 253, 251, 94, 75, 13, 28, 2, 96, 24, 40, 0, 209, 4, 32, 0, 176, 4, 188, 112, 188, 2, 71, 8, 104, 35, 72,
9, 146, 0, 33, 0, 34, 0, 149, 1, 146, 2, 240, 0, 250, 227, 40, 0, 208, 239, 28, 49, 240, 0, 249, 32, 231, 236, 70, 192,
19, 112, 129, 100, 19, 112, 129, 96, 19, 112, 52, 13, 181, 48, 28, 20, 28, 8, 176, 129, 28, 17, 28, 26, 28, 29, 247,
255, 254, 41, 40, 0, 209, 4, 32, 1, 176, 1, 188, 48, 188, 2, 71, 8, 75, 4, 28, 40, 104, 27, 28, 25, 67, 97, 247, 252,
254, 23, 32, 0, 231, 242, 70, 192, 19, 112, 129, 100, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 133,
144, 1, 104, 6, 28, 21, 106, 112, 70, 152, 28, 10, 30, 131, 64, 218, 4, 19, 12, 27, 147, 2, 122, 50, 26, 128, 144, 3,
106, 51, 104, 116, 59, 1, 64, 211, 70, 155, 58, 2, 28, 11, 64, 211, 70, 95, 64, 31, 155, 1, 8, 162, 104, 88, 155, 2,
58, 1, 51, 128, 0, 91, 90, 195, 70, 153, 64, 17, 208, 0, 224, 114, 70, 170, 69, 160, 211, 53, 122, 49, 70, 69, 64, 205,
106, 50, 25, 235, 66, 147, 216, 60, 70, 74, 42, 0, 208, 61, 154, 3, 106, 241, 70, 75, 64, 147, 24, 121, 24, 201, 107,
52, 107, 176, 28, 42, 70, 83, 240, 0, 248, 183, 28, 4, 40, 0, 209, 32, 122, 51, 28, 42, 64, 154, 28, 19, 70, 66, 26,
210, 25, 127, 70, 144, 68, 154, 69, 187, 210, 14, 42, 0, 208, 12, 155, 2, 39, 0, 51, 1, 4, 27, 12, 27, 147, 2, 155,
1, 104, 90, 155, 2, 51, 128, 0, 91, 90, 211, 70, 153, 104, 116, 69, 160, 210, 201, 70, 66, 42, 0, 209, 31, 36, 0, 176,
5, 28, 32, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 27, 213, 70, 74, 42, 0, 209, 193, 28,
42, 64, 138, 70, 80, 33, 0, 240, 0, 255, 122, 122, 51, 28, 42, 64, 154, 28, 19, 70, 66, 26, 210, 70, 144, 68, 154, 25,
127, 104, 116, 231, 164, 70, 75, 43, 0, 208, 55, 154, 3, 106, 241, 64, 147, 24, 121, 24, 201, 107, 52, 107, 176, 108,
243, 34, 1, 240, 0, 248, 102, 28, 4, 40, 0, 209, 207, 108, 241, 70, 80, 70, 66, 240, 0, 255, 21, 231, 201, 0, 137, 70,
138, 43, 0, 208, 71, 154, 3, 106, 241, 64, 147, 24, 121, 24, 201, 107, 52, 107, 176, 108, 243, 34, 1, 240, 0, 248, 78,
28, 4, 40, 0, 209, 183, 104, 115, 70, 82, 26, 156, 69, 160, 210, 19, 108, 241, 28, 40, 68, 81, 70, 66, 240, 0, 254,
247, 68, 69, 35, 0, 70, 170, 55, 1, 70, 152, 104, 116, 231, 105, 70, 80, 33, 0, 70, 66, 240, 0, 255, 47, 36, 0, 231,
158, 108, 241, 28, 40, 68, 81, 28, 34, 240, 0, 254, 227, 70, 67, 27, 27, 25, 45, 55, 1, 70, 152, 70, 170, 69, 95, 216,
0, 231, 136, 43, 0, 209, 0, 231, 133, 155, 2, 39, 0, 51, 1, 4, 27, 12, 27, 147, 2, 155, 1, 104, 116, 104, 90, 155, 2,
51, 128, 0, 91, 90, 211, 70, 153, 231, 65, 26, 100, 69, 68, 217, 0, 70, 68, 28, 40, 28, 34, 33, 0, 240, 0, 255, 3, 70,
67, 27, 27, 25, 45, 70, 152, 70, 170, 55, 1, 104, 116, 231, 48, 71, 32, 181, 240, 70, 87, 70, 70, 180, 192, 35, 72,
90, 194, 122, 3, 176, 129, 65, 26, 70, 144, 143, 130, 28, 6, 70, 138, 42, 0, 208, 32, 37, 0, 39, 0, 224, 3, 53, 1, 68,
71, 66, 170, 217, 25, 104, 51, 25, 91, 123, 27, 43, 0, 208, 246, 106, 241, 34, 1, 49, 1, 24, 121, 107, 176, 108, 243,
107, 52, 240, 0, 248, 72, 108, 241, 70, 80, 34, 6, 240, 0, 254, 97, 40, 0, 208, 14, 143, 178, 53, 1, 68, 71, 66, 170,
216, 229, 34, 0, 70, 146, 176, 1, 70, 80, 188, 12, 70, 144, 70, 154, 188, 240, 188, 2, 71, 8, 32, 12, 247, 252, 253,
117, 70, 130, 40, 0, 208, 33, 70, 82, 96, 22, 96, 149, 35, 72, 90, 240, 247, 252, 253, 107, 70, 82, 28, 3, 96, 80, 40,
0, 208, 11, 106, 241, 107, 176, 49, 1, 25, 201, 107, 52, 70, 66, 240, 0, 248, 24, 109, 51, 51, 1, 101, 51, 231, 217,
72, 7, 73, 8, 247, 252, 253, 22, 70, 80, 247, 252, 253, 71, 35, 0, 70, 154, 231, 207, 72, 2, 73, 3, 247, 252, 253, 12,
231, 202, 70, 192, 19, 112, 128, 224, 19, 112, 128, 236, 71, 32, 70, 192, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68,
180, 240, 176, 129, 70, 139, 153, 10, 70, 130, 32, 84, 70, 145, 28, 31, 70, 136, 247, 252, 253, 52, 28, 5, 47, 0, 209,
85, 32, 128, 0, 128, 247, 252, 253, 45, 35, 128, 2, 27, 97, 43, 70, 66, 35, 15, 117, 43, 23, 211, 12, 91, 68, 67, 19,
219, 67, 123, 97, 171, 75, 137, 96, 40, 97, 235, 155, 11, 28, 6, 98, 235, 153, 12, 41, 0, 208, 62, 33, 0, 28, 58, 240,
0, 254, 92, 35, 87, 112, 51, 35, 66, 112, 115, 35, 70, 112, 179, 35, 83, 28, 60, 112, 243, 47, 0, 209, 0, 224, 232,
35, 0, 51, 1, 6, 27, 8, 100, 14, 27, 44, 0, 209, 249, 59, 1, 6, 27, 14, 27, 70, 66, 114, 51, 14, 19, 113, 51, 12, 19,
113, 115, 10, 19, 113, 179, 113, 242, 105, 170, 75, 115, 66, 154, 216, 0, 224, 215, 75, 114, 66, 154, 216, 0, 224, 213,
75, 113, 66, 154, 216, 0, 224, 211, 75, 112, 66, 154, 216, 0, 224, 209, 75, 111, 66, 154, 216, 0, 224, 207, 34, 11,
125, 43, 24, 211, 114, 115, 224, 7, 28, 56, 231, 169, 70, 72, 153, 11, 34, 1, 28, 51, 240, 0, 248, 221, 120, 51, 120,
114, 6, 27, 4, 18, 67, 26, 120, 179, 2, 27, 67, 19, 120, 242, 67, 26, 75, 99, 66, 154, 208, 0, 224, 167, 75, 98, 104,
27, 66, 92, 65, 92, 44, 0, 208, 24, 47, 0, 208, 0, 224, 116, 44, 0, 208, 19, 70, 65, 41, 0, 208, 16, 121, 50, 121, 115,
6, 18, 4, 27, 67, 19, 121, 178, 2, 18, 67, 26, 121, 243, 67, 19, 69, 67, 208, 4, 72, 86, 73, 86, 247, 252, 252, 103,
224, 112, 122, 51, 36, 1, 28, 39, 64, 159, 96, 111, 122, 51, 105, 41, 114, 43, 121, 51, 121, 114, 6, 27, 4, 18, 67,
26, 121, 179, 121, 240, 2, 27, 67, 19, 67, 24, 96, 232, 240, 0, 252, 207, 28, 57, 67, 65, 97, 169, 122, 114, 125, 43,
64, 148, 98, 106, 26, 210, 105, 235, 64, 209, 64, 211, 4, 27, 12, 27, 4, 58, 133, 107, 12, 18, 51, 128, 133, 41, 0,
91, 30, 81, 24, 201, 66, 82, 64, 17, 35, 72, 82, 233, 70, 91, 99, 107, 141, 43, 70, 82, 99, 42, 8, 219, 122, 42, 98,
44, 26, 228, 70, 73, 64, 212, 99, 169, 100, 44, 153, 12, 41, 0, 209, 58, 100, 105, 35, 72, 90, 233, 108, 40, 65, 17,
56, 1, 240, 0, 252, 158, 104, 106, 4, 0, 28, 19, 12, 0, 59, 12, 135, 168, 66, 152, 217, 0, 135, 171, 28, 16, 247, 252,
252, 84, 35, 0, 100, 232, 101, 43, 176, 1, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71,
8, 122, 51, 28, 58, 70, 156, 33, 0, 28, 75, 6, 27, 8, 82, 28, 8, 14, 25, 42, 0, 209, 248, 69, 96, 209, 0, 231, 124,
72, 29, 73, 30, 247, 252, 251, 245, 28, 40, 247, 252, 252, 38, 28, 48, 247, 252, 252, 35, 37, 0, 231, 219, 30, 120,
24, 192, 66, 123, 64, 24, 247, 252, 252, 39, 141, 42, 100, 104, 8, 210, 33, 255, 240, 0, 253, 105, 122, 42, 231, 183,
35, 255, 231, 30, 72, 15, 73, 17, 247, 252, 251, 217, 231, 226, 34, 6, 231, 54, 34, 7, 231, 52, 34, 8, 231, 50, 34,
9, 231, 48, 34, 10, 231, 46, 0, 4, 96, 144, 0, 63, 255, 255, 0, 127, 255, 255, 0, 255, 255, 255, 1, 255, 255, 255, 3,
255, 255, 255, 87, 66, 70, 83, 19, 112, 129, 104, 19, 112, 128, 224, 19, 112, 129, 44, 19, 112, 129, 12, 19, 112, 129,
0, 71, 80, 70, 192, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 177, 144, 14, 28, 24, 145, 13, 146, 12,
147, 11, 247, 252, 251, 230, 28, 5, 33, 0, 152, 12, 34, 1, 28, 43, 156, 14, 240, 0, 251, 94, 40, 0, 208, 0, 226, 173,
38, 223, 172, 32, 0, 118, 25, 169, 28, 32, 34, 64, 240, 0, 252, 215, 32, 1, 66, 64, 33, 0, 145, 17, 144, 16, 35, 227,
120, 42, 0, 91, 24, 235, 120, 110, 120, 232, 70, 163, 70, 148, 120, 172, 73, 217, 147, 10, 34, 228, 75, 216, 0, 82,
24, 105, 24, 170, 24, 235, 145, 9, 146, 8, 147, 7, 33, 235, 74, 213, 35, 236, 0, 73, 0, 91, 24, 105, 24, 170, 24, 235,
145, 6, 146, 5, 147, 4, 70, 90, 122, 82, 70, 89, 122, 9, 70, 91, 70, 144, 70, 98, 70, 137, 122, 159, 122, 217, 6, 19,
4, 50, 67, 26, 2, 35, 70, 138, 67, 19, 73, 201, 67, 3, 66, 139, 209, 0, 226, 159, 70, 91, 121, 25, 41, 0, 209, 0, 226,
97, 70, 68, 4, 58, 2, 35, 67, 19, 70, 78, 70, 80, 67, 51, 6, 2, 67, 19, 70, 152, 41, 15, 208, 0, 226, 104, 28, 25, 152,
12, 34, 1, 28, 43, 156, 14, 240, 0, 251, 1, 40, 0, 208, 0, 226, 80, 158, 7, 152, 9, 120, 50, 120, 3, 153, 10, 2, 27,
6, 18, 67, 26, 156, 8, 120, 11, 152, 6, 67, 26, 120, 0, 120, 35, 153, 5, 144, 18, 4, 27, 67, 26, 120, 9, 70, 70, 75,
175, 24, 183, 154, 4, 145, 19, 24, 235, 120, 18, 147, 15, 120, 28, 70, 146, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14,
70, 161, 240, 0, 250, 218, 40, 0, 208, 0, 226, 40, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35,
120, 232, 67, 19, 73, 159, 67, 3, 66, 139, 209, 0, 226, 91, 153, 19, 70, 82, 4, 19, 2, 10, 67, 19, 154, 18, 70, 73,
67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 226, 6, 70, 66, 24, 140, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 250,
178, 40, 0, 208, 0, 226, 0, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6,
67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145, 20, 120, 18, 120, 27, 120, 36, 70, 145,
70, 154, 148, 21, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 250, 141, 40, 0, 208, 0, 225, 219, 120, 40, 120,
110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232, 67, 19, 73, 121, 67, 3, 66, 139, 209, 0, 226, 26, 70,
82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 20, 153, 21, 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 225, 185, 70, 66, 24, 140,
152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 250, 101, 40, 0, 208, 0, 225, 179, 152, 9, 153, 8, 120, 2, 120, 11,
158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154,
5, 156, 15, 145, 22, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 23, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14,
240, 0, 250, 64, 40, 0, 208, 0, 225, 142, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232,
67, 19, 73, 82, 67, 3, 66, 139, 209, 0, 225, 217, 70, 82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 22, 153, 23, 67, 19, 6,
10, 28, 25, 67, 17, 209, 0, 225, 108, 70, 66, 24, 140, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 250, 24, 40,
0, 208, 0, 225, 102, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26,
120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145, 24, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154,
148, 25, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 249, 243, 40, 0, 208, 0, 225, 65, 120, 40, 120, 110, 120,
172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232, 67, 19, 73, 44, 67, 3, 66, 139, 209, 0, 225, 152, 70, 82, 70, 73,
4, 19, 2, 10, 67, 19, 154, 24, 153, 25, 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 225, 31, 70, 66, 24, 140, 152, 12, 28,
33, 34, 1, 28, 43, 158, 14, 240, 0, 249, 203, 40, 0, 208, 0, 225, 25, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27,
2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145,
26, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 27, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 249, 166,
40, 0, 208, 0, 224, 244, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232, 67, 19, 73, 5,
67, 3, 66, 139, 209, 0, 225, 27, 224, 9, 0, 0, 1, 199, 0, 0, 1, 201, 0, 0, 1, 215, 87, 66, 70, 83, 0, 0, 1, 217, 70,
82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 26, 153, 27, 67, 19, 6, 10, 28, 25, 67, 17, 209, 0, 224, 199, 70, 66, 24, 140,
152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 249, 115, 40, 0, 208, 0, 224, 193, 152, 9, 153, 8, 120, 2, 120, 11,
158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9, 6, 27, 67, 26, 24, 167, 155, 4, 154,
5, 156, 15, 145, 28, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 29, 152, 12, 28, 57, 34, 1, 28, 43, 158, 14,
240, 0, 249, 78, 40, 0, 208, 0, 224, 156, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26, 70, 132, 2, 35, 120, 232,
67, 19, 73, 158, 67, 3, 66, 139, 209, 0, 224, 255, 70, 82, 70, 73, 4, 19, 2, 10, 67, 19, 154, 28, 153, 29, 67, 19, 6,
10, 28, 25, 67, 17, 208, 123, 70, 66, 24, 140, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0, 249, 39, 40, 0, 209,
118, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 153, 6, 67, 26, 120, 3, 120, 9,
6, 27, 67, 26, 24, 167, 155, 4, 154, 5, 156, 15, 145, 30, 120, 18, 120, 27, 120, 36, 70, 145, 70, 154, 148, 31, 152,
12, 28, 57, 34, 1, 28, 43, 158, 14, 240, 0, 249, 3, 40, 0, 209, 82, 120, 40, 120, 110, 120, 172, 6, 3, 4, 50, 67, 26,
70, 132, 2, 35, 120, 232, 67, 19, 73, 121, 67, 3, 66, 139, 209, 0, 224, 193, 70, 82, 70, 73, 4, 19, 2, 10, 67, 19, 154,
30, 153, 31, 67, 19, 6, 10, 28, 25, 67, 17, 208, 49, 70, 66, 24, 84, 152, 12, 28, 33, 34, 1, 28, 43, 158, 14, 240, 0,
248, 221, 40, 0, 209, 44, 152, 9, 153, 8, 120, 2, 120, 11, 158, 10, 4, 27, 2, 18, 67, 26, 152, 7, 120, 51, 67, 26, 120,
3, 152, 12, 6, 27, 67, 26, 24, 167, 28, 57, 34, 1, 28, 43, 156, 14, 240, 0, 248, 196, 40, 0, 209, 20, 120, 46, 120,
172, 6, 51, 70, 180, 120, 110, 120, 232, 4, 50, 67, 26, 2, 35, 67, 19, 73, 90, 67, 3, 66, 139, 209, 0, 224, 143, 171,
44, 69, 155, 208, 2, 33, 16, 68, 139, 229, 125, 28, 40, 247, 252, 249, 30, 36, 0, 176, 49, 28, 32, 188, 60, 70, 144,
70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 28, 25, 152, 12, 34, 1, 28, 43, 156, 14, 240, 0, 248, 152, 28, 1,
40, 0, 209, 231, 120, 46, 120, 172, 6, 51, 70, 180, 120, 110, 120, 232, 4, 50, 67, 26, 2, 35, 67, 19, 74, 68, 67, 3,
66, 147, 209, 211, 155, 17, 154, 59, 66, 147, 208, 124, 153, 16, 69, 136, 208, 204, 154, 17, 70, 67, 50, 1, 146, 17,
147, 16, 231, 198, 70, 90, 121, 17, 229, 97, 154, 59, 155, 17, 66, 154, 208, 92, 153, 16, 66, 185, 209, 0, 230, 230,
51, 1, 147, 17, 151, 16, 230, 226, 154, 59, 155, 17, 66, 154, 208, 80, 153, 16, 66, 185, 209, 0, 229, 155, 51, 1, 147,
17, 151, 16, 229, 151, 154, 59, 155, 17, 66, 154, 208, 68, 153, 16, 66, 185, 209, 0, 229, 220, 51, 1, 147, 17, 151,
16, 229, 216, 154, 59, 155, 17, 66, 154, 208, 56, 153, 16, 66, 185, 209, 0, 230, 29, 51, 1, 147, 17, 151, 16, 230, 25,
154, 59, 155, 17, 66, 154, 208, 44, 153, 16, 66, 185, 209, 0, 230, 94, 51, 1, 147, 17, 151, 16, 230, 90, 154, 59, 155,
17, 66, 154, 208, 32, 153, 16, 66, 185, 209, 0, 230, 247, 51, 1, 147, 17, 151, 16, 230, 243, 154, 59, 155, 17, 66, 154,
208, 20, 153, 16, 66, 185, 209, 0, 231, 53, 51, 1, 147, 17, 151, 16, 231, 49, 154, 59, 155, 17, 66, 154, 208, 8, 153,
16, 66, 143, 209, 0, 231, 103, 154, 17, 151, 16, 50, 1, 146, 17, 231, 98, 35, 0, 147, 0, 151, 1, 156, 60, 152, 14, 153,
13, 154, 12, 155, 11, 148, 2, 247, 255, 251, 71, 28, 4, 28, 40, 247, 252, 248, 123, 231, 92, 70, 67, 145, 0, 147, 1,
231, 238, 87, 66, 70, 83, 71, 32, 71, 48, 230, 0, 0, 16, 225, 47, 255, 30, 230, 0, 0, 48, 225, 47, 255, 30, 230, 0,
0, 80, 225, 47, 255, 30, 230, 0, 0, 112, 225, 47, 255, 30, 230, 0, 0, 144, 225, 47, 255, 30, 230, 0, 0, 176, 225, 47,
255, 30, 230, 0, 0, 208, 225, 47, 255, 30, 230, 0, 0, 240, 225, 47, 255, 30, 230, 0, 1, 16, 225, 47, 255, 30, 230, 0,
1, 48, 225, 47, 255, 30, 230, 0, 1, 80, 225, 47, 255, 30, 230, 0, 1, 112, 225, 47, 255, 30, 230, 0, 1, 144, 225, 47,
255, 30, 230, 0, 1, 176, 225, 47, 255, 30, 230, 0, 1, 208, 225, 47, 255, 30, 230, 0, 1, 240, 225, 47, 255, 30, 230,
0, 2, 16, 225, 47, 255, 30, 230, 0, 2, 48, 225, 47, 255, 30, 230, 0, 2, 80, 225, 47, 255, 30, 230, 0, 2, 112, 225, 47,
255, 30, 230, 0, 2, 144, 225, 47, 255, 30, 230, 0, 2, 176, 225, 47, 255, 30, 230, 0, 2, 208, 225, 47, 255, 30, 230,
0, 2, 240, 225, 47, 255, 30, 230, 0, 3, 16, 225, 47, 255, 30, 230, 0, 3, 48, 225, 47, 255, 30, 230, 0, 3, 80, 225, 47,
255, 30, 230, 0, 3, 112, 225, 47, 255, 30, 230, 0, 3, 144, 225, 47, 255, 30, 230, 0, 3, 176, 225, 47, 255, 30, 230,
0, 3, 208, 225, 47, 255, 30, 230, 0, 3, 240, 225, 47, 255, 30, 230, 0, 4, 16, 225, 47, 255, 30, 230, 0, 4, 48, 225,
47, 255, 30, 230, 0, 4, 80, 225, 47, 255, 30, 230, 0, 4, 112, 225, 47, 255, 30, 230, 0, 4, 144, 225, 47, 255, 30, 230,
0, 4, 176, 225, 47, 255, 30, 230, 0, 4, 208, 225, 47, 255, 30, 230, 0, 4, 240, 225, 47, 255, 30, 230, 0, 5, 16, 225,
47, 255, 30, 230, 0, 5, 48, 225, 47, 255, 30, 230, 0, 5, 80, 225, 47, 255, 30, 230, 0, 6, 144, 225, 47, 255, 30, 230,
0, 7, 240, 225, 47, 255, 30, 230, 0, 8, 16, 225, 47, 255, 30, 230, 0, 10, 16, 225, 47, 255, 30, 41, 0, 208, 52, 35,
1, 34, 0, 180, 16, 66, 136, 211, 44, 36, 1, 7, 36, 66, 161, 210, 4, 66, 129, 210, 2, 1, 9, 1, 27, 231, 248, 0, 228,
66, 161, 210, 4, 66, 129, 210, 2, 0, 73, 0, 91, 231, 248, 66, 136, 211, 1, 26, 64, 67, 26, 8, 76, 66, 160, 211, 2, 27,
0, 8, 92, 67, 34, 8, 140, 66, 160, 211, 2, 27, 0, 8, 156, 67, 34, 8, 204, 66, 160, 211, 2, 27, 0, 8, 220, 67, 34, 40,
0, 208, 3, 9, 27, 208, 1, 9, 9, 231, 227, 28, 16, 188, 16, 71, 112, 181, 2, 240, 0, 248, 94, 32, 0, 188, 6, 71, 16,
70, 192, 181, 3, 247, 255, 255, 191, 188, 14, 67, 66, 26, 137, 71, 24, 70, 192, 41, 0, 208, 65, 180, 16, 28, 4, 64,
76, 70, 164, 35, 1, 34, 0, 41, 0, 213, 0, 66, 73, 40, 0, 213, 0, 66, 64, 66, 136, 211, 44, 36, 1, 7, 36, 66, 161, 210,
4, 66, 129, 210, 2, 1, 9, 1, 27, 231, 248, 0, 228, 66, 161, 210, 4, 66, 129, 210, 2, 0, 73, 0, 91, 231, 248, 66, 136,
211, 1, 26, 64, 67, 26, 8, 76, 66, 160, 211, 2, 27, 0, 8, 92, 67, 34, 8, 140, 66, 160, 211, 2, 27, 0, 8, 156, 67, 34,
8, 204, 66, 160, 211, 2, 27, 0, 8, 220, 67, 34, 40, 0, 208, 3, 9, 27, 208, 1, 9, 9, 231, 227, 28, 16, 70, 100, 44, 0,
213, 0, 66, 64, 188, 16, 71, 112, 181, 2, 240, 0, 248, 11, 32, 0, 188, 6, 71, 16, 181, 3, 247, 255, 255, 179, 188, 14,
67, 66, 26, 137, 71, 24, 70, 192, 71, 112, 70, 192, 181, 112, 28, 14, 28, 21, 28, 4, 42, 3, 217, 32, 28, 51, 67, 3,
7, 154, 208, 18, 120, 35, 120, 8, 66, 131, 209, 27, 30, 106, 224, 6, 52, 1, 49, 1, 120, 35, 120, 8, 58, 1, 66, 131,
209, 18, 42, 0, 209, 246, 32, 0, 188, 112, 188, 2, 71, 8, 104, 2, 104, 11, 66, 154, 209, 4, 61, 4, 48, 4, 49, 4, 45,
3, 216, 246, 28, 4, 45, 0, 209, 224, 231, 238, 26, 24, 231, 237, 181, 240, 28, 7, 28, 14, 28, 4, 28, 21, 28, 8, 28,
17, 42, 15, 217, 3, 28, 51, 67, 59, 7, 154, 208, 11, 41, 0, 208, 5, 34, 0, 92, 131, 84, 163, 50, 1, 66, 138, 209, 250,
28, 56, 188, 240, 188, 2, 71, 8, 28, 58, 28, 49, 28, 40, 104, 11, 96, 19, 104, 75, 96, 83, 104, 139, 96, 147, 104, 203,
56, 16, 96, 211, 49, 16, 50, 16, 40, 15, 216, 242, 28, 43, 59, 16, 9, 26, 1, 17, 50, 1, 1, 18, 26, 89, 24, 176, 24,
188, 41, 3, 217, 216, 34, 0, 88, 131, 80, 163, 50, 4, 26, 139, 43, 3, 216, 249, 31, 11, 8, 154, 0, 145, 50, 1, 0, 146,
26, 89, 24, 128, 24, 164, 231, 200, 181, 240, 28, 7, 70, 140, 28, 16, 28, 57, 7, 186, 208, 14, 40, 0, 208, 73, 70, 98,
6, 19, 56, 1, 14, 27, 34, 3, 224, 2, 40, 0, 208, 65, 56, 1, 112, 11, 49, 1, 66, 17, 209, 248, 28, 5, 28, 10, 40, 3,
217, 46, 35, 255, 70, 98, 64, 26, 2, 19, 67, 19, 4, 26, 28, 20, 28, 14, 67, 28, 40, 15, 217, 18, 28, 2, 28, 11, 58,
16, 96, 28, 96, 92, 96, 156, 96, 220, 51, 16, 42, 15, 216, 247, 28, 3, 59, 16, 28, 29, 9, 27, 51, 1, 34, 15, 1, 27,
64, 21, 24, 206, 45, 3, 217, 13, 34, 0, 80, 180, 50, 4, 26, 171, 43, 3, 216, 250, 31, 43, 28, 29, 8, 155, 51, 1, 34,
3, 0, 155, 64, 21, 24, 246, 28, 50, 45, 0, 208, 7, 70, 97, 6, 11, 14, 25, 35, 0, 84, 209, 51, 1, 66, 157, 209, 251,
28, 56, 188, 240, 188, 2, 71, 8, 70, 192, 181, 48, 28, 11, 67, 3, 7, 154, 209, 28, 104, 2, 104, 11, 66, 154, 209, 24,
76, 16, 25, 19, 67, 147, 74, 15, 66, 19, 209, 11, 28, 20, 48, 4, 49, 4, 104, 2, 104, 11, 66, 154, 209, 11, 77, 9, 25,
83, 67, 147, 66, 35, 208, 244, 32, 0, 224, 9, 120, 10, 66, 154, 209, 5, 48, 1, 49, 1, 120, 3, 43, 0, 209, 247, 120,
10, 26, 152, 188, 48, 188, 2, 71, 8, 254, 254, 254, 255, 128, 128, 128, 128, 181, 48, 28, 4, 7, 129, 208, 10, 120, 3,
43, 0, 208, 33, 34, 3, 224, 2, 120, 3, 43, 0, 208, 24, 48, 1, 66, 16, 209, 249, 104, 2, 77, 13, 25, 83, 67, 147, 74,
13, 66, 19, 209, 11, 28, 17, 48, 4, 104, 2, 77, 9, 25, 83, 67, 147, 66, 11, 208, 248, 120, 3, 43, 0, 208, 3, 48, 1,
120, 3, 43, 0, 209, 251, 27, 0, 188, 48, 188, 2, 71, 8, 32, 0, 231, 250, 70, 192, 254, 254, 254, 255, 128, 128, 128,
128, 73, 79, 83, 32, 109, 111, 100, 117, 108, 101, 0, 0, 0, 0, 0, 1, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 19, 114, 74, 60, 0, 15, 66, 64, 47, 100, 101, 118, 47, 102, 97, 116, 47, 108, 111, 103, 0, 0, 0, 0, 87, 66,
70, 83, 32, 110, 111, 116, 32, 101, 110, 111, 117, 103, 104, 32, 109, 101, 109, 111, 114, 121, 33, 0, 101, 104, 99,
32, 108, 111, 111, 112, 32, 101, 110, 116, 114, 121, 0, 0, 47, 100, 101, 118, 47, 117, 115, 98, 47, 101, 104, 99, 0,
0, 0, 0, 47, 100, 101, 118, 47, 117, 115, 98, 47, 101, 104, 99, 47, 0, 0, 0, 85, 77, 83, 32, 73, 110, 105, 116, 0, 0,
0, 0, 87, 66, 70, 83, 32, 79, 112, 101, 110, 40, 41, 0, 85, 77, 83, 32, 102, 97, 105, 108, 0, 0, 0, 0, 47, 100, 101,
118, 47, 109, 108, 111, 97, 100, 0, 0, 85, 83, 66, 83, 116, 111, 114, 97, 103, 101, 95, 67, 108, 111, 115, 101, 40,
41, 0, 0, 85, 83, 66, 32, 65, 108, 108, 111, 99, 58, 32, 110, 111, 116, 32, 101, 110, 111, 117, 103, 104, 32, 109, 101,
109, 111, 114, 121, 33, 0, 0, 0, 119, 98, 102, 115, 32, 101, 114, 114, 111, 114, 0, 0, 97, 108, 108, 111, 99, 97, 116,
105, 110, 103, 32, 109, 101, 109, 111, 114, 121, 0, 0, 0, 98, 97, 100, 32, 109, 97, 103, 105, 99, 0, 0, 0, 104, 100,
32, 115, 101, 99, 116, 111, 114, 32, 115, 105, 122, 101, 32, 100, 111, 101, 115, 110, 39, 116, 32, 109, 97, 116, 99,
104, 0, 0, 0, 0, 104, 100, 32, 110, 117, 109, 32, 115, 101, 99, 116, 111, 114, 32, 100, 111, 101, 115, 110, 39, 116,
32, 109, 97, 116, 99, 104, 0
};

3
source/ehcmodule.h Normal file
View File

@ -0,0 +1,3 @@
#define size_ehcmodule 18412
extern unsigned char ehcmodule[18412];

View File

@ -25,42 +25,131 @@ static u8 size_to_shift(u32 size)
size>>=1;
}
return ret-1;
}
}
#define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24))
wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
rw_sector_callback_t write_hdsector,
void *callback_data,
int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
{
int i=num_hd_sector,ret;
u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size);
u8 part_table[16*4];
ret = read_hdsector(callback_data,0,1,tmp_buffer);
if(ret)
return 0;
//find wbfs partition
wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4);
ptr = part_table;
for(i=0;i<4;i++,ptr+=16)
{
u32 part_lba = read_le32_unaligned(ptr+0x8);
wbfs_head_t *head = (wbfs_head_t *)tmp_buffer;
ret = read_hdsector(callback_data,part_lba,1,tmp_buffer);
// verify there is the magic.
if (head->magic == wbfs_htonl(WBFS_MAGIC))
{
wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
callback_data,hd_sector_size,0,part_lba,reset);
return p;
}
}
if(reset)// XXX make a empty hd partition..
{
}
return 0;
}
u32 WBFS_part_list[4]={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
u32 wbfs_get_partition_LBA(int index)
{
return WBFS_part_list[index & 3];
}
wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
rw_sector_callback_t write_hdsector,
void *callback_data,
int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
{
int i=num_hd_sector,ret;
u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size);
u8 part_table[16*4];
int l;
ret = read_hdsector(callback_data,0,1,tmp_buffer);
if(ret)
{
wbfs_iofree(tmp_buffer);
return 0;
}
//find wbfs partition
wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4);
ptr = part_table;
for(l=0;l<4;l++) WBFS_part_list[l]=0xFFFFFFFF;
l=0;
for(i=0;i<4;i++,ptr+=16)
{
u32 part_lba = read_le32_unaligned(ptr+0x8);
wbfs_head_t *head = (wbfs_head_t *)tmp_buffer;
#if 1
if(head->magic != wbfs_htonl(WBFS_MAGIC))
if(ptr[4]==0) continue;
if(ptr[4]==0xf)
{
u32 part_lba2=part_lba;
u32 next_lba2=0;
int n;
for(n=0;n<8;n++) // max 8 logic partitions (i think it is sufficient!)
{
ret = read_hdsector(callback_data,part_lba+next_lba2 ,1,tmp_buffer);
if(ret)
{
wbfs_iofree(tmp_buffer);
return 0;
}
part_lba2=part_lba+next_lba2+read_le32_unaligned(tmp_buffer+0x1C6);
next_lba2=read_le32_unaligned(tmp_buffer+0x1D6);
ret = read_hdsector(callback_data,part_lba2,1,tmp_buffer);
if(ret)
{
wbfs_iofree(tmp_buffer);
return 0;
}
// verify there is the magic.
if (head->magic == wbfs_htonl(WBFS_MAGIC))
{
WBFS_part_list[l]=part_lba2;
if(l>0 && WBFS_part_list[l-1]==WBFS_part_list[l]) WBFS_part_list[l]=0xFFFFFFFF;
else l++; if(l>=4) break;
/*wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
callback_data,hd_sector_size,0,part_lba2,reset);
return p;*/
}
if(next_lba2==0) break;
}
}
else
#endif
{
ret = read_hdsector(callback_data,part_lba,1,tmp_buffer);
if(ret)
{
wbfs_iofree(tmp_buffer);
return 0;
}
// verify there is the magic.
if (head->magic == wbfs_htonl(WBFS_MAGIC))
{
WBFS_part_list[l]=part_lba;
if(l>0 && WBFS_part_list[l-1]==WBFS_part_list[l]) WBFS_part_list[l]=0xFFFFFFFF;
else l++; if(l>=4) break;
/*
wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
callback_data,hd_sector_size,0,part_lba,reset);
return p;*/
}
}
if(l>=4) break;
}
wbfs_iofree(tmp_buffer);
if(WBFS_part_list[0]==0xFFFFFFFF) return 0;
// open the first partition finded
wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
callback_data,hd_sector_size,0,WBFS_part_list[0],reset);
return p;
}
wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector,
rw_sector_callback_t write_hdsector,
void *callback_data,

View File

@ -122,6 +122,15 @@ wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
rw_sector_callback_t write_hdsector,
void *callback_data,
int hd_sector_size, int num_hd_sector, int reset);
/* call wbfs_open_hd at first time to find the WBFS partition on the HDD (max 4 partitions)
wbfs_get_partition_LBA receive 0 to 3 as partition index (first, second...) and return 0xFFFFFFFF if WBFS partition is not finded
*/
u32 wbfs_get_partition_LBA(int index);
/*! @brief open a wbfs partition
@param read_hdsector,write_hdsector: accessors to the partition

View File

@ -14,7 +14,8 @@
#define wbfs_malloc(x) malloc(x)
#define wbfs_free(x) free(x)
#define wbfs_ioalloc(x) memalign(32, x)
#define wbfs_ioalloc(x) memalign(32, x)
#define wbfs_iofree(x) free(x) // XXX should allocate in a ios heap
#define wbfs_iofree(x) free(x)
#define wbfs_be16(x) (*((u16*)(x)))
#define wbfs_be32(x) (*((u32*)(x)))

View File

@ -34,6 +34,7 @@
#include "cfg.h"
#include "language.h"
#include "fat.h"
#include "mload.h"
/* Constants */
@ -69,7 +70,7 @@ main(int argc, char *argv[])
{
s32 ret2;
SDCard_Init(); // mount SD for loading cfg's
USBDevice_Init(); // and mount USB:/
bool bootDevice_found=false;

View File

@ -32,6 +32,7 @@
#include "PromptWindows.h"
#include "Settings.h"
#include "gameinfo.h"
#include "mload.h"
//#include "xml.h" /* XML - Lustar*/
@ -1216,8 +1217,8 @@ static int MenuDiscList()
if (Settings.qboot == yes)//quickboot game
{
wiilight(0);
//////////save game play count////////////////
wiilight(0);
//////////save game play count////////////////
extern u8 favorite;
extern u16 count;
struct Game_NUM* game_num = CFG_get_game_num(header->id);
@ -1241,87 +1242,12 @@ static int MenuDiscList()
}
}
////////////end save play count//////////////
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg)//if there are saved settings for this game use them
{
iosChoice = game_cfg->ios;
menu = MENU_EXIT;
break;
}
else// otherwise use the global settings
{
if(Settings.cios == ios222) {
iosChoice = i222;
} else {
iosChoice = i249;
}
}
int ios2;
switch(iosChoice)
{
case i249:
ios2 = 0;
break;
case i222:
ios2 = 1;
break;
default:
ios2 = 0;
break;
}
// if we have used the network or cios222 we need to reload the disklist
if(networkisinitialized == 1 || ios2 == 1 || Settings.cios == ios222)
{
if(ios2 == 1)
{
ret = Sys_IosReload(222);
if(ret < 0)
{
WindowPrompt(LANGUAGE.YoudonthavecIOS,LANGUAGE.LoadingincIOS,LANGUAGE.ok, 0,0,0);
Sys_IosReload(249);
ios2 = 0;
}
}
else
{
ret = Sys_IosReload(249);
}
}
/* Set USB mode */
ret = Disc_SetUSB(header->id, ios2);
if (ret < 0) {
sprintf(text, "%s %i", LANGUAGE.Error,ret);
WindowPrompt(
LANGUAGE.FailedtosetUSB,
text,
LANGUAGE.ok,0,0,0);
}
else {
/* Open disc */
ret = Disc_Open();
if (ret < 0) {
sprintf(text, "%s %i",LANGUAGE.Error, ret);
WindowPrompt(
LANGUAGE.Failedtoboot,
text,
LANGUAGE.ok,0,0,0);
}
else {
menu = MENU_EXIT;
}
}
break;
}
bool returnHere = true;// prompt to start game
while (returnHere)
{
returnHere = false;
if(Settings.wiilight != 2) wiilight(1);
choice = GameWindowPrompt();
@ -1329,101 +1255,26 @@ static int MenuDiscList()
if(choice == 1)
{
wiilight(0);
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg)//if there are saved settings for this game use them
{
iosChoice = game_cfg->ios;
}
else// otherwise use the global settings
{
if(Settings.cios == ios222) {
iosChoice = i222;
} else {
iosChoice = i249;
}
}
int ios2;
switch(iosChoice)
{
case i249:
ios2 = 0;
break;
case i222:
ios2 = 1;
break;
default:
ios2 = 0;
break;
}
// if we have used the network or cios222 we need to reload the disklist
if(networkisinitialized == 1 || ios2 == 1 || Settings.cios == ios222)
{
if(ios2 == 1)
{
ret = Sys_IosReload(222);
if(ret < 0)
{
WindowPrompt(LANGUAGE.YoudonthavecIOS,LANGUAGE.LoadingincIOS,LANGUAGE.ok, 0,0,0);
Sys_IosReload(249);
ios2 = 0;
}
}
else
{
ret = Sys_IosReload(249);
}
}
/* Set USB mode */
ret = Disc_SetUSB(header->id, ios2);
if (ret < 0) {
sprintf(text, "%s %i", LANGUAGE.Error, ret);
WindowPrompt(
LANGUAGE.FailedtosetUSB,
text,
LANGUAGE.ok,0,0,0);
}
else {
/* Open disc */
ret = Disc_Open();
if (ret < 0) {
sprintf(text, "%s %i",LANGUAGE.Error, ret);
WindowPrompt(
LANGUAGE.Failedtoboot,
text,
LANGUAGE.ok,0,0,0);
}
else {
menu = MENU_EXIT;
}
}
returnHere = false;
menu = MENU_EXIT;
}
else if (choice == 2)
{
wiilight(0);
HaltGui();
if (Settings.gameDisplay==list) mainWindow->Remove(gameBrowser);
else if (Settings.gameDisplay==grid) mainWindow->Remove(gameGrid);
else if (Settings.gameDisplay==carousel) mainWindow->Remove(gameCarousel);
mainWindow->Remove(&w);
ResumeGui();
if (Settings.gameDisplay==list) mainWindow->Remove(gameBrowser);
else if (Settings.gameDisplay==grid) mainWindow->Remove(gameGrid);
else if (Settings.gameDisplay==carousel) mainWindow->Remove(gameCarousel);
mainWindow->Remove(&w);
ResumeGui();
int settret = GameSettings(header);
HaltGui();
if (Settings.gameDisplay==list) mainWindow->Append(gameBrowser);
else if (Settings.gameDisplay==grid) mainWindow->Append(gameGrid);
else if (Settings.gameDisplay==carousel) mainWindow->Append(gameCarousel);
mainWindow->Append(&w);
ResumeGui();
if (Settings.gameDisplay==list) mainWindow->Append(gameBrowser);
else if (Settings.gameDisplay==grid) mainWindow->Append(gameGrid);
else if (Settings.gameDisplay==carousel) mainWindow->Append(gameCarousel);
mainWindow->Append(&w);
ResumeGui();
if (settret == 1) //if deleted
{
menu = MENU_DISCLIST;
@ -1446,12 +1297,11 @@ static int MenuDiscList()
menu = MENU_DISCLIST;
}
}
else if(choice == 0)
else if(choice == 0) {
if (Settings.gameDisplay==list){gameBrowser->SetFocus(1);}
else if (Settings.gameDisplay==grid){gameGrid->SetFocus(1);}
else if (Settings.gameDisplay==carousel){gameCarousel->SetFocus(1);}
}
}
}
}
@ -1479,11 +1329,7 @@ static int MenuInstall()
int menu = MENU_NONE;
static struct discHdr headerdisc ATTRIBUTE_ALIGN(32);
if(Settings.cios == ios222) {
Disc_SetUSB(NULL, 1);
} else {
Disc_SetUSB(NULL, 0);
}
Disc_SetUSB(NULL, GetPartition());
int ret, choice = 0;
char *name;
@ -1741,7 +1587,10 @@ static int MenuFormat()
menu = MENU_SETTINGS;
} else {
WBFS_Open();
for(int i = 0; i < 4; i++) {
ret = WBFS_Open2(i);
if(ret == 0) break;
}
sprintf(text, "%s %s", text,LANGUAGE.formated);
WindowPrompt(LANGUAGE.Success,text,LANGUAGE.ok,0,0,0);
menu = MENU_DISCLIST;
@ -1791,7 +1640,7 @@ static int MenuCheck()
int menu = MENU_NONE;
int i = 0;
int choice;
s32 ret, ret2;
s32 ret2;
OptionList options;
options.length = i;
partitionEntry partitions[MAX_PARTITIONS];
@ -1810,26 +1659,10 @@ static int MenuCheck()
} else if(ret2 == 2) {
if(Settings.cios != ios222)
{
//shutdown WiiMote before IOS Reload
WPAD_Flush(0);
WPAD_Disconnect(0);
WPAD_Shutdown();
//shutdown SD and USB before IOS Reload
SDCard_deInit();
USBDevice_deInit();
ret = IOS_ReloadIOS(222);
if(ret < 0)
IOS_ReloadIOS(249);
//reinitialize WiiMote for Prompt
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
//reinitialize SD and USB
SDCard_Init();
USBDevice_Init();
if(ret < 0)
ret2 = Sys_IosReload(222);
if(ret2 < 0)
Sys_IosReload(249);
if(ret2 < 0)
WindowPrompt(LANGUAGE.YoudonthavecIOS,LANGUAGE.LoadingincIOS,LANGUAGE.ok, 0,0,0);
else
Settings.cios = ios222;
@ -1838,21 +1671,7 @@ static int MenuCheck()
Sys_LoadMenu();
}
//shutdown WiiMote before IOS Reload
WPAD_Flush(0);
WPAD_Disconnect(0);
WPAD_Shutdown();
//shutdown SD and USB before IOS Reload in DiscWait
SDCard_deInit();
USBDevice_deInit();
ret2 = DiscWait(LANGUAGE.NoUSBDevice, LANGUAGE.WaitingforUSBDevice, 0, 0, 1);
//reinitialize WiiMote for Prompt
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
//reinitialize SD and USB
SDCard_Init();
USBDevice_Init();
@ -1868,7 +1687,10 @@ static int MenuCheck()
Sys_LoadMenu();
}
ret2 = WBFS_Open();
for(i = 0; i < 4; i++) {
ret2 = WBFS_Open2(i);
if(ret2 == 0) break;
}
if (ret2 < 0) {
choice = WindowPrompt(LANGUAGE.NoWBFSpartitionfound,
LANGUAGE.Youneedtoformatapartition,
@ -1973,8 +1795,8 @@ int MainMenu(int menu)
break;
}
}
ExitGUIThreads();
ExitGUIThreads();
bgMusic->Stop();
delete bgMusic;
@ -1994,28 +1816,62 @@ int MainMenu(int menu)
StopGX();
ShutdownAudio();
SDCard_deInit();
USBDevice_deInit();
int ret = 0;
struct discHdr *header = &gameList[gameSelected];
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg) {
videoChoice = game_cfg->video;
languageChoice = game_cfg->language;
ocarinaChoice = game_cfg->ocarina;
viChoice = game_cfg->vipatch;
fix002 = game_cfg->errorfix002;
iosChoice = game_cfg->ios;
} else {
videoChoice = Settings.video;
languageChoice = Settings.language;
ocarinaChoice = Settings.ocarina;
viChoice = Settings.vpatch;
if(Settings.cios == ios222) {
iosChoice = i222;
} else {
iosChoice = i249;
}
fix002 = off;
}
int ios2;
switch(iosChoice) {
case i249:
ios2 = 249;
break;
case i222:
ios2 = 222;
break;
default:
ios2 = 249;
break;
}
if(networkisinitialized == 1 || (iosChoice == i249 && Settings.cios == 1) || (iosChoice == i222 && Settings.cios == 0)) {
/*Needed for IOS Reload */
ResumeGui();
ret = Sys_IosReload(ios2);
if(ret < 0) {
Sys_IosReload(249);
exit(0);
}
}
ret = Disc_SetUSB(header->id, GetPartition());
if(ret < 0) Sys_BackToLoader();
ret = Disc_Open();
if(ret < 0) Sys_BackToLoader();
SDCard_deInit();
USBDevice_deInit();
u8 errorfixer002 = 0;
switch(fix002)
@ -2146,7 +2002,7 @@ int MainMenu(int menu)
break;
}
int ret = 0;
mload_close();
ret = Disc_WiiBoot(videoselected, cheat, vipatch, Settings.patchcountrystrings, errorfixer002);
if (ret < 0) {
Sys_LoadMenu();

494
source/mload.c Normal file
View File

@ -0,0 +1,494 @@
/* mload.c (for PPC) (c) 2009, Hermes
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "mload.h"
#include "ehcmodule.h"
#include "dip_plugin.h"
static const char mload_fs[] ATTRIBUTE_ALIGN(32) = "/dev/mload";
static u32 patch_datas[8] ATTRIBUTE_ALIGN(32);
static s32 mload_fd = -1;
/*--------------------------------------------------------------------------------------------------------------*/
// to init/test if the device is running
int mload_init()
{
int n;
if(mload_fd>=0) return 0;
for(n=0;n<10;n++) // try 2.5 seconds
{
mload_fd=IOS_Open(mload_fs, 0);
if(mload_fd>=0) break;
usleep(250*1000);
}
return mload_fd;
}
/*--------------------------------------------------------------------------------------------------------------*/
// to close the device (remember call it when rebooting the IOS!)
int mload_close()
{
int ret;
if(mload_fd<0) return -1;
ret=IOS_Close(mload_fd);
mload_fd=-1;
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// to get the thread id of mload
int mload_get_thread_id()
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_MLOAD_THREAD_ID, ":");
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// get the base and the size of the memory readable/writable to load modules
int mload_get_load_base(u32 *starlet_base, int *size)
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_GET_LOAD_BASE, ":ii",starlet_base, size);
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// load and run a module from starlet (it need to allocate MEM2 to send the elf file)
// the module must be a elf made with stripios
int mload_module(void *addr, int len)
{
int ret;
void *buf=NULL;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(len+0x800);
if(hid<0) return hid;
buf= iosAlloc(hid, len);
if(!buf) {ret= -1;goto out;}
memcpy(buf, addr,len);
ret = IOS_IoctlvFormat(hid, mload_fd, MLOAD_LOAD_MODULE, ":d", buf, len);
if(ret<0) goto out;
ret=IOS_IoctlvFormat(hid, mload_fd, MLOAD_RUN_MODULE, ":");
if(ret<0) {ret= -666;goto out;}
out:
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// load a module from the PPC
// the module must be a elf made with stripios
int mload_elf(void *my_elf, data_elf *data_elf)
{
int n,m;
int p;
u8 *adr;
u32 elf=(u32) my_elf;
if(elf & 3) return -1; // aligned to 4 please!
elfheader *head=(void *) elf;
elfphentry *entries;
if(head->ident0!=0x7F454C46) return -1;
if(head->ident1!=0x01020161) return -1;
if(head->ident2!=0x01000000) return -1;
p=head->phoff;
data_elf->start=(void *) head->entry;
for(n=0; n<head->phnum; n++)
{
entries=(void *) (elf+p);
p+=sizeof(elfphentry);
if(entries->type == 4)
{
adr=(void *) (elf + entries->offset);
if(getbe32(0)!=0) return -2; // bad info (sure)
for(m=4; m < entries->memsz; m+=8)
{
switch(getbe32(m))
{
case 0x9:
data_elf->start= (void *) getbe32(m+4);
break;
case 0x7D:
data_elf->prio= getbe32(m+4);
break;
case 0x7E:
data_elf->size_stack= getbe32(m+4);
break;
case 0x7F:
data_elf->stack= (void *) (getbe32(m+4));
break;
}
}
}
else
if(entries->type == 1 && entries->memsz != 0 && entries->vaddr!=0)
{
if(mload_memset((void *) entries->vaddr, 0, entries->memsz)<0) return -1;
if(mload_seek(entries->vaddr, SEEK_SET)<0) return -1;
if(mload_write((void *) (elf + entries->offset), entries->filesz)<0) return -1;
}
}
return 0;
}
/*--------------------------------------------------------------------------------------------------------------*/
// run one thread (you can use to load modules or binary files)
int mload_run_thread(void *starlet_addr, void *starlet_top_stack, int stack_size, int priority)
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_RUN_THREAD, "iiii:", starlet_addr,starlet_top_stack, stack_size, priority);
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// stops one starlet thread
int mload_stop_thread(int id)
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_STOP_THREAD, "i:", id);
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// continue one stopped starlet thread
int mload_continue_thread(int id)
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_CONTINUE_THREAD, "i:", id);
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// fix starlet address to read/write (uses SEEK_SET, etc as mode)
int mload_seek(int offset, int mode)
{
if(mload_init()<0) return -1;
return IOS_Seek(mload_fd, offset, mode);
}
/*--------------------------------------------------------------------------------------------------------------*/
// read bytes from starlet (it update the offset)
int mload_read(void* buf, u32 size)
{
if(mload_init()<0) return -1;
return IOS_Read(mload_fd, buf, size);
}
/*--------------------------------------------------------------------------------------------------------------*/
// write bytes from starlet (it update the offset)
int mload_write(const void * buf, u32 size)
{
if(mload_init()<0) return -1;
return IOS_Write(mload_fd, buf, size);
}
/*--------------------------------------------------------------------------------------------------------------*/
// fill a block (similar to memset)
int mload_memset(void *starlet_addr, int set, int len)
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_MEMSET, "iii:", starlet_addr, set, len);
iosDestroyHeap(hid);
return ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// get the ehci datas ( ehcmodule.elf uses this address)
void * mload_get_ehci_data()
{
int ret;
s32 hid = -1;
if(mload_init()<0) return NULL;
hid = iosCreateHeap(0x800);
if(hid<0) return NULL;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_GET_EHCI_DATA, ":");
if(ret<0) return NULL;
iosDestroyHeap(hid);
return (void *) ret;
}
/*--------------------------------------------------------------------------------------------------------------*/
// set the dev/es ioctlv in routine
int mload_set_ES_ioctlv_vector(void *starlet_addr)
{
int ret;
s32 hid = -1;
if(mload_init()<0) return -1;
hid = iosCreateHeap(0x800);
if(hid<0) return hid;
ret= IOS_IoctlvFormat(hid, mload_fd, MLOAD_SET_ES_IOCTLV, "i:", starlet_addr);
iosDestroyHeap(hid);
return ret;
}
static u32 ios_36[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022DDAC, // dvd_read_controlling_data
0x20201010+1, // handle_di_cmd_reentry (thumb)
0x20200b9c+1, // ios_shared_alloc_aligned (thumb)
0x20200b70+1, // ios_shared_free (thumb)
0x20205dc0+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202b4c+1, // ios_doReadHashEncryptedState (thumb)
0x20203934+1, // ios_printf (thumb)
};
static u32 ios_38[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022cdac, // dvd_read_controlling_data
0x20200d38+1, // handle_di_cmd_reentry (thumb)
0x202008c4+1, // ios_shared_alloc_aligned (thumb)
0x20200898+1, // ios_shared_free (thumb)
0x20205b80+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202874+1, // ios_doReadHashEncryptedState (thumb)
0x2020365c+1, // ios_printf (thumb)
};
int load_ehc_module() {
int is_ios=0;
if(mload_module(ehcmodule, size_ehcmodule)<0) return -1;
usleep(350*1000);
// Test for IOS
mload_seek(0x20207c84, SEEK_SET);
mload_read(patch_datas, 4);
if(patch_datas[0]==0x6e657665)
{
is_ios=38;
}
else
{
is_ios=36;
}
if(is_ios==36)
{
// IOS 36
memcpy(ios_36, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_36, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20209040, SEEK_SET);
mload_write(ios_36, 4);
}
if(is_ios==38)
{
// IOS 38
memcpy(ios_38, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_38, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20208030, SEEK_SET);
mload_write(ios_38, 4);
}
mload_close();
return 0;
}
int patch_cios_data() {
patch_datas[0]=*((u32 *) (dip_plugin+16*4));
mload_set_ES_ioctlv_vector((void *) patch_datas[0]);
return 1;
}

194
source/mload.h Normal file
View File

@ -0,0 +1,194 @@
/* mload.c (for PPC) (c) 2009, Hermes
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __MLOAD_H__
#define __MLOAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ogcsys.h>
#include <gccore.h>
#include "unistd.h"
#define MLOAD_MLOAD_THREAD_ID 0x4D4C4400
#define MLOAD_LOAD_MODULE 0x4D4C4480
#define MLOAD_RUN_MODULE 0x4D4C4481
#define MLOAD_RUN_THREAD 0x4D4C4482
#define MLOAD_STOP_THREAD 0x4D4C4484
#define MLOAD_CONTINUE_THREAD 0x4D4C4485
#define MLOAD_GET_LOAD_BASE 0x4D4C4490
#define MLOAD_MEMSET 0x4D4C4491
#define MLOAD_GET_EHCI_DATA 0x4D4C44A0
#define MLOAD_SET_ES_IOCTLV 0x4D4C44B0
#ifdef __cplusplus
extern "C" {
#endif
// from IOS ELF stripper of neimod
#define getbe32(x) ((adr[x]<<24) | (adr[x+1]<<16) | (adr[x+2]<<8) | (adr[x+3]))
typedef struct
{
u32 ident0;
u32 ident1;
u32 ident2;
u32 ident3;
u32 machinetype;
u32 version;
u32 entry;
u32 phoff;
u32 shoff;
u32 flags;
u16 ehsize;
u16 phentsize;
u16 phnum;
u16 shentsize;
u16 shnum;
u16 shtrndx;
} elfheader;
typedef struct
{
u32 type;
u32 offset;
u32 vaddr;
u32 paddr;
u32 filesz;
u32 memsz;
u32 flags;
u32 align;
} elfphentry;
typedef struct
{
void *start;
int prio;
void *stack;
int size_stack;
} data_elf;
/*--------------------------------------------------------------------------------------------------------------*/
// to init/test if the device is running
int mload_init();
/*--------------------------------------------------------------------------------------------------------------*/
// to close the device (remember call it when rebooting the IOS!)
int mload_close();
/*--------------------------------------------------------------------------------------------------------------*/
// to get the thread id of mload
int mload_get_thread_id();
/*--------------------------------------------------------------------------------------------------------------*/
// get the base and the size of the memory readable/writable to load modules
int mload_get_load_base(u32 *starlet_base, int *size);
/*--------------------------------------------------------------------------------------------------------------*/
// load and run a module from starlet (it need to allocate MEM2 to send the elf file)
// the module must be a elf made with stripios
int mload_module(void *addr, int len);
/*--------------------------------------------------------------------------------------------------------------*/
// load a module from the PPC
// the module must be a elf made with stripios
int mload_elf(void *my_elf, data_elf *data_elf);
/*--------------------------------------------------------------------------------------------------------------*/
// run one thread (you can use to load modules or binary files)
int mload_run_thread(void *starlet_addr, void *starlet_top_stack, int stack_size, int priority);
/*--------------------------------------------------------------------------------------------------------------*/
// stops one starlet thread
int mload_stop_thread(int id);
/*--------------------------------------------------------------------------------------------------------------*/
// continue one stopped starlet thread
int mload_continue_thread(int id);
/*--------------------------------------------------------------------------------------------------------------*/
// fix starlet address to read/write (uses SEEK_SET, etc as mode)
int mload_seek(int offset, int mode);
/*--------------------------------------------------------------------------------------------------------------*/
// read bytes from starlet (it update the offset)
int mload_read(void* buf, u32 size);
/*--------------------------------------------------------------------------------------------------------------*/
// write bytes from starlet (it update the offset)
int mload_write(const void * buf, u32 size);
/*--------------------------------------------------------------------------------------------------------------*/
// fill a block (similar to memset)
int mload_memset(void *starlet_addr, int set, int len);
/*--------------------------------------------------------------------------------------------------------------*/
// get the ehci datas ( ehcmodule.elf uses this address)
void * mload_get_ehci_data();
/*--------------------------------------------------------------------------------------------------------------*/
// set the dev/es ioctlv in routine
int mload_set_ES_ioctlv_vector(void *starlet_addr);
/*--------------------------------------------------------------------------------------------------------------*/
int load_ehc_module();
#ifdef __cplusplus
}
#endif
#endif

View File

@ -11,6 +11,7 @@
#include "audio.h"
#include "menu.h"
#include "fatmounter.h"
#include "mload.h"
/* Constants */
#define CERTS_LEN 0x280
@ -59,6 +60,8 @@ static void _ExitApp()
SDCard_deInit();
USBDevice_deInit();
mload_set_ES_ioctlv_vector(NULL);
mload_close();
}
@ -81,12 +84,13 @@ int Sys_IosReload(int IOS)
WPAD_Disconnect(0);
WPAD_Shutdown();
USBStorage_Deinit();
WDVD_Close();
USBStorage_Deinit();
ret = IOS_ReloadIOS(IOS);
if(IOS == 222) load_ehc_module();
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
@ -96,13 +100,17 @@ int Sys_IosReload(int IOS)
return ret;
}
if(IOS == 249 || IOS == 222 || IOS == 223) {
if(IOS == 249 || IOS == 222) {
ret = WBFS_Init(WBFS_DEVICE_USB);
if(ret>=0)
{
ret = Disc_Init();
int i = 0;
if(ret>=0)
ret = WBFS_Open();
for(i = 0; i < 4; i++) {
ret = WBFS_Open2(i);
if(ret == 0) break;
}
}
}
//reinitialize SD and USB
@ -110,7 +118,6 @@ int Sys_IosReload(int IOS)
USBDevice_Init();
return ret;
}

View File

@ -33,12 +33,14 @@ distribution.
/* IOCTL commands */
#define UMS_BASE (('U'<<24)|('M'<<16)|('S'<<8))
#define USB_IOCTL_UMS_INIT (UMS_BASE+0x1)
#define USB_IOCTL_UMS_INIT (UMS_BASE+0x1)
#define USB_IOCTL_UMS_GET_CAPACITY (UMS_BASE+0x2)
#define USB_IOCTL_UMS_READ_SECTORS (UMS_BASE+0x3)
#define USB_IOCTL_UMS_WRITE_SECTORS (UMS_BASE+0x4)
#define USB_IOCTL_UMS_READ_STRESS (UMS_BASE+0x5)
#define USB_IOCTL_UMS_SET_VERBOSE (UMS_BASE+0x6)
#define USB_IOCTL_UMS_WRITE_SECTORS (UMS_BASE+0x4)
#define USB_IOCTL_UMS_READ_STRESS (UMS_BASE+0x5)
#define USB_IOCTL_UMS_SET_VERBOSE (UMS_BASE+0x6)
#define USB_IOCTL_UMS_UNMOUNT (UMS_BASE+0x10)
#define USB_IOCTL_UMS_WATCHDOG (UMS_BASE+0x80)
#define UMS_HEAPSIZE 0x10000
@ -94,7 +96,8 @@ s32 USBStorage_Init(void)
return fd;
/* Initialize USB storage */
IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_INIT, ":");
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_INIT, ":");
if(ret<0) goto err;
/* Get device capacity */
ret = USBStorage_GetCapacity(NULL);
@ -120,6 +123,20 @@ void USBStorage_Deinit(void)
IOS_Close(fd);
fd = -1;
}
}
/** Hermes **/
s32 USBStorage_Watchdog(u32 on_off)
{
if (fd >= 0) {
s32 ret;
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_WATCHDOG, "i:", on_off);
return ret;
}
return IPC_ENOENT;
}
s32 USBStorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)

View File

@ -8,7 +8,8 @@ extern "C"
/* Prototypes */
s32 USBStorage_GetCapacity(u32 *);
s32 USBStorage_Init(void);
void USBStorage_Deinit(void);
void USBStorage_Deinit(void);
s32 USBStorage_Watchdog(u32 on_off);
s32 USBStorage_ReadSectors(u32, u32, void *);
s32 USBStorage_WriteSectors(u32, u32, const void *);
extern const DISC_INTERFACE __io_wiiums;

View File

@ -21,7 +21,8 @@ static wbfs_t *hdd = NULL;
/* WBFS callbacks */
static rw_sector_callback_t readCallback = NULL;
static rw_sector_callback_t writeCallback = NULL;
static rw_sector_callback_t writeCallback = NULL;
static int current_partition = 0;
/* Variables */
@ -74,6 +75,35 @@ void __WBFS_Spinner(s32 x, s32 max)
wbfs_t *GetHddInfo(void)
{
return hdd;
}
s32 WBFS_Open2(int index) // index 0-3
{
u32 lba;
/* Close hard disk */
if (hdd)
wbfs_close(hdd);hdd=0;
lba = wbfs_get_partition_LBA(index);
current_partition = index & 3;
if(lba==0xFFFFFFFF)
{
if((index & 3)==0) return WBFS_Open();
return -1;
}
/* Open hard disk */
hdd = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, 0, lba, 0);
if (!hdd)
return -1;
return 0;
}
s32 GetPartition()
{
return current_partition;
}
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)

View File

@ -19,8 +19,10 @@ enum {
/* Prototypes */
s32 WBFS_Init(u32);
s32 WBFS_Open(void);
s32 WBFS_Init(u32);
s32 WBFS_Open();
s32 WBFS_Open2(int partition);
s32 GetPartition();
s32 WBFS_Close(void);
s32 WBFS_Format(u32, u32);
s32 WBFS_GetCount(u32 *);

View File

@ -16,9 +16,12 @@
#define IOCTL_DI_STOPLASER 0xD2
#define IOCTL_DI_OFFSET 0xD9
#define IOCTL_DI_STOPMOTOR 0xE3
#define IOCTL_DI_SETUSBMODE 0xF4
#define IOCTL_DI_SETWBFSMODE 0xfe
#define IOCTL_DI_SETUSBMODE 0xF4
#define IOCTL_DI_DISABLERESET 0xF6
/** Hermes IOS222 **/
#define DI_SETWBFSMODE 0xfe
#define DI_SETOFFSETBASE 0xf1
/* Variables */
static u32 inbuf[8] ATTRIBUTE_ALIGN(32);
@ -27,7 +30,6 @@ static u32 outbuf[8] ATTRIBUTE_ALIGN(32);
static const char di_fs[] ATTRIBUTE_ALIGN(32) = "/dev/di";
static s32 di_fd = -1;
s32 WDVD_Init(void)
{
/* Open "/dev/di" */
@ -106,6 +108,13 @@ s32 WDVD_Seek(u64 offset)
inbuf[1] = (u32)(offset >> 2);
ret = IOS_Ioctl(di_fd, IOCTL_DI_SEEK, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if(ret!=1)
{
// Try old cIOS 222
/* Drive seek */
inbuf[0] = DI_SETOFFSETBASE << 24;
ret = IOS_Ioctl(di_fd, DI_SETOFFSETBASE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
}
if (ret < 0)
return ret;
@ -163,45 +172,45 @@ s32 WDVD_StopMotor(void)
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_OpenPartition(u64 offset)
{
u8 *vector = NULL;
u32 *buffer = NULL;
s32 ret;
/* Allocate memory */
buffer = (u32 *)memalign(32, 0x5000);
if (!buffer)
return -1;
/* Set vector pointer */
vector = (u8 *)buffer;
memset(buffer, 0, 0x5000);
/* Open partition */
buffer[0] = (u32)(buffer + 0x10);
buffer[1] = 0x20;
buffer[3] = 0x024A;
buffer[6] = (u32)(buffer + 0x380);
buffer[7] = 0x49E4;
buffer[8] = (u32)(buffer + 0x360);
buffer[9] = 0x20;
buffer[(0x40 >> 2)] = IOCTL_DI_OPENPART << 24;
buffer[(0x40 >> 2) + 1] = offset >> 2;
ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)vector);
/* Free memory */
free(buffer);
if (ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
s32 WDVD_OpenPartition(u64 offset)
{
u8 *vector = NULL;
u32 *buffer = NULL;
s32 ret;
/* Allocate memory */
buffer = (u32 *)memalign(32, 0x5000);
if (!buffer)
return -1;
/* Set vector pointer */
vector = (u8 *)buffer;
memset(buffer, 0, 0x5000);
/* Open partition */
buffer[0] = (u32)(buffer + 0x10);
buffer[1] = 0x20;
buffer[3] = 0x024A;
buffer[6] = (u32)(buffer + 0x380);
buffer[7] = 0x49E4;
buffer[8] = (u32)(buffer + 0x360);
buffer[9] = 0x20;
buffer[(0x40 >> 2)] = IOCTL_DI_OPENPART << 24;
buffer[(0x40 >> 2) + 1] = offset >> 2;
ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)vector);
/* Free memory */
free(buffer);
if (ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_ClosePartition(void)
@ -311,28 +320,36 @@ s32 WDVD_DisableReset(u8 val)
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_SetUSBMode(u8 *id, int ios222)
{
s32 ret;
memset(inbuf, 0, sizeof(inbuf));
/** Hermes **/
s32 WDVD_SetUSBMode(u8 *id, s32 partition)
{
s32 ret;
memset(inbuf, 0, sizeof(inbuf));
/* Set USB mode */
if(ios222 == 1) {
inbuf[0] = IOCTL_DI_SETWBFSMODE << 24;
} else {
inbuf[0] = IOCTL_DI_SETUSBMODE << 24;
}
inbuf[1] = (id) ? 1 : 0;
/* Copy ID */
if (id)
memcpy(&inbuf[2], id, 6);
ret = IOS_Ioctl(di_fd, IOCTL_DI_SETUSBMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
inbuf[1] = (id) ? 1 : 0;
/* Copy ID */
if (id)
{
memcpy(&inbuf[2], id, 6);
inbuf[5] = partition;
}
ret = IOS_Ioctl(di_fd, IOCTL_DI_SETUSBMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if(ret!=1)
{ // Try old cIOS 222
/* Set USB mode */
inbuf[0] = DI_SETWBFSMODE << 24;
ret = IOS_Ioctl(di_fd, DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
}
if (ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}

View File

@ -23,7 +23,7 @@ s32 WDVD_Read(void *, u32, u64);
s32 WDVD_WaitForDisc(void);
s32 WDVD_GetCoverStatus(u32 *);
s32 WDVD_DisableReset(u8);
s32 WDVD_SetUSBMode(u8 *, int ios222);
s32 WDVD_SetUSBMode(u8 *, s32);
#ifdef __cplusplus
}